1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4declare void @use32(i32)
5declare void @use64(i64)
6
7define i1 @highest_bit_test_via_lshr(i32 %data, i32 %nbits) {
8; CHECK-LABEL: @highest_bit_test_via_lshr(
9; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]]
10; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = lshr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]]
11; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
12; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[DATA]], 31
13; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
14; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED]])
15; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
16; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
17; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0
18; CHECK-NEXT:    ret i1 [[ISNEG]]
19;
20  %num_low_bits_to_skip = sub i32 32, %nbits
21  %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip
22  %skip_all_bits_till_signbit = sub i32 %nbits, 1
23  %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit
24
25  call void @use32(i32 %num_low_bits_to_skip)
26  call void @use32(i32 %high_bits_extracted)
27  call void @use32(i32 %skip_all_bits_till_signbit)
28  call void @use32(i32 %signbit)
29
30  %isneg = icmp ne i32 %signbit, 0
31  ret i1 %isneg
32}
33
34define i1 @highest_bit_test_via_lshr_with_truncation(i64 %data, i32 %nbits) {
35; CHECK-LABEL: @highest_bit_test_via_lshr_with_truncation(
36; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]]
37; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64
38; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = lshr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]]
39; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32
40; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
41; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
42; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
43; CHECK-NEXT:    call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]])
44; CHECK-NEXT:    call void @use64(i64 [[HIGH_BITS_EXTRACTED]])
45; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]])
46; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
47; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
48; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0
49; CHECK-NEXT:    ret i1 [[ISNEG]]
50;
51  %num_low_bits_to_skip = sub i32 64, %nbits
52  %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64
53  %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide
54  %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32
55  %skip_all_bits_till_signbit = sub i32 %nbits, 1
56  %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit
57
58  call void @use32(i32 %num_low_bits_to_skip)
59  call void @use64(i64 %num_low_bits_to_skip_wide)
60  call void @use64(i64 %high_bits_extracted)
61  call void @use32(i32 %high_bits_extracted_narrow)
62  call void @use32(i32 %skip_all_bits_till_signbit)
63  call void @use32(i32 %signbit)
64
65  %isneg = icmp ne i32 %signbit, 0
66  ret i1 %isneg
67}
68
69define i1 @highest_bit_test_via_ashr(i32 %data, i32 %nbits) {
70; CHECK-LABEL: @highest_bit_test_via_ashr(
71; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]]
72; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = ashr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]]
73; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
74; CHECK-NEXT:    [[SIGNBIT:%.*]] = ashr i32 [[DATA]], 31
75; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
76; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED]])
77; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
78; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
79; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0
80; CHECK-NEXT:    ret i1 [[ISNEG]]
81;
82  %num_low_bits_to_skip = sub i32 32, %nbits
83  %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip
84  %skip_all_bits_till_signbit = sub i32 %nbits, 1
85  %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit
86
87  call void @use32(i32 %num_low_bits_to_skip)
88  call void @use32(i32 %high_bits_extracted)
89  call void @use32(i32 %skip_all_bits_till_signbit)
90  call void @use32(i32 %signbit)
91
92  %isneg = icmp ne i32 %signbit, 0
93  ret i1 %isneg
94}
95
96define i1 @highest_bit_test_via_ashr_with_truncation(i64 %data, i32 %nbits) {
97; CHECK-LABEL: @highest_bit_test_via_ashr_with_truncation(
98; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]]
99; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64
100; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = ashr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]]
101; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32
102; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
103; CHECK-NEXT:    [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
104; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
105; CHECK-NEXT:    call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]])
106; CHECK-NEXT:    call void @use64(i64 [[HIGH_BITS_EXTRACTED]])
107; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]])
108; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
109; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
110; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0
111; CHECK-NEXT:    ret i1 [[ISNEG]]
112;
113  %num_low_bits_to_skip = sub i32 64, %nbits
114  %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64
115  %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide
116  %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32
117  %skip_all_bits_till_signbit = sub i32 %nbits, 1
118  %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit
119
120  call void @use32(i32 %num_low_bits_to_skip)
121  call void @use64(i64 %num_low_bits_to_skip_wide)
122  call void @use64(i64 %high_bits_extracted)
123  call void @use32(i32 %high_bits_extracted_narrow)
124  call void @use32(i32 %skip_all_bits_till_signbit)
125  call void @use32(i32 %signbit)
126
127  %isneg = icmp ne i32 %signbit, 0
128  ret i1 %isneg
129}
130
131define i1 @highest_bit_test_via_lshr_ashr(i32 %data, i32 %nbits) {
132; CHECK-LABEL: @highest_bit_test_via_lshr_ashr(
133; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]]
134; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = lshr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]]
135; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
136; CHECK-NEXT:    [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
137; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
138; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED]])
139; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
140; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
141; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0
142; CHECK-NEXT:    ret i1 [[ISNEG]]
143;
144  %num_low_bits_to_skip = sub i32 32, %nbits
145  %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip
146  %skip_all_bits_till_signbit = sub i32 %nbits, 1
147  %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit
148
149  call void @use32(i32 %num_low_bits_to_skip)
150  call void @use32(i32 %high_bits_extracted)
151  call void @use32(i32 %skip_all_bits_till_signbit)
152  call void @use32(i32 %signbit)
153
154  %isneg = icmp ne i32 %signbit, 0
155  ret i1 %isneg
156}
157
158define i1 @highest_bit_test_via_lshr_ashe_with_truncation(i64 %data, i32 %nbits) {
159; CHECK-LABEL: @highest_bit_test_via_lshr_ashe_with_truncation(
160; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]]
161; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64
162; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = lshr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]]
163; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32
164; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
165; CHECK-NEXT:    [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
166; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
167; CHECK-NEXT:    call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]])
168; CHECK-NEXT:    call void @use64(i64 [[HIGH_BITS_EXTRACTED]])
169; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]])
170; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
171; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
172; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0
173; CHECK-NEXT:    ret i1 [[ISNEG]]
174;
175  %num_low_bits_to_skip = sub i32 64, %nbits
176  %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64
177  %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide
178  %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32
179  %skip_all_bits_till_signbit = sub i32 %nbits, 1
180  %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit
181
182  call void @use32(i32 %num_low_bits_to_skip)
183  call void @use64(i64 %num_low_bits_to_skip_wide)
184  call void @use64(i64 %high_bits_extracted)
185  call void @use32(i32 %high_bits_extracted_narrow)
186  call void @use32(i32 %skip_all_bits_till_signbit)
187  call void @use32(i32 %signbit)
188
189  %isneg = icmp ne i32 %signbit, 0
190  ret i1 %isneg
191}
192
193define i1 @highest_bit_test_via_ashr_lshr(i32 %data, i32 %nbits) {
194; CHECK-LABEL: @highest_bit_test_via_ashr_lshr(
195; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]]
196; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = ashr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]]
197; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
198; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
199; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
200; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED]])
201; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
202; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
203; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0
204; CHECK-NEXT:    ret i1 [[ISNEG]]
205;
206  %num_low_bits_to_skip = sub i32 32, %nbits
207  %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip
208  %skip_all_bits_till_signbit = sub i32 %nbits, 1
209  %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit
210
211  call void @use32(i32 %num_low_bits_to_skip)
212  call void @use32(i32 %high_bits_extracted)
213  call void @use32(i32 %skip_all_bits_till_signbit)
214  call void @use32(i32 %signbit)
215
216  %isneg = icmp ne i32 %signbit, 0
217  ret i1 %isneg
218}
219
220define i1 @highest_bit_test_via_ashr_lshr_with_truncation(i64 %data, i32 %nbits) {
221; CHECK-LABEL: @highest_bit_test_via_ashr_lshr_with_truncation(
222; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]]
223; CHECK-NEXT:    [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64
224; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED:%.*]] = ashr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]]
225; CHECK-NEXT:    [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32
226; CHECK-NEXT:    [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1
227; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]]
228; CHECK-NEXT:    call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]])
229; CHECK-NEXT:    call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]])
230; CHECK-NEXT:    call void @use64(i64 [[HIGH_BITS_EXTRACTED]])
231; CHECK-NEXT:    call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]])
232; CHECK-NEXT:    call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]])
233; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
234; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0
235; CHECK-NEXT:    ret i1 [[ISNEG]]
236;
237  %num_low_bits_to_skip = sub i32 64, %nbits
238  %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64
239  %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide
240  %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32
241  %skip_all_bits_till_signbit = sub i32 %nbits, 1
242  %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit
243
244  call void @use32(i32 %num_low_bits_to_skip)
245  call void @use64(i64 %num_low_bits_to_skip_wide)
246  call void @use64(i64 %high_bits_extracted)
247  call void @use32(i32 %high_bits_extracted_narrow)
248  call void @use32(i32 %skip_all_bits_till_signbit)
249  call void @use32(i32 %signbit)
250
251  %isneg = icmp ne i32 %signbit, 0
252  ret i1 %isneg
253}
254
255;------------------------------------------------------------------------------;
256
257define i1 @unsigned_sign_bit_extract(i32 %x) {
258; CHECK-LABEL: @unsigned_sign_bit_extract(
259; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[X:%.*]], 0
260; CHECK-NEXT:    ret i1 [[ISNEG]]
261;
262  %signbit = lshr i32 %x, 31
263  %isneg = icmp ne i32 %signbit, 0
264  ret i1 %isneg
265}
266define i1 @unsigned_sign_bit_extract_extrause(i32 %x) {
267; CHECK-LABEL: @unsigned_sign_bit_extract_extrause(
268; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[X:%.*]], 31
269; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
270; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[X]], 0
271; CHECK-NEXT:    ret i1 [[ISNEG]]
272;
273  %signbit = lshr i32 %x, 31
274  call void @use32(i32 %signbit)
275  %isneg = icmp ne i32 %signbit, 0
276  ret i1 %isneg
277}
278define i1 @unsigned_sign_bit_extract_extrause__ispositive(i32 %x) {
279; CHECK-LABEL: @unsigned_sign_bit_extract_extrause__ispositive(
280; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i32 [[X:%.*]], 31
281; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT]])
282; CHECK-NEXT:    [[ISNEG:%.*]] = icmp sgt i32 [[X]], -1
283; CHECK-NEXT:    ret i1 [[ISNEG]]
284;
285  %signbit = lshr i32 %x, 31
286  call void @use32(i32 %signbit)
287  %isneg = icmp eq i32 %signbit, 0
288  ret i1 %isneg
289}
290define i1 @signed_sign_bit_extract(i32 %x) {
291; CHECK-LABEL: @signed_sign_bit_extract(
292; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[X:%.*]], 0
293; CHECK-NEXT:    ret i1 [[ISNEG]]
294;
295  %signsmear = ashr i32 %x, 31
296  %isneg = icmp ne i32 %signsmear, 0
297  ret i1 %isneg
298}
299define i1 @signed_sign_bit_extract_extrause(i32 %x) {
300; CHECK-LABEL: @signed_sign_bit_extract_extrause(
301; CHECK-NEXT:    [[SIGNSMEAR:%.*]] = ashr i32 [[X:%.*]], 31
302; CHECK-NEXT:    call void @use32(i32 [[SIGNSMEAR]])
303; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i32 [[X]], 0
304; CHECK-NEXT:    ret i1 [[ISNEG]]
305;
306  %signsmear = ashr i32 %x, 31
307  call void @use32(i32 %signsmear)
308  %isneg = icmp ne i32 %signsmear, 0
309  ret i1 %isneg
310}
311define i1 @unsigned_sign_bit_extract_with_trunc(i64 %x) {
312; CHECK-LABEL: @unsigned_sign_bit_extract_with_trunc(
313; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[X:%.*]], 0
314; CHECK-NEXT:    ret i1 [[ISNEG]]
315;
316  %signbit = lshr i64 %x, 63
317  %signbit_narrow = trunc i64 %signbit to i32
318  %isneg = icmp ne i32 %signbit_narrow, 0
319  ret i1 %isneg
320}
321define i1 @unsigned_sign_bit_extract_with_trunc_extrause(i64 %x) {
322; CHECK-LABEL: @unsigned_sign_bit_extract_with_trunc_extrause(
323; CHECK-NEXT:    [[SIGNBIT:%.*]] = lshr i64 [[X:%.*]], 63
324; CHECK-NEXT:    call void @use64(i64 [[SIGNBIT]])
325; CHECK-NEXT:    [[SIGNBIT_NARROW:%.*]] = trunc i64 [[SIGNBIT]] to i32
326; CHECK-NEXT:    call void @use32(i32 [[SIGNBIT_NARROW]])
327; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[X]], 0
328; CHECK-NEXT:    ret i1 [[ISNEG]]
329;
330  %signbit = lshr i64 %x, 63
331  call void @use64(i64 %signbit)
332  %signbit_narrow = trunc i64 %signbit to i32
333  call void @use32(i32 %signbit_narrow)
334  %isneg = icmp ne i32 %signbit_narrow, 0
335  ret i1 %isneg
336}
337define i1 @signed_sign_bit_extract_trunc(i64 %x) {
338; CHECK-LABEL: @signed_sign_bit_extract_trunc(
339; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[X:%.*]], 0
340; CHECK-NEXT:    ret i1 [[ISNEG]]
341;
342  %signsmear = ashr i64 %x, 63
343  %signsmear_narrow = trunc i64 %signsmear to i32
344  %isneg = icmp ne i32 %signsmear_narrow, 0
345  ret i1 %isneg
346}
347define i1 @signed_sign_bit_extract_trunc_extrause(i64 %x) {
348; CHECK-LABEL: @signed_sign_bit_extract_trunc_extrause(
349; CHECK-NEXT:    [[SIGNSMEAR:%.*]] = ashr i64 [[X:%.*]], 63
350; CHECK-NEXT:    call void @use64(i64 [[SIGNSMEAR]])
351; CHECK-NEXT:    [[SIGNSMEAR_NARROW:%.*]] = trunc i64 [[SIGNSMEAR]] to i32
352; CHECK-NEXT:    call void @use32(i32 [[SIGNSMEAR_NARROW]])
353; CHECK-NEXT:    [[ISNEG:%.*]] = icmp slt i64 [[X]], 0
354; CHECK-NEXT:    ret i1 [[ISNEG]]
355;
356  %signsmear = ashr i64 %x, 63
357  call void @use64(i64 %signsmear)
358  %signsmear_narrow = trunc i64 %signsmear to i32
359  call void @use32(i32 %signsmear_narrow)
360  %isneg = icmp ne i32 %signsmear_narrow, 0
361  ret i1 %isneg
362}
363