diff options
Diffstat (limited to 'lib/Transforms/InstCombine/InstructionCombining.cpp')
| -rw-r--r-- | lib/Transforms/InstCombine/InstructionCombining.cpp | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index 65e6d2e35905..02fac4fb37a4 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -939,9 +939,19 @@ Instruction *InstCombiner::foldOpIntoPhi(Instruction &I, PHINode *PN) {        // `TrueVInPred`.        if (InC && !isa<ConstantExpr>(InC) && isa<ConstantInt>(InC))          InV = InC->isNullValue() ? FalseVInPred : TrueVInPred; -      else +      else { +        // Generate the select in the same block as PN's current incoming block. +        // Note: ThisBB need not be the NonConstBB because vector constants +        // which are constants by definition are handled here. +        // FIXME: This can lead to an increase in IR generation because we might +        // generate selects for vector constant phi operand, that could not be +        // folded to TrueVInPred or FalseVInPred as done for ConstantInt. For +        // non-vector phis, this transformation was always profitable because +        // the select would be generated exactly once in the NonConstBB. +        Builder->SetInsertPoint(ThisBB->getTerminator());          InV = Builder->CreateSelect(PN->getIncomingValue(i),                                      TrueVInPred, FalseVInPred, "phitmp"); +      }        NewPN->addIncoming(InV, ThisBB);      }    } else if (CmpInst *CI = dyn_cast<CmpInst>(&I)) { @@ -3002,6 +3012,7 @@ static bool AddReachableCodeToWorklist(BasicBlock *BB, const DataLayout &DL,          ++NumDeadInst;          DEBUG(dbgs() << "IC: DCE: " << *Inst << '\n');          Inst->eraseFromParent(); +        MadeIRChange = true;          continue;        } @@ -3015,6 +3026,7 @@ static bool AddReachableCodeToWorklist(BasicBlock *BB, const DataLayout &DL,            ++NumConstProp;            if (isInstructionTriviallyDead(Inst, TLI))              Inst->eraseFromParent(); +          MadeIRChange = true;            continue;          }  | 
