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