Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -S | FileCheck %s
      2 
      3 ; With left shift, the comparison should not be modified.
      4 ; CHECK-LABEL: @test_shift_and_cmp_not_changed1(
      5 ; CHECK: icmp slt i8 %andp, 32
      6 define i1 @test_shift_and_cmp_not_changed1(i8 %p) #0 {
      7 entry:
      8   %shlp = shl i8 %p, 5
      9   %andp = and i8 %shlp, -64
     10   %cmp = icmp slt i8 %andp, 32
     11   ret i1 %cmp
     12 }
     13 
     14 ; With arithmetic right shift, the comparison should not be modified.
     15 ; CHECK-LABEL: @test_shift_and_cmp_not_changed2(
     16 ; CHECK: icmp slt i8 %andp, 32
     17 define i1 @test_shift_and_cmp_not_changed2(i8 %p) #0 {
     18 entry:
     19   %shlp = ashr i8 %p, 5
     20   %andp = and i8 %shlp, -64
     21   %cmp = icmp slt i8 %andp, 32
     22   ret i1 %cmp
     23 }
     24 
     25 ; This should simplify functionally to the left shift case.
     26 ; The extra input parameter should be optimized away.
     27 ; CHECK-LABEL: @test_shift_and_cmp_changed1(
     28 ; CHECK:  %andp = shl i8 %p, 5
     29 ; CHECK-NEXT: %shl = and i8 %andp, -64
     30 ; CHECK-NEXT:  %cmp = icmp slt i8 %shl, 32
     31 define i1 @test_shift_and_cmp_changed1(i8 %p, i8 %q) #0 {
     32 entry:
     33   %andp = and i8 %p, 6
     34   %andq = and i8 %q, 8
     35   %or = or i8 %andq, %andp
     36   %shl = shl i8 %or, 5
     37   %ashr = ashr i8 %shl, 5
     38   %cmp = icmp slt i8 %ashr, 1
     39   ret i1 %cmp
     40 }
     41 
     42 ; Unsigned compare allows a transformation to compare against 0.
     43 ; CHECK-LABEL: @test_shift_and_cmp_changed2(
     44 ; CHECK: icmp eq i8 %andp, 0
     45 define i1 @test_shift_and_cmp_changed2(i8 %p) #0 {
     46 entry:
     47   %shlp = shl i8 %p, 5
     48   %andp = and i8 %shlp, -64
     49   %cmp = icmp ult i8 %andp, 32
     50   ret i1 %cmp
     51 }
     52 
     53 ; nsw on the shift should not affect the comparison.
     54 ; CHECK-LABEL: @test_shift_and_cmp_changed3(
     55 ; CHECK: icmp slt i8 %andp, 32
     56 define i1 @test_shift_and_cmp_changed3(i8 %p) #0 {
     57 entry:
     58   %shlp = shl nsw i8 %p, 5
     59   %andp = and i8 %shlp, -64
     60   %cmp = icmp slt i8 %andp, 32
     61   ret i1 %cmp
     62 }
     63 
     64 ; Logical shift right allows a return true because the 'and' guarantees no bits are set.
     65 ; CHECK-LABEL: @test_shift_and_cmp_changed4(
     66 ; CHECK: ret i1 true
     67 define i1 @test_shift_and_cmp_changed4(i8 %p) #0 {
     68 entry:
     69   %shlp = lshr i8 %p, 5
     70   %andp = and i8 %shlp, -64
     71   %cmp = icmp slt i8 %andp, 32
     72   ret i1 %cmp
     73 }
     74 
     75