Skip to content

Commit 61ba00e

Browse files
committed
Add baseline tests for upcoming patch
1 parent a4baf2c commit 61ba00e

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3+
4+
@a = external global i1
5+
@b = external global i32
6+
@c = external global i8
7+
@v = external global <2 x i8>
8+
9+
declare void @llvm.assume(i1)
10+
11+
define void @assume_store_i1(i1 %x) {
12+
; CHECK-LABEL: define void @assume_store_i1(
13+
; CHECK-SAME: i1 [[X:%.*]]) {
14+
; CHECK-NEXT: store i1 [[X]], ptr @a, align 1
15+
; CHECK-NEXT: call void @llvm.assume(i1 [[X]])
16+
; CHECK-NEXT: ret void
17+
;
18+
store i1 %x, ptr @a, align 1
19+
call void @llvm.assume(i1 %x)
20+
ret void
21+
}
22+
23+
define void @assume_store_i1_not(i1 %x) {
24+
; CHECK-LABEL: define void @assume_store_i1_not(
25+
; CHECK-SAME: i1 [[X:%.*]]) {
26+
; CHECK-NEXT: store i1 [[X]], ptr @a, align 1
27+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[X]], true
28+
; CHECK-NEXT: call void @llvm.assume(i1 [[NOT]])
29+
; CHECK-NEXT: ret void
30+
;
31+
store i1 %x, ptr @a, align 1
32+
%not = xor i1 %x, true
33+
call void @llvm.assume(i1 %not)
34+
ret void
35+
}
36+
37+
define i1 @assume_store_i1_xor(ptr %G) {
38+
; CHECK-LABEL: define i1 @assume_store_i1_xor(
39+
; CHECK-SAME: ptr [[G:%.*]]) {
40+
; CHECK-NEXT: [[L:%.*]] = load i1, ptr [[G]], align 1
41+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[L]], true
42+
; CHECK-NEXT: store i1 [[XOR]], ptr @a, align 1
43+
; CHECK-NEXT: call void @llvm.assume(i1 [[XOR]])
44+
; CHECK-NEXT: ret i1 [[XOR]]
45+
;
46+
%L = load i1, ptr %G, align 1
47+
%xor = xor i1 %L, true
48+
store i1 %xor, ptr @a, align 1
49+
call void @llvm.assume(i1 %xor)
50+
ret i1 %xor
51+
}
52+
53+
define void @assume_store_i32_eq(i32 %x) {
54+
; CHECK-LABEL: define void @assume_store_i32_eq(
55+
; CHECK-SAME: i32 [[X:%.*]]) {
56+
; CHECK-NEXT: store i32 [[X]], ptr @b, align 4
57+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 10
58+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
59+
; CHECK-NEXT: ret void
60+
;
61+
store i32 %x, ptr @b, align 4
62+
%cmp = icmp eq i32 %x, 10
63+
call void @llvm.assume(i1 %cmp)
64+
ret void
65+
}
66+
67+
define void @unreachable_implies_false(i8 %x) {
68+
; CHECK-LABEL: define void @unreachable_implies_false(
69+
; CHECK-SAME: i8 [[X:%.*]]) {
70+
; CHECK-NEXT: [[RET:.*:]]
71+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 5
72+
; CHECK-NEXT: store i1 [[CMP]], ptr @a, align 1
73+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CMP]], true
74+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
75+
; CHECK-NEXT: ret void
76+
;
77+
; Original code before `simplifycfg` from #134992:
78+
; %cmp = icmp ugt i8 %x, 5
79+
; store i1 %cmp, ptr @a, align 1
80+
; br i1 %cmp, label %ub, label %ret
81+
; ret:
82+
; ret void
83+
; ub:
84+
; unreachable
85+
ret:
86+
%cmp = icmp ugt i8 %x, 5
87+
store i1 %cmp, ptr @a, align 1
88+
%0 = xor i1 %cmp, true
89+
call void @llvm.assume(i1 %0)
90+
ret void
91+
}
92+
93+
; Negative test: assume does not make the store value constant.
94+
define void @assume_store_i8_nonconstant(i8 %x) {
95+
; CHECK-LABEL: define void @assume_store_i8_nonconstant(
96+
; CHECK-SAME: i8 [[X:%.*]]) {
97+
; CHECK-NEXT: store i8 [[X]], ptr @c, align 1
98+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], 0
99+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
100+
; CHECK-NEXT: ret void
101+
;
102+
store i8 %x, ptr @c, align 1
103+
%cmp = icmp ne i8 %x, 0
104+
call void @llvm.assume(i1 %cmp)
105+
ret void
106+
}
107+
108+
; Negative test: volatile stores must not be folded.
109+
define void @assume_store_i1_volatile(i1 %x) {
110+
; CHECK-LABEL: define void @assume_store_i1_volatile(
111+
; CHECK-SAME: i1 [[X:%.*]]) {
112+
; CHECK-NEXT: store volatile i1 [[X]], ptr @a, align 1
113+
; CHECK-NEXT: call void @llvm.assume(i1 [[X]])
114+
; CHECK-NEXT: ret void
115+
;
116+
store volatile i1 %x, ptr @a, align 1
117+
call void @llvm.assume(i1 %x)
118+
ret void
119+
}
120+
121+
; Negative test: non-scalar stores are not folded.
122+
define void @assume_store_vec_noninteger(<2 x i8> %x) {
123+
; CHECK-LABEL: define void @assume_store_vec_noninteger(
124+
; CHECK-SAME: <2 x i8> [[X:%.*]]) {
125+
; CHECK-NEXT: store <2 x i8> [[X]], ptr @v, align 2
126+
; CHECK-NEXT: [[LANE0:%.*]] = extractelement <2 x i8> [[X]], i64 0
127+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[LANE0]], 7
128+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
129+
; CHECK-NEXT: ret void
130+
;
131+
store <2 x i8> %x, ptr @v, align 2
132+
%lane0 = extractelement <2 x i8> %x, i32 0
133+
%cmp = icmp eq i8 %lane0, 7
134+
call void @llvm.assume(i1 %cmp)
135+
ret void
136+
}

0 commit comments

Comments
 (0)