Skip to content

Commit 0062441

Browse files
committed
[SCCP] Add a few more tests for conditional propagation,XOR.
1 parent ea4ec17 commit 0062441

File tree

3 files changed

+405
-0
lines changed

3 files changed

+405
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -sccp -S | FileCheck %s
3+
4+
; Test some XOR simplifications / range propagation.
5+
define void@xor1(i1 %cmp) {
6+
; CHECK-LABEL: @xor1(
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
9+
; CHECK: if.true:
10+
; CHECK-NEXT: br label [[END]]
11+
; CHECK: end:
12+
; CHECK-NEXT: call void @use(i1 true)
13+
; CHECK-NEXT: call void @use(i1 false)
14+
; CHECK-NEXT: call void @use(i1 false)
15+
; CHECK-NEXT: call void @use(i1 true)
16+
; CHECK-NEXT: ret void
17+
;
18+
entry:
19+
br i1 %cmp, label %if.true, label %end
20+
21+
if.true:
22+
br label %end
23+
24+
end:
25+
%p = phi i32 [ 11, %entry ], [ 11, %if.true]
26+
%xor.1 = xor i32 %p, %p
27+
%c.1 = icmp eq i32 %xor.1, 0
28+
call void @use(i1 %c.1)
29+
%c.2 = icmp eq i32 %xor.1, 10
30+
call void @use(i1 %c.2)
31+
%xor.2 = xor i32 %p, 1
32+
%c.3 = icmp eq i32 %xor.2, 11
33+
call void @use(i1 %c.3)
34+
%c.4 = icmp eq i32 %xor.2, 10
35+
call void @use(i1 %c.4)
36+
ret void
37+
}
38+
39+
declare void @use(i1)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -ipsccp -S %s | FileCheck %s
3+
4+
declare noalias i8* @malloc(i64)
5+
6+
; Make sure we can eliminate `%tmp17 = icmp ult i32 %tmp10, 3`.
7+
8+
declare void @use(i1)
9+
10+
define internal i32* @spam(i32* %arg) {
11+
; CHECK-LABEL: @spam(
12+
; CHECK-NEXT: bb:
13+
; CHECK-NEXT: [[TMP:%.*]] = call i8* @malloc(i64 10368)
14+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[TMP]] to i32*
15+
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i32, i32* [[ARG:%.*]], i32 0
16+
; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 8
17+
; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], 1
18+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 1
19+
; CHECK-NEXT: [[TMP10:%.*]] = icmp ne i32* [[TMP7]], null
20+
; CHECK-NEXT: br i1 [[TMP10]], label [[BB17:%.*]], label [[BB13:%.*]]
21+
; CHECK: bb13:
22+
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 2
23+
; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 8
24+
; CHECK-NEXT: [[TMP16:%.*]] = add i32 [[TMP15]], 1
25+
; CHECK-NEXT: br label [[BB30:%.*]]
26+
; CHECK: bb17:
27+
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i32 [[TMP6]], [[TMP5]]
28+
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 3
29+
; CHECK-NEXT: [[TMP20:%.*]] = load i32, i32* [[TMP19]], align 8
30+
; CHECK-NEXT: br i1 [[TMP18]], label [[BB30]], label [[BB13]]
31+
; CHECK: bb30:
32+
; CHECK-NEXT: ret i32* [[TMP1]]
33+
;
34+
bb:
35+
%tmp = call i8* @malloc(i64 10368)
36+
%tmp1 = bitcast i8* %tmp to i32*
37+
%tmp4 = getelementptr inbounds i32, i32* %arg, i32 0
38+
%tmp5 = load i32, i32* %tmp4, align 8
39+
%tmp6 = add i32 %tmp5, 1
40+
%tmp7 = getelementptr inbounds i32, i32* %arg, i32 1
41+
%tmp10 = icmp ne i32* %tmp7, null
42+
br i1 %tmp10, label %bb17, label %bb13
43+
44+
bb13:
45+
%tmp14 = getelementptr inbounds i32, i32* %arg, i32 2
46+
%tmp15 = load i32, i32* %tmp14, align 8
47+
%tmp16 = add i32 %tmp15, 1
48+
br label %bb30
49+
50+
bb17:
51+
%tmp18 = icmp eq i32 %tmp6, %tmp5
52+
%tmp19 = getelementptr inbounds i32, i32* %arg, i32 3
53+
%tmp20 = load i32, i32* %tmp19, align 8
54+
br i1 %tmp18, label %bb30, label %bb13
55+
56+
bb30:
57+
ret i32* %tmp1
58+
}
59+
60+
define void @spam.1(i32* %arg) {
61+
bb:
62+
%tmp = alloca i8*, align 8
63+
%tmp4 = call i32* @spam(i32* %arg)
64+
br label %bb6
65+
66+
bb6: ; preds = %bb5
67+
%tmp7 = getelementptr inbounds i32, i32* %tmp4, i32 1
68+
%tmp10 = load i32, i32* %tmp7, align 8
69+
%tmp11 = icmp ne i32 %tmp10, 0
70+
br i1 %tmp11, label %bb6, label %bb15
71+
72+
bb15: ; preds = %bb12
73+
%tmp17 = icmp ult i32 %tmp10, 3
74+
call void @use(i1 %tmp17)
75+
br i1 %tmp17, label %bb6, label %bb24
76+
77+
bb24:
78+
ret void
79+
}

0 commit comments

Comments
 (0)