Fix a crash where a utility function wasn't aware of fcmp vectors and created a value...
[oota-llvm.git] / test / Transforms / InstCombine / pr17827.ll
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