[llvm-commits] [llvm] r114097 - in /llvm/trunk: lib/Analysis/InstructionSimplify.cpp test/Transforms/CorrelatedValuePropagation/crash.ll
Chris Lattner
clattner at apple.com
Thu Sep 16 11:21:33 PDT 2010
On Sep 16, 2010, at 10:42 AM, Owen Anderson wrote:
> Author: resistor
> Date: Thu Sep 16 12:42:36 2010
> New Revision: 114097
>
> URL: http://llvm.org/viewvc/llvm-project?rev=114097&view=rev
> Log:
> Fix PR8161, in which an unreachable loop causes recursive instruction simplification to try
> to replace an instruction with itself. Add a predicate to the simplifier to prevent this case.
Why is CVP doing simplifications in unreachable blocks? Why not do a quick DFS of the CFG to find the reachable blocks?
-Chris
>
> Added:
> llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll
> Modified:
> llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>
> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=114097&r1=114096&r2=114097&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Sep 16 12:42:36 2010
> @@ -423,31 +423,44 @@
> /// SimplifyInstruction - See if we can compute a simplified version of this
> /// instruction. If not, this returns null.
> Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
> + Value *Ret = 0;
> switch (I->getOpcode()) {
> default:
> return ConstantFoldInstruction(I, TD);
> case Instruction::Add:
> - return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
> - cast<BinaryOperator>(I)->hasNoSignedWrap(),
> - cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
> + Ret = SimplifyAddInst(I->getOperand(0), I->getOperand(1),
> + cast<BinaryOperator>(I)->hasNoSignedWrap(),
> + cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
> + break;
> case Instruction::And:
> - return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
> + Ret = SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
> + break;
> case Instruction::Or:
> - return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
> + Ret = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
> + break;
> case Instruction::ICmp:
> - return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
> - I->getOperand(0), I->getOperand(1), TD);
> + Ret = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
> + I->getOperand(0), I->getOperand(1), TD);
> + break;
> case Instruction::FCmp:
> - return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
> - I->getOperand(0), I->getOperand(1), TD);
> + Ret = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
> + I->getOperand(0), I->getOperand(1), TD);
> + break;
> case Instruction::Select:
> - return SimplifySelectInst(I->getOperand(0), I->getOperand(1),
> + Ret = SimplifySelectInst(I->getOperand(0), I->getOperand(1),
> I->getOperand(2), TD);
> + break;
> case Instruction::GetElementPtr: {
> SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
> - return SimplifyGEPInst(&Ops[0], Ops.size(), TD);
> + Ret = SimplifyGEPInst(&Ops[0], Ops.size(), TD);
> + break;
> }
> }
> +
> + // It is possible, in situations involving unreachable loops, to
> + // have a replacement that, through recursive simplification, ends up
> + // simplifying to itself.
> + return Ret != I ? Ret : 0;
> }
>
> /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
>
> Added: llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll?rev=114097&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll (added)
> +++ llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll Thu Sep 16 12:42:36 2010
> @@ -0,0 +1,20 @@
> +; RUN: opt < %s -correlated-propagation
> +
> +; PR8161
> +define void @test1() nounwind ssp {
> +entry:
> + br label %for.end
> +
> +for.cond.us.us: ; preds = %for.cond.us.us
> + %cmp6.i.us.us = icmp sgt i32 1, 0
> + %lor.ext.i.us.us = zext i1 %cmp6.i.us.us to i32
> + %lor.ext.add.i.us.us = select i1 %cmp6.i.us.us, i32 %lor.ext.i.us.us, i32 undef
> + %conv.i.us.us = trunc i32 %lor.ext.add.i.us.us to i16
> + %sext.us.us = shl i16 %conv.i.us.us, 8
> + %conv6.us.us = ashr i16 %sext.us.us, 8
> + %and.us.us = and i16 %conv6.us.us, %and.us.us
> + br i1 false, label %for.end, label %for.cond.us.us
> +
> +for.end: ; preds = %for.cond.us, %for.cond.us.us, %entry
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list