When removing a function from the function set and adding it to deferred, we
[llvm.git] / test / Transforms / InstSimplify / reassociate.ll
blob3c8169e5e283ff9e7e95337ad18fc3e9efdb998f
1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
3 define i32 @add1(i32 %x) {
4 ; CHECK: @add1
5 ; (X + -1) + 1 -> X
6   %l = add i32 %x, -1
7   %r = add i32 %l, 1
8   ret i32 %r
9 ; CHECK: ret i32 %x
12 define i32 @and1(i32 %x, i32 %y) {
13 ; CHECK: @and1
14 ; (X & Y) & X -> X & Y
15   %l = and i32 %x, %y
16   %r = and i32 %l, %x
17   ret i32 %r
18 ; CHECK: ret i32 %l
21 define i32 @and2(i32 %x, i32 %y) {
22 ; CHECK: @and2
23 ; X & (X & Y) -> X & Y
24   %r = and i32 %x, %y
25   %l = and i32 %x, %r
26   ret i32 %l
27 ; CHECK: ret i32 %r
30 define i32 @or1(i32 %x, i32 %y) {
31 ; CHECK: @or1
32 ; (X | Y) | X -> X | Y
33   %l = or i32 %x, %y
34   %r = or i32 %l, %x
35   ret i32 %r
36 ; CHECK: ret i32 %l
39 define i32 @or2(i32 %x, i32 %y) {
40 ; CHECK: @or2
41 ; X | (X | Y) -> X | Y
42   %r = or i32 %x, %y
43   %l = or i32 %x, %r
44   ret i32 %l
45 ; CHECK: ret i32 %r
48 define i32 @xor1(i32 %x, i32 %y) {
49 ; CHECK: @xor1
50 ; (X ^ Y) ^ X = Y
51   %l = xor i32 %x, %y
52   %r = xor i32 %l, %x
53   ret i32 %r
54 ; CHECK: ret i32 %y
57 define i32 @xor2(i32 %x, i32 %y) {
58 ; CHECK: @xor2
59 ; X ^ (X ^ Y) = Y
60   %r = xor i32 %x, %y
61   %l = xor i32 %x, %r
62   ret i32 %l
63 ; CHECK: ret i32 %y
66 define i32 @sub1(i32 %x, i32 %y) {
67 ; CHECK: @sub1
68   %d = sub i32 %x, %y
69   %r = sub i32 %x, %d
70   ret i32 %r
71 ; CHECK: ret i32 %y
74 define i32 @sub2(i32 %x) {
75 ; CHECK: @sub2
76 ; X - (X + 1) -> -1
77   %xp1 = add i32 %x, 1
78   %r = sub i32 %x, %xp1
79   ret i32 %r
80 ; CHECK: ret i32 -1
83 define i32 @sub3(i32 %x, i32 %y) {
84 ; CHECK: @sub3
85 ; ((X + 1) + Y) - (Y + 1) -> X
86   %xp1 = add i32 %x, 1
87   %lhs = add i32 %xp1, %y
88   %rhs = add i32 %y, 1
89   %r = sub i32 %lhs, %rhs
90   ret i32 %r
91 ; CHECK: ret i32 %x
94 define i32 @sdiv1(i32 %x, i32 %y) {
95 ; CHECK: @sdiv1
96 ; (no overflow X * Y) / Y -> X
97   %mul = mul nsw i32 %x, %y
98   %r = sdiv i32 %mul, %y
99   ret i32 %r
100 ; CHECK: ret i32 %x
103 define i32 @sdiv2(i32 %x, i32 %y) {
104 ; CHECK: @sdiv2
105 ; (((X / Y) * Y) / Y) -> X / Y
106   %div = sdiv i32 %x, %y
107   %mul = mul i32 %div, %y
108   %r = sdiv i32 %mul, %y
109   ret i32 %r
110 ; CHECK: ret i32 %div
113 define i32 @sdiv3(i32 %x, i32 %y) {
114 ; CHECK: @sdiv3
115 ; (X rem Y) / Y -> 0
116   %rem = srem i32 %x, %y
117   %div = sdiv i32 %rem, %y
118   ret i32 %div
119 ; CHECK: ret i32 0
122 define i32 @sdiv4(i32 %x, i32 %y) {
123 ; CHECK: @sdiv4
124 ; (X / Y) * Y -> X if the division is exact
125   %div = sdiv exact i32 %x, %y
126   %mul = mul i32 %div, %y
127   ret i32 %mul
128 ; CHECK: ret i32 %x
131 define i32 @sdiv5(i32 %x, i32 %y) {
132 ; CHECK: @sdiv5
133 ; Y * (X / Y) -> X if the division is exact
134   %div = sdiv exact i32 %x, %y
135   %mul = mul i32 %y, %div
136   ret i32 %mul
137 ; CHECK: ret i32 %x
141 define i32 @udiv1(i32 %x, i32 %y) {
142 ; CHECK: @udiv1
143 ; (no overflow X * Y) / Y -> X
144   %mul = mul nuw i32 %x, %y
145   %r = udiv i32 %mul, %y
146   ret i32 %r
147 ; CHECK: ret i32 %x
150 define i32 @udiv2(i32 %x, i32 %y) {
151 ; CHECK: @udiv2
152 ; (((X / Y) * Y) / Y) -> X / Y
153   %div = udiv i32 %x, %y
154   %mul = mul i32 %div, %y
155   %r = udiv i32 %mul, %y
156   ret i32 %r
157 ; CHECK: ret i32 %div
160 define i32 @udiv3(i32 %x, i32 %y) {
161 ; CHECK: @udiv3
162 ; (X rem Y) / Y -> 0
163   %rem = urem i32 %x, %y
164   %div = udiv i32 %rem, %y
165   ret i32 %div
166 ; CHECK: ret i32 0
169 define i32 @udiv4(i32 %x, i32 %y) {
170 ; CHECK: @udiv4
171 ; (X / Y) * Y -> X if the division is exact
172   %div = udiv exact i32 %x, %y
173   %mul = mul i32 %div, %y
174   ret i32 %mul
175 ; CHECK: ret i32 %x
178 define i32 @udiv5(i32 %x, i32 %y) {
179 ; CHECK: @udiv5
180 ; Y * (X / Y) -> X if the division is exact
181   %div = udiv exact i32 %x, %y
182   %mul = mul i32 %y, %div
183   ret i32 %mul
184 ; CHECK: ret i32 %x