Home | History | Annotate | Download | only in IndVarSimplify
      1 ; RUN: opt < %s -indvars -S | FileCheck %s
      2 
      3 define i32 @test.signed.add.0(i32* %array, i32 %length, i32 %init) {
      4 ; CHECK-LABEL: @test.signed.add.0
      5  entry:
      6   %upper = icmp slt i32 %init, %length
      7   br i1 %upper, label %loop, label %exit
      8 
      9  loop:
     10 ; CHECK-LABEL: loop
     11   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
     12   %civ.inc = add i32 %civ, 1
     13 ; CHECK: %civ.inc = add nsw i32 %civ, 1
     14   %cmp = icmp slt i32 %civ.inc, %length
     15   br i1 %cmp, label %latch, label %break
     16 
     17  latch:
     18   store i32 0, i32* %array
     19   %check = icmp slt i32 %civ.inc, %length
     20   br i1 %check, label %loop, label %break
     21 
     22  break:
     23   ret i32 %civ.inc
     24 
     25  exit:
     26   ret i32 42
     27 }
     28 
     29 define i32 @test.signed.add.1(i32* %array, i32 %length, i32 %init) {
     30 ; CHECK-LABEL: @test.signed.add.1
     31  entry:
     32   %upper = icmp sle i32 %init, %length
     33   br i1 %upper, label %loop, label %exit
     34 
     35  loop:
     36 ; CHECK-LABEL: loop
     37   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
     38   %civ.inc = add i32 %civ, 1
     39 ; CHECK: %civ.inc = add i32 %civ, 1
     40   %cmp = icmp slt i32 %civ.inc, %length
     41   br i1 %cmp, label %latch, label %break
     42 
     43  latch:
     44   store i32 0, i32* %array
     45   %check = icmp slt i32 %civ.inc, %length
     46   br i1 %check, label %loop, label %break
     47 
     48  break:
     49   ret i32 %civ.inc
     50 
     51  exit:
     52   ret i32 42
     53 }
     54 
     55 define i32 @test.unsigned.add.0(i32* %array, i32 %length, i32 %init) {
     56 ; CHECK-LABEL: @test.unsigned.add.0
     57  entry:
     58   %upper = icmp ult i32 %init, %length
     59   br i1 %upper, label %loop, label %exit
     60 
     61  loop:
     62 ; CHECK-LABEL: loop
     63   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
     64   %civ.inc = add i32 %civ, 1
     65 ; CHECK: %civ.inc = add nuw i32 %civ, 1
     66   %cmp = icmp slt i32 %civ.inc, %length
     67   br i1 %cmp, label %latch, label %break
     68 
     69  latch:
     70   store i32 0, i32* %array
     71   %check = icmp ult i32 %civ.inc, %length
     72   br i1 %check, label %loop, label %break
     73 
     74  break:
     75   ret i32 %civ.inc
     76 
     77  exit:
     78   ret i32 42
     79 }
     80 
     81 define i32 @test.unsigned.add.1(i32* %array, i32 %length, i32 %init) {
     82 ; CHECK-LABEL: @test.unsigned.add.1
     83  entry:
     84   %upper = icmp ule i32 %init, %length
     85   br i1 %upper, label %loop, label %exit
     86 
     87  loop:
     88 ; CHECK-LABEL: loop
     89   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
     90   %civ.inc = add i32 %civ, 1
     91 ; CHECK: %civ.inc = add i32 %civ, 1
     92   %cmp = icmp slt i32 %civ.inc, %length
     93   br i1 %cmp, label %latch, label %break
     94 
     95  latch:
     96   store i32 0, i32* %array
     97   %check = icmp ult i32 %civ.inc, %length
     98   br i1 %check, label %loop, label %break
     99 
    100  break:
    101   ret i32 %civ.inc
    102 
    103  exit:
    104   ret i32 42
    105 }
    106 
    107 define hidden void @test.shl.exact.equal() {
    108 ; CHECK-LABEL: @test.shl.exact.equal
    109 entry:
    110   br label %for.body
    111 
    112 for.body:
    113 ; CHECK-LABEL: for.body
    114   %k.021 = phi i32 [ 1, %entry ], [ %inc, %for.body ]
    115   %shl = shl i32 1, %k.021
    116   %shr1 = ashr i32 %shl, 1
    117 ; CHECK: %shr1 = ashr exact i32 %shl, 1
    118   %shr2 = lshr i32 %shl, 1
    119 ; CHECK: %shr2 = lshr exact i32 %shl, 1
    120   %inc = add nuw nsw i32 %k.021, 1
    121   %exitcond = icmp eq i32 %inc, 9
    122   br i1 %exitcond, label %for.end, label %for.body
    123 
    124 for.end:
    125   ret void
    126 }
    127 
    128 define hidden void @test.shl.exact.greater() {
    129 ; CHECK-LABEL: @test.shl.exact.greater
    130 entry:
    131   br label %for.body
    132 
    133 for.body:
    134 ; CHECK-LABEL: for.body
    135   %k.021 = phi i32 [ 3, %entry ], [ %inc, %for.body ]
    136   %shl = shl i32 1, %k.021
    137   %shr1 = ashr i32 %shl, 2
    138 ; CHECK: %shr1 = ashr exact i32 %shl, 2
    139   %shr2 = lshr i32 %shl, 2
    140 ; CHECK: %shr2 = lshr exact i32 %shl, 2
    141   %inc = add nuw nsw i32 %k.021, 1
    142   %exitcond = icmp eq i32 %inc, 9
    143   br i1 %exitcond, label %for.end, label %for.body
    144 
    145 for.end:
    146   ret void
    147 }
    148 
    149 define hidden void @test.shl.exact.unbound(i32 %arg) {
    150 ; CHECK-LABEL: @test.shl.exact.unbound
    151 entry:
    152   br label %for.body
    153 
    154 for.body:
    155 ; CHECK-LABEL: for.body
    156   %k.021 = phi i32 [ 2, %entry ], [ %inc, %for.body ]
    157   %shl = shl i32 1, %k.021
    158   %shr1 = ashr i32 %shl, 2
    159 ; CHECK: %shr1 = ashr exact i32 %shl, 2
    160   %shr2 = lshr i32 %shl, 2
    161 ; CHECK: %shr2 = lshr exact i32 %shl, 2
    162   %inc = add nuw nsw i32 %k.021, 1
    163   %exitcond = icmp eq i32 %inc, %arg
    164   br i1 %exitcond, label %for.end, label %for.body
    165 
    166 for.end:
    167   ret void
    168 }
    169 
    170 define hidden void @test.shl.nonexact() {
    171 ; CHECK-LABEL: @test.shl.nonexact
    172 entry:
    173   br label %for.body
    174 
    175 for.body:
    176 ; CHECK-LABEL: for.body
    177   %k.021 = phi i32 [ 2, %entry ], [ %inc, %for.body ]
    178   %shl = shl i32 1, %k.021
    179   %shr1 = ashr i32 %shl, 3
    180 ; CHECK: %shr1 = ashr i32 %shl, 3
    181   %shr2 = lshr i32 %shl, 3
    182 ; CHECK: %shr2 = lshr i32 %shl, 3
    183   %inc = add nuw nsw i32 %k.021, 1
    184   %exitcond = icmp eq i32 %inc, 9
    185   br i1 %exitcond, label %for.end, label %for.body
    186 
    187 for.end:
    188   ret void
    189 }
    190 
    191 !0 = !{i32 0, i32 2}
    192 !1 = !{i32 0, i32 42}
    193