Skip to content

Commit c8ab3a8

Browse files
[InstCombine] Combine trunc (lshr X, BW-1) to i1 --> icmp slt X, 0 (#142593)
1 parent 55e87ba commit c8ab3a8

File tree

1 file changed

+43
-51
lines changed

1 file changed

+43
-51
lines changed
Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,60 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
33

4-
define i1 @foo_pos1(i32 %i, ptr %p) {
5-
; CHECK-LABEL: define i1 @foo_pos1(
4+
define i1 @test1(i32 %i, ptr %p) {
5+
; CHECK-LABEL: define i1 @test1(
66
; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
7-
; CHECK-NEXT: [[COMMON_RET1:.*:]]
87
; CHECK-NEXT: [[DOTLOBIT:%.*]] = lshr i32 [[I]], 31
98
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
109
; CHECK-NEXT: ret i1 false
1110
;
12-
common.ret1:
13-
%.lobit = lshr i32 %i, 31
14-
%t = trunc nuw i32 %.lobit to i1
11+
%lobit = lshr i32 %i, 31
12+
%t = trunc nuw i32 %lobit to i1
1513
%b = icmp slt i32 %i, 0
16-
%not. = xor i1 %t, true
17-
%common.ret1.op = select i1 %not., i1 %b, i1 false
18-
store i32 %.lobit, ptr %p, align 1
19-
ret i1 %common.ret1.op
14+
%not = xor i1 %t, true
15+
%op = select i1 %not, i1 %b, i1 false
16+
store i32 %lobit, ptr %p, align 1
17+
ret i1 %op
2018
}
2119

22-
define i1 @foo_pos2(i32 %i, ptr %p) {
23-
; CHECK-LABEL: define i1 @foo_pos2(
20+
define i1 @test2(i32 %i, ptr %p) {
21+
; CHECK-LABEL: define i1 @test2(
2422
; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
25-
; CHECK-NEXT: [[COMMON_RET1:.*:]]
2623
; CHECK-NEXT: [[DOTLOBIT:%.*]] = ashr i32 [[I]], 31
2724
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
2825
; CHECK-NEXT: ret i1 false
2926
;
30-
common.ret1:
31-
%.lobit = ashr i32 %i, 31
32-
%t = trunc nuw i32 %.lobit to i1
27+
%lobit = ashr i32 %i, 31
28+
%t = trunc nuw i32 %lobit to i1
3329
%b = icmp slt i32 %i, 0
34-
%not. = xor i1 %t, true
35-
%common.ret1.op = select i1 %not., i1 %b, i1 false
36-
store i32 %.lobit, ptr %p, align 1
37-
ret i1 %common.ret1.op
30+
%not = xor i1 %t, true
31+
%op = select i1 %not, i1 %b, i1 false
32+
store i32 %lobit, ptr %p, align 1
33+
ret i1 %op
3834
}
3935

40-
define i1 @foo_pos3(i32 %i, ptr %p, ptr %q) {
41-
; CHECK-LABEL: define i1 @foo_pos3(
36+
define i1 @test3(i32 %i, ptr %p, ptr %q) {
37+
; CHECK-LABEL: define i1 @test3(
4238
; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) {
43-
; CHECK-NEXT: [[COMMON_RET1:.*:]]
4439
; CHECK-NEXT: [[DOTLOBIT:%.*]] = lshr i32 [[I]], 31
4540
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
4641
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[Q]], align 1
4742
; CHECK-NEXT: ret i1 false
4843
;
49-
common.ret1:
50-
%.lobit = lshr i32 %i, 31
51-
%t = trunc nuw i32 %.lobit to i1
44+
%lobit = lshr i32 %i, 31
45+
%t = trunc nuw i32 %lobit to i1
5246
%b = icmp slt i32 %i, 0
53-
%not. = xor i1 %t, true
54-
%common.ret1.op = select i1 %not., i1 %b, i1 false
55-
store i32 %.lobit, ptr %p, align 1
56-
store i32 %.lobit, ptr %q, align 1
57-
ret i1 %common.ret1.op
47+
%not = xor i1 %t, true
48+
%op = select i1 %not, i1 %b, i1 false
49+
store i32 %lobit, ptr %p, align 1
50+
store i32 %lobit, ptr %q, align 1
51+
ret i1 %op
5852
}
5953

60-
define i1 @foo_neg1(i32 %i, ptr %p) {
61-
; CHECK-LABEL: define i1 @foo_neg1(
54+
; Negative Test
55+
define i1 @test4(i32 %i, ptr %p) {
56+
; CHECK-LABEL: define i1 @test4(
6257
; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
63-
; CHECK-NEXT: [[COMMON_RET1:.*:]]
6458
; CHECK-NEXT: [[DOTLOBIT:%.*]] = lshr i32 [[I]], 30
6559
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[DOTLOBIT]] to i1
6660
; CHECK-NEXT: [[B:%.*]] = icmp slt i32 [[I]], 0
@@ -69,20 +63,19 @@ define i1 @foo_neg1(i32 %i, ptr %p) {
6963
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
7064
; CHECK-NEXT: ret i1 [[COMMON_RET1_OP]]
7165
;
72-
common.ret1:
73-
%.lobit = lshr i32 %i, 30
74-
%t = trunc nuw i32 %.lobit to i1
66+
%lobit = lshr i32 %i, 30 ; should not fold as no. of bits shifted < BitWidth - 1
67+
%t = trunc nuw i32 %lobit to i1
7568
%b = icmp slt i32 %i, 0
76-
%not. = xor i1 %t, true
77-
%common.ret1.op = select i1 %not., i1 %b, i1 false
78-
store i32 %.lobit, ptr %p, align 1
79-
ret i1 %common.ret1.op
69+
%not = xor i1 %t, true
70+
%op = select i1 %not, i1 %b, i1 false
71+
store i32 %lobit, ptr %p, align 1
72+
ret i1 %op
8073
}
8174

82-
define i1 @foo_neg2(i32 %i, ptr %p) {
83-
; CHECK-LABEL: define i1 @foo_neg2(
75+
; Negative Test
76+
define i1 @test5(i32 %i, ptr %p) {
77+
; CHECK-LABEL: define i1 @test5(
8478
; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
85-
; CHECK-NEXT: [[COMMON_RET1:.*:]]
8679
; CHECK-NEXT: [[DOTLOBIT:%.*]] = ashr i32 [[I]], 30
8780
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[DOTLOBIT]] to i1
8881
; CHECK-NEXT: [[B:%.*]] = icmp slt i32 [[I]], 0
@@ -91,13 +84,12 @@ define i1 @foo_neg2(i32 %i, ptr %p) {
9184
; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
9285
; CHECK-NEXT: ret i1 [[COMMON_RET1_OP]]
9386
;
94-
common.ret1:
95-
%.lobit = ashr i32 %i, 30
96-
%t = trunc nuw i32 %.lobit to i1
87+
%lobit = ashr i32 %i, 30 ; should not fold as no. of bits shifted < BitWidth - 1
88+
%t = trunc nuw i32 %lobit to i1
9789
%b = icmp slt i32 %i, 0
98-
%not. = xor i1 %t, true
99-
%common.ret1.op = select i1 %not., i1 %b, i1 false
100-
store i32 %.lobit, ptr %p, align 1
101-
ret i1 %common.ret1.op
90+
%not = xor i1 %t, true
91+
%op = select i1 %not, i1 %b, i1 false
92+
store i32 %lobit, ptr %p, align 1
93+
ret i1 %op
10294
}
10395

0 commit comments

Comments
 (0)