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