blob: 13724669d7fe063c25e986b8520de897bbc70f43 [file] [log] [blame]
Duncan Sands566edb02010-12-21 08:49:00 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3define 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
10}
11
12define 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
19}
20
21define 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
28}
29
30define 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
37}
38
39define 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
46}
47
48define 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
55}
56
57define 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
64}
Duncan Sandsc087e202011-01-14 15:26:10 +000065
66define 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
72}
Duncan Sandsb2f3c382011-01-18 11:50:19 +000073
74define 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
81}
82
83define 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
92}
Duncan Sands593faa52011-01-28 16:51:11 +000093
94define 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
101}
102
103define 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
111}
112
113define 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
120}
121
122define i32 @udiv1(i32 %x, i32 %y) {
123; CHECK: @udiv1
124; (no overflow X * Y) / Y -> X
125 %mul = mul nuw i32 %x, %y
126 %r = udiv i32 %mul, %y
127 ret i32 %r
128; CHECK: ret i32 %x
129}
130
131define i32 @udiv2(i32 %x, i32 %y) {
132; CHECK: @udiv2
133; (((X / Y) * Y) / Y) -> X / Y
134 %div = udiv i32 %x, %y
135 %mul = mul i32 %div, %y
136 %r = udiv i32 %mul, %y
137 ret i32 %r
138; CHECK: ret i32 %div
139}
140
141define i32 @udiv3(i32 %x, i32 %y) {
142; CHECK: @udiv3
143; (X rem Y) / Y -> 0
144 %rem = urem i32 %x, %y
145 %div = udiv i32 %rem, %y
146 ret i32 %div
147; CHECK: ret i32 0
148}