[llvm] f9e4aeb - Revert "[InstCombine] Improve TryToSinkInstruction with multiple uses"
Anna Thomas via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 15 15:03:19 PDT 2021
Author: Anna Thomas
Date: 2021-09-15T18:03:11-04:00
New Revision: f9e4aebe4a7a318869f57852359ad637f5c5a009
URL: https://github.com/llvm/llvm-project/commit/f9e4aebe4a7a318869f57852359ad637f5c5a009
DIFF: https://github.com/llvm/llvm-project/commit/f9e4aebe4a7a318869f57852359ad637f5c5a009.diff
LOG: Revert "[InstCombine] Improve TryToSinkInstruction with multiple uses"
This reverts commit 4ac4e52189aa6d80c3d59dc2c8f7dcc0cb7f9d58.
There are couple of test failures, which needs update of the test cases.
Doing a clean revert and will recommit the change along with fixed
testcases.
Added:
Modified:
llvm/include/llvm/IR/Value.h
llvm/lib/IR/Value.cpp
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/icmp-mul-zext.ll
llvm/test/Transforms/InstCombine/sink_instruction.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Value.h b/llvm/include/llvm/IR/Value.h
index 253c97c3b5e33..d19c5af87fb7d 100644
--- a/llvm/include/llvm/IR/Value.h
+++ b/llvm/include/llvm/IR/Value.h
@@ -459,13 +459,6 @@ class Value {
return const_cast<Value *>(this)->getSingleUndroppableUse();
}
- /// Return true if there is exactly one unique user of this value that cannot be
- /// dropped (that user can have multiple uses of this value).
- User *getUniqueUndroppableUser();
- const User *getUniqueUndroppableUser() const {
- return const_cast<Value *>(this)->getUniqueUndroppableUser();
- }
-
/// Return true if there this value.
///
/// This is specialized because it is a common request and does not require
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp
index 7d2d73a178892..da67da1ac6c59 100644
--- a/llvm/lib/IR/Value.cpp
+++ b/llvm/lib/IR/Value.cpp
@@ -176,18 +176,6 @@ Use *Value::getSingleUndroppableUse() {
return Result;
}
-User *Value::getUniqueUndroppableUser() {
- User *Result = nullptr;
- for (auto *U : users()) {
- if (!U->isDroppable()) {
- if (Result && Result != U)
- return nullptr;
- Result = U;
- }
- }
- return Result;
-}
-
bool Value::hasNUndroppableUses(unsigned int N) const {
return hasNItems(user_begin(), user_end(), N, isUnDroppableUser);
}
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 8e14d76d0f97f..be9601f2c7f62 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3659,7 +3659,7 @@ Instruction *InstCombinerImpl::visitFreeze(FreezeInst &I) {
/// instruction past all of the instructions between it and the end of its
/// block.
static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) {
- assert(I->getUniqueUndroppableUser() && "Invariants didn't hold!");
+ assert(I->getSingleUndroppableUse() && "Invariants didn't hold!");
BasicBlock *SrcBlock = I->getParent();
// Cannot move control-flow-involving, volatile loads, vaarg, etc.
@@ -3818,27 +3818,18 @@ bool InstCombinerImpl::run() {
[this](Instruction *I) -> Optional<BasicBlock *> {
if (!EnableCodeSinking)
return None;
- auto *UserInst = cast_or_null<Instruction>(I->getUniqueUndroppableUser());
- if (!UserInst)
+ Use *SingleUse = I->getSingleUndroppableUse();
+ if (!SingleUse)
return None;
BasicBlock *BB = I->getParent();
- BasicBlock *UserParent = nullptr;
-
- // Special handling for Phi nodes - get the block the use occurs in.
- if (PHINode *PN = dyn_cast<PHINode>(UserInst)) {
- for (unsigned i = 0; i < PN->getNumIncomingValues(); i++) {
- if (PN->getIncomingValue(i) == I) {
- // Bail out if we have uses in
diff erent blocks. We don't do any
- // sophisticated analysis (i.e finding NearestCommonDominator of these
- // use blocks).
- if (UserParent && UserParent != PN->getIncomingBlock(i))
- return None;
- UserParent = PN->getIncomingBlock(i);
- }
- }
- assert(UserParent && "expected to find user block!");
- } else
+ Instruction *UserInst = cast<Instruction>(SingleUse->getUser());
+ BasicBlock *UserParent;
+
+ // Get the block the use occurs in.
+ if (PHINode *PN = dyn_cast<PHINode>(UserInst))
+ UserParent = PN->getIncomingBlock(*SingleUse);
+ else
UserParent = UserInst->getParent();
// Try sinking to another block. If that block is unreachable, then do
diff --git a/llvm/test/Transforms/InstCombine/icmp-mul-zext.ll b/llvm/test/Transforms/InstCombine/icmp-mul-zext.ll
index e70d070b79df0..9b4d9947d1619 100644
--- a/llvm/test/Transforms/InstCombine/icmp-mul-zext.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-mul-zext.ll
@@ -56,9 +56,9 @@ lor.end:
define void @PR33765(i8 %beth) {
; CHECK-LABEL: @PR33765(
+; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i32
; CHECK-NEXT: br i1 false, label [[IF_THEN9:%.*]], label [[IF_THEN9]]
; CHECK: if.then9:
-; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i32
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[CONV]], [[CONV]]
; CHECK-NEXT: [[TINKY:%.*]] = load i16, i16* @glob, align 2
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[MUL]] to i16
diff --git a/llvm/test/Transforms/InstCombine/sink_instruction.ll b/llvm/test/Transforms/InstCombine/sink_instruction.ll
index a9aba3164d3eb..4ac00571bc3c1 100644
--- a/llvm/test/Transforms/InstCombine/sink_instruction.ll
+++ b/llvm/test/Transforms/InstCombine/sink_instruction.ll
@@ -114,13 +114,13 @@ sw.epilog: ; preds = %entry, %sw.bb
}
declare i32 @foo(i32, i32)
-; Two uses in a single user. We can still sink the instruction (tmp.9).
+; TODO: Two uses in a single user. We can still sink the instruction (tmp.9).
define i32 @test4(i32 %A, i32 %B, i1 %C) {
; CHECK-LABEL: @test4(
; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TMP_9:%.*]] = add i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ENDIF:%.*]]
; CHECK: then:
-; CHECK-NEXT: [[TMP_9:%.*]] = add i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[RES:%.*]] = call i32 @foo(i32 [[TMP_9]], i32 [[TMP_9]])
; CHECK-NEXT: ret i32 [[RES]]
; CHECK: endif:
@@ -175,16 +175,16 @@ sw.epilog: ; preds = %entry, %sw.bb
ret i32 %sum.0
}
-; Multiple uses but from same BB. We can sink.
+; TODO: Multiple uses but from same BB. We can sink.
define i32 @test6(i32* nocapture readonly %P, i32 %i, i1 %cond) {
; CHECK-LABEL: @test6(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ADD:%.*]] = shl nsw i32 [[I]], 1
-; CHECK-NEXT: br label [[DISPATCHBB:%.*]]
-; CHECK: dispatchBB:
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I:%.*]] to i64
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 [[IDXPROM]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[ADD:%.*]] = shl nsw i32 [[I]], 1
+; CHECK-NEXT: br label [[DISPATCHBB:%.*]]
+; CHECK: dispatchBB:
; CHECK-NEXT: switch i32 [[I]], label [[SW_BB:%.*]] [
; CHECK-NEXT: i32 5, label [[SW_EPILOG:%.*]]
; CHECK-NEXT: i32 2, label [[SW_EPILOG]]
More information about the llvm-commits
mailing list