Home | History | Annotate | Download | only in InstCombine
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; Vary legal integer types in data layout.
      3 ; RUN: opt < %s -instcombine -S -default-data-layout=n32    | FileCheck %s --check-prefix=ALL --check-prefix=CHECK32
      4 ; RUN: opt < %s -instcombine -S -default-data-layout=n32:64 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK64
      5 
      6 ; In all cases, the data-layout is irrelevant. We should shrink as much as possible in InstCombine
      7 ; and allow the backend to expand as much as needed to ensure optimal codegen for any target.
      8 
      9 define i32 @positive1(i64 %a) {
     10 ; ALL-LABEL: @positive1(
     11 ; ALL:         switch i32
     12 ; ALL-NEXT:    i32 10, label %return
     13 ; ALL-NEXT:    i32 100, label %sw.bb1
     14 ; ALL-NEXT:    i32 1001, label %sw.bb2
     15 ; ALL-NEXT:    ]
     16 ;
     17 entry:
     18   %and = and i64 %a, 4294967295
     19   switch i64 %and, label %sw.default [
     20   i64 10, label %return
     21   i64 100, label %sw.bb1
     22   i64 1001, label %sw.bb2
     23   ]
     24 
     25 sw.bb1:
     26   br label %return
     27 
     28 sw.bb2:
     29   br label %return
     30 
     31 sw.default:
     32   br label %return
     33 
     34 return:
     35   %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
     36   ret i32 %retval.0
     37 }
     38 
     39 define i32 @negative1(i64 %a) {
     40 ; ALL-LABEL: @negative1(
     41 ; ALL:         switch i32
     42 ; ALL-NEXT:    i32 -10, label %return
     43 ; ALL-NEXT:    i32 -100, label %sw.bb1
     44 ; ALL-NEXT:    i32 -1001, label %sw.bb2
     45 ; ALL-NEXT:    ]
     46 ;
     47 entry:
     48   %or = or i64 %a, -4294967296
     49   switch i64 %or, label %sw.default [
     50   i64 -10, label %return
     51   i64 -100, label %sw.bb1
     52   i64 -1001, label %sw.bb2
     53   ]
     54 
     55 sw.bb1:
     56   br label %return
     57 
     58 sw.bb2:
     59   br label %return
     60 
     61 sw.default:
     62   br label %return
     63 
     64 return:
     65   %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
     66   ret i32 %retval.0
     67 }
     68 
     69 ; Make sure truncating a constant int larger than 64-bit doesn't trigger an
     70 ; assertion.
     71 
     72 define i32 @trunc72to68(i72 %a) {
     73 ; ALL-LABEL: @trunc72to68(
     74 ; ALL:         switch i68
     75 ; ALL-NEXT:    i68 10, label %return
     76 ; ALL-NEXT:    i68 100, label %sw.bb1
     77 ; ALL-NEXT:    i68 1001, label %sw.bb2
     78 ; ALL-NEXT:    ]
     79 ;
     80 entry:
     81   %and = and i72 %a, 295147905179352825855
     82   switch i72 %and, label %sw.default [
     83   i72 10, label %return
     84   i72 100, label %sw.bb1
     85   i72 1001, label %sw.bb2
     86   ]
     87 
     88 sw.bb1:
     89   br label %return
     90 
     91 sw.bb2:
     92   br label %return
     93 
     94 sw.default:
     95   br label %return
     96 
     97 return:
     98   %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
     99   ret i32 %retval.0
    100 }
    101 
    102 ; Make sure to avoid assertion crashes and use the type before
    103 ; truncation to generate the sub constant expressions that leads
    104 ; to the recomputed condition.
    105 
    106 define void @trunc64to59(i64 %a) {
    107 ; ALL-LABEL: @trunc64to59(
    108 ; ALL:         switch i59
    109 ; ALL-NEXT:    i59 0, label %sw.bb1
    110 ; ALL-NEXT:    i59 18717182647723699, label %sw.bb2
    111 ; ALL-NEXT:    ]
    112 ;
    113 entry:
    114   %tmp0 = and i64 %a, 15
    115   %tmp1 = mul i64 %tmp0, -6425668444178048401
    116   %tmp2 = add i64 %tmp1, 5170979678563097242
    117   %tmp3 = mul i64 %tmp2, 1627972535142754813
    118   switch i64 %tmp3, label %sw.default [
    119   i64 847514119312061490, label %sw.bb1
    120   i64 866231301959785189, label %sw.bb2
    121   ]
    122 
    123 sw.bb1:
    124   br label %sw.default
    125 
    126 sw.bb2:
    127   br label %sw.default
    128 
    129 sw.default:
    130   ret void
    131 }
    132