[PATCH] D80399: [Local] Prevent `invertCondition` from creating a redundant instruction
Ehud Katz via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 21 12:27:28 PDT 2020
ekatz created this revision.
ekatz added reviewers: tstellar, chandlerc, sameerds, foad, nhaehnle, kuhar.
ekatz added a project: LLVM.
Herald added subscribers: llvm-commits, hiraditya.
ekatz added a comment.
Of course, this requires also fixing the tests affected by this change; but I wanted to present the change first, and if approved, I'll work on fixing the tests.
Prevent `invertCondition` from creating the inversion instruction, in case the given value is an argument which has already been inverted.
Note that this approach has already been taken in case the given value is an instruction (and not an argument).
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80399
Files:
llvm/lib/Transforms/Utils/Local.cpp
Index: llvm/lib/Transforms/Utils/Local.cpp
===================================================================
--- llvm/lib/Transforms/Utils/Local.cpp
+++ llvm/lib/Transforms/Utils/Local.cpp
@@ -3053,31 +3053,26 @@
if (match(Condition, m_Not(m_Value(NotCondition))))
return NotCondition;
- if (Instruction *Inst = dyn_cast<Instruction>(Condition)) {
- // Third: Check all the users for an invert
- BasicBlock *Parent = Inst->getParent();
- for (User *U : Condition->users())
- if (Instruction *I = dyn_cast<Instruction>(U))
- if (I->getParent() == Parent && match(I, m_Not(m_Specific(Condition))))
- return I;
-
- // Last option: Create a new instruction
- auto Inverted = BinaryOperator::CreateNot(Inst, "");
- if (isa<PHINode>(Inst)) {
- // FIXME: This fails if the inversion is to be used in a
- // subsequent PHINode in the same basic block.
- Inverted->insertBefore(&*Parent->getFirstInsertionPt());
- } else {
- Inverted->insertAfter(Inst);
- }
- return Inverted;
- }
-
- if (Argument *Arg = dyn_cast<Argument>(Condition)) {
- BasicBlock &EntryBlock = Arg->getParent()->getEntryBlock();
- return BinaryOperator::CreateNot(Condition, Arg->getName() + ".inv",
- &*EntryBlock.getFirstInsertionPt());
- }
-
- llvm_unreachable("Unhandled condition to invert");
+ BasicBlock *Parent = nullptr;
+ Instruction *Inst = dyn_cast<Instruction>(Condition);
+ if (Inst)
+ Parent = Inst->getParent();
+ else if (Argument *Arg = dyn_cast<Argument>(Condition))
+ Parent = &Arg->getParent()->getEntryBlock();
+ assert(Parent && "Unsupported condition to invert");
+
+ // Third: Check all the users for an invert
+ for (User *U : Condition->users())
+ if (Instruction *I = dyn_cast<Instruction>(U))
+ if (I->getParent() == Parent && match(I, m_Not(m_Specific(Condition))))
+ return I;
+
+ // Last option: Create a new instruction
+ auto *Inverted =
+ BinaryOperator::CreateNot(Condition, Condition->getName() + ".inv");
+ if (Inst && !isa<PHINode>(Inst))
+ Inverted->insertAfter(Inst);
+ else
+ Inverted->insertBefore(&*Parent->getFirstInsertionPt());
+ return Inverted;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80399.265575.patch
Type: text/x-patch
Size: 2230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200521/884874f3/attachment-0001.bin>
More information about the llvm-commits
mailing list