Skip to content

Commit ae29bfe

Browse files
committed
!fixup move code to getOptionalSinkBlockForInst.
1 parent 6b52481 commit ae29bfe

File tree

2 files changed

+22
-20
lines changed

2 files changed

+22
-20
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5413,18 +5413,6 @@ bool InstCombinerImpl::tryToSinkInstruction(Instruction *I,
54135413
return false;
54145414
}
54155415

5416-
// Do not sink if there are dereferenceable assumes that would be removed.
5417-
for (User *User : I->users()) {
5418-
auto *CI = dyn_cast<CallInst>(User);
5419-
if (!CI || CI->getParent() == DestBlock)
5420-
continue;
5421-
5422-
if (CI->getIntrinsicID() == Intrinsic::assume &&
5423-
CI->getOperandBundle("dereferenceable")) {
5424-
return false;
5425-
}
5426-
}
5427-
54285416
I->dropDroppableUses([&](const Use *U) {
54295417
auto *I = dyn_cast<Instruction>(U->getUser());
54305418
if (I && I->getParent() != DestBlock) {
@@ -5636,8 +5624,15 @@ bool InstCombinerImpl::run() {
56365624

56375625
for (Use &U : I->uses()) {
56385626
User *User = U.getUser();
5639-
if (User->isDroppable())
5640-
continue;
5627+
if (User->isDroppable()) {
5628+
// Do not sink if there are dereferenceable assumes that would be
5629+
// removed.
5630+
auto II = dyn_cast<IntrinsicInst>(User);
5631+
if (II->getIntrinsicID() != Intrinsic::assume ||
5632+
!II->getOperandBundle("dereferenceable"))
5633+
continue;
5634+
}
5635+
56415636
if (NumUsers > MaxSinkNumUsers)
56425637
return std::nullopt;
56435638

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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
;
102109
entry:

0 commit comments

Comments
 (0)