diff options
author | Davide Italiano <davide@freebsd.org> | 2017-07-16 18:56:30 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2017-07-16 18:56:30 +0000 |
commit | 579064e2c1df4ebd00468bd468dafcbd7771d444 (patch) | |
tree | 9aa18bc280bd18c938514d5e7dccd35bdd6abd9e /llvm/lib/Transforms | |
parent | 64fff14bde68eeec53b0e88cb8ad41d31d9ad501 (diff) | |
download | bcm5719-llvm-579064e2c1df4ebd00468bd468dafcbd7771d444.tar.gz bcm5719-llvm-579064e2c1df4ebd00468bd468dafcbd7771d444.zip |
[InstCombine] Don't violate dominance when replacing instructions.
Differential Revision: https://reviews.llvm.org/D35376
llvm-svn: 308144
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 98cdd3c9d81..a8faaecb5c3 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3749,6 +3749,11 @@ static Instruction *processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt &CVal = CI->getValue(); if (CVal.getBitWidth() - CVal.countLeadingZeros() > MulWidth) return nullptr; + } else { + // In this case we could have the operand of the binary operation + // being defined in another block, and performing the replacement + // could break the dominance relation. + return nullptr; } } else { // Other uses prohibit this transformation. @@ -3868,18 +3873,17 @@ static Instruction *processUMulZExtIdiom(ICmpInst &I, Value *MulVal, } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) { assert(BO->getOpcode() == Instruction::And); // Replace (mul & mask) --> zext (mul.with.overflow & short_mask) - Value *ShortMask = - Builder.CreateTrunc(BO->getOperand(1), Builder.getIntNTy(MulWidth)); + ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1)); + APInt ShortMask = CI->getValue().trunc(MulWidth); Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask); - Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType()); - if (auto *ZextI = dyn_cast<Instruction>(Zext)) - IC.Worklist.Add(ZextI); + Instruction *Zext = + cast<Instruction>(Builder.CreateZExt(ShortAnd, BO->getType())); + IC.Worklist.Add(Zext); IC.replaceInstUsesWith(*BO, Zext); } else { llvm_unreachable("Unexpected Binary operation"); } - if (auto *UI = dyn_cast<Instruction>(U)) - IC.Worklist.Add(UI); + IC.Worklist.Add(cast<Instruction>(U)); } } if (isa<Instruction>(OtherVal)) |