Constant folding support for calls to umul.with.overflow(), basically identical to...
[oota-llvm.git] / test / Transforms / ConstProp / overflow-ops.ll
1 ; RUN: opt < %s -constprop -S | FileCheck %s
2
3 %i8i1 = type {i8, i1}
4
5 declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)
6 declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
7 declare {i8, i1} @llvm.umul.with.overflow.i8(i8, i8)
8
9 declare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8)
10 declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8)
11 declare {i8, i1} @llvm.smul.with.overflow.i8(i8, i8)
12
13 ;;-----------------------------
14 ;; uadd
15 ;;-----------------------------
16
17 define {i8, i1} @uadd_1() nounwind {
18 entry:
19   %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100)
20   ret {i8, i1} %t
21
22 ; CHECK: @uadd_1
23 ; CHECK: ret %i8i1 { i8 -114, i1 false }
24 }
25
26 define {i8, i1} @uadd_2() nounwind {
27 entry:
28   %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120)
29   ret {i8, i1} %t
30
31 ; CHECK: @uadd_2
32 ; CHECK: ret %i8i1 { i8 6, i1 true }
33 }
34
35 ;;-----------------------------
36 ;; usub
37 ;;-----------------------------
38
39 define {i8, i1} @usub_1() nounwind {
40 entry:
41   %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2)
42   ret {i8, i1} %t
43
44 ; CHECK: @usub_1
45 ; CHECK: ret %i8i1 { i8 2, i1 false }
46 }
47
48 define {i8, i1} @usub_2() nounwind {
49 entry:
50   %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6)
51   ret {i8, i1} %t
52
53 ; CHECK: @usub_2
54 ; CHECK: ret %i8i1 { i8 -2, i1 true }
55 }
56
57 ;;-----------------------------
58 ;; umul
59 ;;-----------------------------
60
61 define {i8, i1} @umul_1() nounwind {
62 entry:
63   %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 3)
64   ret {i8, i1} %t
65
66 ; CHECK: @umul_1
67 ; CHECK: ret %i8i1 { i8 44, i1 true }
68 }
69
70 define {i8, i1} @umul_2() nounwind {
71 entry:
72   %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 2)
73   ret {i8, i1} %t
74
75 ; CHECK: @umul_2
76 ; CHECK: ret %i8i1 { i8 -56, i1 false }
77 }
78
79 ;;-----------------------------
80 ;; sadd
81 ;;-----------------------------
82
83 define {i8, i1} @sadd_1() nounwind {
84 entry:
85   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2)
86   ret {i8, i1} %t
87
88 ; CHECK: @sadd_1
89 ; CHECK: ret %i8i1 { i8 44, i1 false }
90 }
91
92 define {i8, i1} @sadd_2() nounwind {
93 entry:
94   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10)
95   ret {i8, i1} %t
96
97 ; CHECK: @sadd_2
98 ; CHECK: ret %i8i1 { i8 -126, i1 true }
99 }
100
101 define {i8, i1} @sadd_3() nounwind {
102 entry:
103   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10)
104   ret {i8, i1} %t
105
106 ; CHECK: @sadd_3
107 ; CHECK: ret %i8i1 { i8 -110, i1 false }
108 }
109
110 define {i8, i1} @sadd_4() nounwind {
111 entry:
112   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10)
113   ret {i8, i1} %t
114
115 ; CHECK: @sadd_4
116 ; CHECK: ret %i8i1 { i8 126, i1 true }
117 }
118
119 define {i8, i1} @sadd_5() nounwind {
120 entry:
121   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10)
122   ret {i8, i1} %t
123
124 ; CHECK: @sadd_5
125 ; CHECK: ret %i8i1 { i8 -8, i1 false }
126 }
127
128
129 ;;-----------------------------
130 ;; ssub
131 ;;-----------------------------
132
133 define {i8, i1} @ssub_1() nounwind {
134 entry:
135   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2)
136   ret {i8, i1} %t
137
138 ; CHECK: @ssub_1
139 ; CHECK: ret %i8i1 { i8 2, i1 false }
140 }
141
142 define {i8, i1} @ssub_2() nounwind {
143 entry:
144   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6)
145   ret {i8, i1} %t
146
147 ; CHECK: @ssub_2
148 ; CHECK: ret %i8i1 { i8 -2, i1 false }
149 }
150
151 define {i8, i1} @ssub_3() nounwind {
152 entry:
153   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120)
154   ret {i8, i1} %t
155
156 ; CHECK: @ssub_3
157 ; CHECK: ret %i8i1 { i8 126, i1 true }
158 }
159
160 define {i8, i1} @ssub_3b() nounwind {
161 entry:
162   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10)
163   ret {i8, i1} %t
164
165 ; CHECK: @ssub_3b
166 ; CHECK: ret %i8i1 { i8 -20, i1 false }
167 }
168
169 define {i8, i1} @ssub_4() nounwind {
170 entry:
171   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10)
172   ret {i8, i1} %t
173
174 ; CHECK: @ssub_4
175 ; CHECK: ret %i8i1 { i8 -126, i1 true }
176 }
177
178 define {i8, i1} @ssub_4b() nounwind {
179 entry:
180   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10)
181   ret {i8, i1} %t
182
183 ; CHECK: @ssub_4b
184 ; CHECK: ret %i8i1 { i8 30, i1 false }
185 }
186
187 define {i8, i1} @ssub_5() nounwind {
188 entry:
189   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10)
190   ret {i8, i1} %t
191
192 ; CHECK: @ssub_5
193 ; CHECK: ret %i8i1 { i8 -10, i1 false }
194 }
195
196 ;;-----------------------------
197 ;; smul
198 ;;-----------------------------
199
200 ; rdar://8501501
201 define {i8, i1} @smul_1() nounwind {
202 entry:
203   %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 -10)
204   ret {i8, i1} %t
205
206 ; CHECK: @smul_1
207 ; CHECK: ret %i8i1 { i8 -56, i1 true }
208 }