From: Hans Wennborg Date: Wed, 8 Oct 2014 01:05:57 +0000 (+0000) Subject: Revert r219175 - [InstCombine] re-commit r218721 icmp-select-icmp optimization X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=8315bd8ab0c7f7dd2d666f46d569eeef5298306c Revert r219175 - [InstCombine] re-commit r218721 icmp-select-icmp optimization This seems to have caused PR21199. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219264 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombine.h b/lib/Transforms/InstCombine/InstCombine.h index 1b161b345b3..6c0d4e74a7a 100644 --- a/lib/Transforms/InstCombine/InstCombine.h +++ b/lib/Transforms/InstCombine/InstCombine.h @@ -14,7 +14,6 @@ #include "llvm/Analysis/AssumptionTracker.h" #include "llvm/Analysis/TargetFolder.h" #include "llvm/Analysis/ValueTracking.h" -#include "llvm/IR/Dominators.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InstVisitor.h" #include "llvm/IR/IntrinsicInst.h" @@ -98,8 +97,8 @@ class LLVM_LIBRARY_VISIBILITY InstCombiner public InstVisitor { AssumptionTracker *AT; const DataLayout *DL; - DominatorTree *DT; // not required TargetLibraryInfo *TLI; + DominatorTree *DT; // not required bool MadeIRChange; LibCallSimplifier *Simplifier; bool MinimizeSize; @@ -114,8 +113,7 @@ public: BuilderTy *Builder; static char ID; // Pass identification, replacement for typeid - InstCombiner() - : FunctionPass(ID), DL(nullptr), DT(nullptr), Builder(nullptr) { + InstCombiner() : FunctionPass(ID), DL(nullptr), Builder(nullptr) { MinimizeSize = false; initializeInstCombinerPass(*PassRegistry::getPassRegistry()); } @@ -244,11 +242,6 @@ public: // visitInstruction - Specify what to return for unhandled instructions... Instruction *visitInstruction(Instruction &I) { return nullptr; } - bool dominatesAllUses(const Instruction *DI, const Instruction *UI, - const BasicBlock *DB) const; - bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, - const ConstantInt *CI1, - const ConstantInt *CI2); private: bool ShouldChangeType(Type *From, Type *To) const; diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index aead0007375..00623b1cbf6 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -21,7 +21,6 @@ #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/PatternMatch.h" #include "llvm/Target/TargetLibraryInfo.h" - using namespace llvm; using namespace PatternMatch; @@ -2430,128 +2429,6 @@ static bool swapMayExposeCSEOpportunities(const Value * Op0, return GlobalSwapBenefits > 0; } -/// \brief Check that one use is in the same block as the definition and all -/// other uses are in blocks dominated by a given block -/// -/// \param DI Definition -/// \param UI Use -/// \param DB Block that must dominate all uses of \p DI outside -/// the parent block -/// \return true when \p UI is the only use of \p DI in the parent block -/// and all other uses of \p DI are in blocks dominated by \p DB. -/// -bool InstCombiner::dominatesAllUses(const Instruction *DI, - const Instruction *UI, - const BasicBlock *DB) const { - assert(DI && UI && "Instruction not defined\n"); - if (DI->getParent() != UI->getParent()) - return false; - // DominatorTree available? - if (!DT) - return false; - for (const User *U : DI->users()) { - auto *Usr = cast(U); - if (Usr != UI && !DT->dominates(DB, Usr->getParent())) - return false; - } - return true; -} - -/// -/// true when the instruction sequence within a block is select-cmp-br. -/// -static bool isChainSelectCmpBranch(const SelectInst *SI) { - const BasicBlock *BB = SI->getParent(); - if (!BB) - return false; - auto *BI = dyn_cast_or_null(BB->getTerminator()); - if (!BI || BI->getNumSuccessors() != 2) - return false; - auto *IC = dyn_cast(BI->getCondition()); - if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI)) - return false; - return true; -} - -/// -/// \brief True when a select result is replaced by one of its operands -/// in select-icmp sequence. This will eventually result in the elimination -/// of the select. -/// -/// \param SI Select instruction -/// \param Icmp Compare instruction -/// \param CI1 'true' when first select operand is equal to RHSC of Icmp -/// \param CI2 'true' when second select operand is equal to RHSC of Icmp -/// -/// Notes: -/// - The replacement is global and requires dominator information -/// - The caller is responsible for the actual replacement -/// -/// Example: -/// -/// entry: -/// %4 = select i1 %3, %C* %0, %C* null -/// %5 = icmp eq %C* %4, null -/// br i1 %5, label %9, label %7 -/// ... -/// ;