Skip to content

Commit 80ee1cc

Browse files
committed
Add baseline tests for upcoming patch
1 parent a4baf2c commit 80ee1cc

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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+
7+
declare void @llvm.assume(i1)
8+
9+
define void @assume_store_i1(i1 %x) {
10+
; CHECK-LABEL: define void @assume_store_i1(
11+
; CHECK-SAME: i1 [[X:%.*]]) {
12+
; CHECK-NEXT: store i1 [[X]], ptr @a, align 1
13+
; CHECK-NEXT: call void @llvm.assume(i1 [[X]])
14+
; CHECK-NEXT: ret void
15+
;
16+
store i1 %x, ptr @a, align 1
17+
call void @llvm.assume(i1 %x)
18+
ret void
19+
}
20+
21+
define void @assume_store_i1_not(i1 %x) {
22+
; CHECK-LABEL: define void @assume_store_i1_not(
23+
; CHECK-SAME: i1 [[X:%.*]]) {
24+
; CHECK-NEXT: store i1 [[X]], ptr @a, align 1
25+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[X]], true
26+
; CHECK-NEXT: call void @llvm.assume(i1 [[NOT]])
27+
; CHECK-NEXT: ret void
28+
;
29+
store i1 %x, ptr @a, align 1
30+
%not = xor i1 %x, true
31+
call void @llvm.assume(i1 %not)
32+
ret void
33+
}
34+
35+
define i1 @assume_store_i1_xor(ptr %G) {
36+
; CHECK-LABEL: define i1 @assume_store_i1_xor(
37+
; CHECK-SAME: ptr [[G:%.*]]) {
38+
; CHECK-NEXT: [[L:%.*]] = load i1, ptr [[G]], align 1
39+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[L]], true
40+
; CHECK-NEXT: store i1 [[XOR]], ptr @a, align 1
41+
; CHECK-NEXT: call void @llvm.assume(i1 [[XOR]])
42+
; CHECK-NEXT: ret i1 [[XOR]]
43+
;
44+
%L = load i1, ptr %G, align 1
45+
%xor = xor i1 %L, true
46+
store i1 %xor, ptr @a, align 1
47+
call void @llvm.assume(i1 %xor)
48+
ret i1 %xor
49+
}
50+
51+
define void @assume_store_i32_eq(i32 %x) {
52+
; CHECK-LABEL: define void @assume_store_i32_eq(
53+
; CHECK-SAME: i32 [[X:%.*]]) {
54+
; CHECK-NEXT: store i32 [[X]], ptr @b, align 4
55+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 10
56+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
57+
; CHECK-NEXT: ret void
58+
;
59+
store i32 %x, ptr @b, align 4
60+
%cmp = icmp eq i32 %x, 10
61+
call void @llvm.assume(i1 %cmp)
62+
ret void
63+
}
64+
65+
define void @unreachable_implies_false(i8 %x) {
66+
; CHECK-LABEL: define void @unreachable_implies_false(
67+
; CHECK-SAME: i8 [[X:%.*]]) {
68+
; CHECK-NEXT: [[RET:.*:]]
69+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 5
70+
; CHECK-NEXT: store i1 [[CMP]], ptr @a, align 1
71+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CMP]], true
72+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
73+
; CHECK-NEXT: ret void
74+
;
75+
; Original code before `simplifycfg` from #134992:
76+
; %cmp = icmp ugt i8 %x, 5
77+
; store i1 %cmp, ptr @a, align 1
78+
; br i1 %cmp, label %ub, label %ret
79+
; ret:
80+
; ret void
81+
; ub:
82+
; unreachable
83+
ret:
84+
%cmp = icmp ugt i8 %x, 5
85+
store i1 %cmp, ptr @a, align 1
86+
%0 = xor i1 %cmp, true
87+
call void @llvm.assume(i1 %0)
88+
ret void
89+
}

0 commit comments

Comments
 (0)