Home | History | Annotate | Download | only in IndVarSimplify
      1 ; RUN: opt -S -indvars < %s | FileCheck %s
      2 
      3 ; Check that we replace signed comparisons between non-negative values with
      4 ; unsigned comparisons if we can.
      5 
      6 target datalayout = "n8:16:32:64"
      7 
      8 define i32 @test_01(i32 %a, i32 %b, i32* %p) {
      9 
     10 ; CHECK-LABEL: @test_01(
     11 ; CHECK-NOT:   icmp slt
     12 ; CHECK:       %cmp1 = icmp ult i32 %iv, 100
     13 ; CHECK:       %cmp2 = icmp ult i32 %iv, 100
     14 ; CHECK-NOT:   %cmp3
     15 ; CHECK:       %exitcond = icmp ne i32 %iv.next, 1000
     16 
     17 entry:
     18   br label %loop.entry
     19 
     20 loop.entry:
     21   %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.be ]
     22   %cmp1 = icmp slt i32 %iv, 100
     23   br i1 %cmp1, label %b1, label %b2
     24 
     25 b1:
     26   store i32 %iv, i32* %p
     27   br label %merge
     28 
     29 b2:
     30   store i32 %a, i32* %p
     31   br label %merge
     32 
     33 merge:
     34   %cmp2 = icmp ult i32 %iv, 100
     35   br i1 %cmp2, label %b3, label %b4
     36 
     37 b3:
     38   store i32 %iv, i32* %p
     39   br label %loop.be
     40 
     41 b4:
     42   store i32 %b, i32* %p
     43   br label %loop.be
     44 
     45 loop.be:
     46   %iv.next = add i32 %iv, 1
     47   %cmp3 = icmp slt i32 %iv.next, 1000
     48   br i1 %cmp3, label %loop.entry, label %exit
     49 
     50 exit:
     51   ret i32 %iv
     52 }
     53 
     54 define i32 @test_02(i32 %a, i32 %b, i32* %p) {
     55 
     56 ; CHECK-LABEL: @test_02(
     57 ; CHECK-NOT:   icmp sgt
     58 ; CHECK:       %cmp1 = icmp ugt i32 100, %iv
     59 ; CHECK:       %cmp2 = icmp ugt i32 100, %iv
     60 ; CHECK-NOT:   %cmp3
     61 ; CHECK:       %exitcond = icmp ne i32 %iv.next, 1000
     62 
     63 entry:
     64   br label %loop.entry
     65 
     66 loop.entry:
     67   %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.be ]
     68   %cmp1 = icmp sgt i32 100, %iv
     69   br i1 %cmp1, label %b1, label %b2
     70 
     71 b1:
     72   store i32 %iv, i32* %p
     73   br label %merge
     74 
     75 b2:
     76   store i32 %a, i32* %p
     77   br label %merge
     78 
     79 merge:
     80   %cmp2 = icmp ugt i32 100, %iv
     81   br i1 %cmp2, label %b3, label %b4
     82 
     83 b3:
     84   store i32 %iv, i32* %p
     85   br label %loop.be
     86 
     87 b4:
     88   store i32 %b, i32* %p
     89   br label %loop.be
     90 
     91 loop.be:
     92   %iv.next = add i32 %iv, 1
     93   %cmp3 = icmp sgt i32 1000, %iv.next
     94   br i1 %cmp3, label %loop.entry, label %exit
     95 
     96 exit:
     97   ret i32 %iv
     98 }
     99