Skip to content

Commit bff824e

Browse files
committed
[InstCombine] Add extra tests.
1 parent a0e222f commit bff824e

File tree

1 file changed

+94
-5
lines changed

1 file changed

+94
-5
lines changed

llvm/test/Transforms/InstCombine/sink-dereferenceable-assume.ll

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
22
; RUN: opt -p instcombine -S %s | FileCheck %s
33

4-
define i64 @test_sink_with_dereferenceable_assume(ptr %p, ptr %q, i1 %cond) {
5-
; CHECK-LABEL: define i64 @test_sink_with_dereferenceable_assume(
6-
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[COND:%.*]]) {
4+
define i64 @test_dereferenceable_assume(ptr %p, ptr %q, i1 %c.0) {
5+
; CHECK-LABEL: define i64 @test_dereferenceable_assume(
6+
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {
77
; CHECK-NEXT: [[ENTRY:.*:]]
8-
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
8+
; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]
99
; CHECK: [[THEN]]:
1010
; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
1111
; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
@@ -19,7 +19,7 @@ entry:
1919
%q_int = ptrtoint ptr %q to i64
2020
%diff = sub i64 %q_int, %p_int
2121
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]
22-
br i1 %cond, label %then, label %else
22+
br i1 %c.0, label %then, label %else
2323

2424
then:
2525
ret i64 %diff
@@ -28,4 +28,93 @@ else:
2828
ret i64 0
2929
}
3030

31+
define i64 @test_sink_with_dereferenceable_assume_same_block_as_user(ptr %p, ptr %q, i1 %c.0) {
32+
; CHECK-LABEL: define i64 @test_sink_with_dereferenceable_assume_same_block_as_user(
33+
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {
34+
; CHECK-NEXT: [[ENTRY:.*:]]
35+
; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]
36+
; CHECK: [[THEN]]:
37+
; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
38+
; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
39+
; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
40+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]
41+
; CHECK-NEXT: ret i64 [[DIFF]]
42+
; CHECK: [[ELSE]]:
43+
; CHECK-NEXT: ret i64 0
44+
;
45+
entry:
46+
%p_int = ptrtoint ptr %p to i64
47+
%q_int = ptrtoint ptr %q to i64
48+
%diff = sub i64 %q_int, %p_int
49+
br i1 %c.0, label %then, label %else
50+
51+
then:
52+
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]
53+
ret i64 %diff
54+
55+
else:
56+
ret i64 0
57+
}
58+
59+
define i64 @test_sink_with_multiple_users_dominated_by_deref(ptr %p, ptr %q, i1 %c.0, i1 %c.1) {
60+
; CHECK-LABEL: define i64 @test_sink_with_multiple_users_dominated_by_deref(
61+
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]], i1 [[C_1:%.*]]) {
62+
; CHECK-NEXT: [[ENTRY:.*:]]
63+
; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]
64+
; CHECK: [[THEN]]:
65+
; CHECK-NEXT: br i1 [[C_1]], label %[[THEN_2:.*]], label %[[ELSE]]
66+
; CHECK: [[THEN_2]]:
67+
; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
68+
; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
69+
; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
70+
; CHECK-NEXT: [[DOUBLED:%.*]] = shl i64 [[DIFF]], 1
71+
; CHECK-NEXT: ret i64 [[DOUBLED]]
72+
; CHECK: [[ELSE]]:
73+
; CHECK-NEXT: ret i64 0
74+
;
75+
entry:
76+
%p_int = ptrtoint ptr %p to i64
77+
%q_int = ptrtoint ptr %q to i64
78+
%diff = sub i64 %q_int, %p_int
79+
br i1 %c.0, label %then, label %else
80+
81+
then:
82+
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]
83+
br i1 %c.1, label %then.2, label %else
84+
85+
then.2:
86+
%doubled = mul i64 %diff, 2
87+
ret i64 %doubled
88+
89+
else:
90+
ret i64 0
91+
}
92+
93+
define i64 @test_deref_user_does_not_dominate_other_user(ptr %p, ptr %q, i1 %c.0) {
94+
; CHECK-LABEL: define i64 @test_deref_user_does_not_dominate_other_user(
95+
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {
96+
; CHECK-NEXT: [[ENTRY:.*:]]
97+
; CHECK-NEXT: br i1 [[C_0]], label %[[MIDDLE:.*]], label %[[EXIT:.*]]
98+
; CHECK: [[MIDDLE]]:
99+
; CHECK-NEXT: br label %[[EXIT]]
100+
; CHECK: [[EXIT]]:
101+
; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
102+
; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
103+
; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
104+
; CHECK-NEXT: ret i64 [[DIFF]]
105+
;
106+
entry:
107+
%p_int = ptrtoint ptr %p to i64
108+
%q_int = ptrtoint ptr %q to i64
109+
%diff = sub i64 %q_int, %p_int
110+
br i1 %c.0, label %middle, label %exit
111+
112+
middle:
113+
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %diff) ]
114+
br label %exit
115+
116+
exit:
117+
ret i64 %diff
118+
}
119+
31120
declare void @llvm.assume(i1 noundef)

0 commit comments

Comments
 (0)