@@ -5,6 +5,11 @@ define i64 @test_dereferenceable_assume(ptr %p, ptr %q, i1 %c.0) {
55; CHECK-LABEL: define i64 @test_dereferenceable_assume(
66; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {
77; CHECK-NEXT: [[ENTRY:.*:]]
8+ ; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
9+ ; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
10+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
11+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]
12+ ; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]
813; CHECK: [[THEN]]:
914; CHECK-NEXT: ret i64 [[DIFF]]
1015; CHECK: [[ELSE]]:
@@ -56,13 +61,14 @@ define i64 @test_sink_with_multiple_users_dominated_by_deref(ptr %p, ptr %q, i1
5661; CHECK-LABEL: define i64 @test_sink_with_multiple_users_dominated_by_deref(
5762; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]], i1 [[C_1:%.*]]) {
5863; CHECK-NEXT: [[ENTRY:.*:]]
64+ ; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
65+ ; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
66+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
5967; CHECK-NEXT: br i1 [[C_0]], label %[[THEN:.*]], label %[[ELSE:.*]]
6068; CHECK: [[THEN]]:
69+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]
6170; CHECK-NEXT: br i1 [[C_1]], label %[[THEN_2:.*]], label %[[ELSE]]
6271; CHECK: [[THEN_2]]:
63- ; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
64- ; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
65- ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
6672; CHECK-NEXT: [[DOUBLED:%.*]] = shl i64 [[DIFF]], 1
6773; CHECK-NEXT: ret i64 [[DOUBLED]]
6874; CHECK: [[ELSE]]:
@@ -90,13 +96,14 @@ define i64 @test_deref_user_does_not_dominate_other_user(ptr %p, ptr %q, i1 %c.0
9096; CHECK-LABEL: define i64 @test_deref_user_does_not_dominate_other_user(
9197; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C_0:%.*]]) {
9298; CHECK-NEXT: [[ENTRY:.*:]]
99+ ; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
100+ ; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
101+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
93102; CHECK-NEXT: br i1 [[C_0]], label %[[MIDDLE:.*]], label %[[EXIT:.*]]
94103; CHECK: [[MIDDLE]]:
104+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[DIFF]]) ]
95105; CHECK-NEXT: br label %[[EXIT]]
96106; CHECK: [[EXIT]]:
97- ; CHECK-NEXT: [[Q_INT:%.*]] = ptrtoint ptr [[Q]] to i64
98- ; CHECK-NEXT: [[P_INT:%.*]] = ptrtoint ptr [[P]] to i64
99- ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[Q_INT]], [[P_INT]]
100107; CHECK-NEXT: ret i64 [[DIFF]]
101108;
102109entry:
0 commit comments