Enhance the "compare with shift" and "compare with div"
[oota-llvm.git] / test / Transforms / InstCombine / exact.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 ; CHECK: @sdiv1
4 ; CHECK: sdiv i32 %x, 8
5 define i32 @sdiv1(i32 %x) {
6   %y = sdiv i32 %x, 8
7   ret i32 %y
8 }
9
10 ; CHECK: @sdiv3
11 ; CHECK: %y = srem i32 %x, 3
12 ; CHECK: %z = sub i32 %x, %y
13 ; CHECK: ret i32 %z
14 define i32 @sdiv3(i32 %x) {
15   %y = sdiv i32 %x, 3
16   %z = mul i32 %y, 3
17   ret i32 %z
18 }
19
20 ; CHECK: @sdiv4
21 ; CHECK: ret i32 %x
22 define i32 @sdiv4(i32 %x) {
23   %y = sdiv exact i32 %x, 3
24   %z = mul i32 %y, 3
25   ret i32 %z
26 }
27
28 ; CHECK: i32 @sdiv5
29 ; CHECK: %y = srem i32 %x, 3
30 ; CHECK: %z = sub i32 %y, %x
31 ; CHECK: ret i32 %z
32 define i32 @sdiv5(i32 %x) {
33   %y = sdiv i32 %x, 3
34   %z = mul i32 %y, -3
35   ret i32 %z
36 }
37
38 ; CHECK: @sdiv6
39 ; CHECK: %z = sub i32 0, %x
40 ; CHECK: ret i32 %z
41 define i32 @sdiv6(i32 %x) {
42   %y = sdiv exact i32 %x, 3
43   %z = mul i32 %y, -3
44   ret i32 %z
45 }
46
47 ; CHECK: @udiv1
48 ; CHECK: ret i32 %x
49 define i32 @udiv1(i32 %x, i32 %w) {
50   %y = udiv exact i32 %x, %w
51   %z = mul i32 %y, %w
52   ret i32 %z
53 }
54
55 ; CHECK: @ashr_icmp
56 ; CHECK: %B = icmp eq i64 %X, 0
57 ; CHECK: ret i1 %B
58 define i1 @ashr_icmp(i64 %X) nounwind {
59   %A = ashr exact i64 %X, 2   ; X/4
60   %B = icmp eq i64 %A, 0
61   ret i1 %B
62 }
63
64 ; CHECK: @udiv_icmp1
65 ; CHECK: icmp ne i64 %X, 0
66 define i1 @udiv_icmp1(i64 %X) nounwind {
67   %A = udiv exact i64 %X, 5   ; X/5
68   %B = icmp ne i64 %A, 0
69   ret i1 %B
70 }
71
72 ; CHECK: @sdiv_icmp1
73 ; CHECK: icmp eq i64 %X, 0
74 define i1 @sdiv_icmp1(i64 %X) nounwind {
75   %A = sdiv exact i64 %X, 5   ; X/5 == 0 --> x == 0
76   %B = icmp eq i64 %A, 0
77   ret i1 %B
78 }
79
80 ; CHECK: @sdiv_icmp2
81 ; CHECK: icmp eq i64 %X, 5
82 define i1 @sdiv_icmp2(i64 %X) nounwind {
83   %A = sdiv exact i64 %X, 5   ; X/5 == 1 --> x == 5
84   %B = icmp eq i64 %A, 1
85   ret i1 %B
86 }
87
88 ; CHECK: @sdiv_icmp3
89 ; CHECK: icmp eq i64 %X, -5
90 define i1 @sdiv_icmp3(i64 %X) nounwind {
91   %A = sdiv exact i64 %X, 5   ; X/5 == -1 --> x == -5
92   %B = icmp eq i64 %A, -1
93   ret i1 %B
94 }
95
96 ; CHECK: @sdiv_icmp4
97 ; CHECK: icmp eq i64 %X, 0
98 define i1 @sdiv_icmp4(i64 %X) nounwind {
99   %A = sdiv exact i64 %X, -5   ; X/-5 == 0 --> x == 0
100   %B = icmp eq i64 %A, 0
101   ret i1 %B
102 }
103
104 ; CHECK: @sdiv_icmp5
105 ; CHECK: icmp eq i64 %X, -5
106 define i1 @sdiv_icmp5(i64 %X) nounwind {
107   %A = sdiv exact i64 %X, -5   ; X/-5 == 1 --> x == -5
108   %B = icmp eq i64 %A, 1
109   ret i1 %B
110 }
111
112 ; CHECK: @sdiv_icmp6
113 ; CHECK: icmp eq i64 %X, 5
114 define i1 @sdiv_icmp6(i64 %X) nounwind {
115   %A = sdiv exact i64 %X, -5   ; X/-5 == 1 --> x == 5
116   %B = icmp eq i64 %A, -1
117   ret i1 %B
118 }
119