diff options
author | Serge Pavlov <sepavloff@gmail.com> | 2014-05-14 09:05:09 +0000 |
---|---|---|
committer | Serge Pavlov <sepavloff@gmail.com> | 2014-05-14 09:05:09 +0000 |
commit | e6de9e39a8ac60a213538ea51e5ca07f517bfc5a (patch) | |
tree | 333e73a865f1b5e28aa230949dd08be5f6a7a983 /llvm/lib/Transforms | |
parent | 9f9492b657358da8f7787e652b2f425fc5570208 (diff) | |
download | bcm5719-llvm-e6de9e39a8ac60a213538ea51e5ca07f517bfc5a.tar.gz bcm5719-llvm-e6de9e39a8ac60a213538ea51e5ca07f517bfc5a.zip |
Fix the case when reordering shuffle and binop produces a constant.
This resolves PR19737.
llvm-svn: 208762
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 8c0a249aee1..4c36887f628 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1085,18 +1085,18 @@ Value *InstCombiner::Descale(Value *Val, APInt Scale, bool &NoSignedWrap) { /// \brief Creates node of binary operation with the same attributes as the /// specified one but with other operands. -static BinaryOperator *CreateBinOpAsGiven(BinaryOperator &Inst, Value *LHS, - Value *RHS, - InstCombiner::BuilderTy *B) { - BinaryOperator *NewBO = cast<BinaryOperator>(B->CreateBinOp(Inst.getOpcode(), - LHS, RHS)); - if (isa<OverflowingBinaryOperator>(NewBO)) { - NewBO->setHasNoSignedWrap(Inst.hasNoSignedWrap()); - NewBO->setHasNoUnsignedWrap(Inst.hasNoUnsignedWrap()); +static Value *CreateBinOpAsGiven(BinaryOperator &Inst, Value *LHS, Value *RHS, + InstCombiner::BuilderTy *B) { + Value *BORes = B->CreateBinOp(Inst.getOpcode(), LHS, RHS); + if (BinaryOperator *NewBO = dyn_cast<BinaryOperator>(BORes)) { + if (isa<OverflowingBinaryOperator>(NewBO)) { + NewBO->setHasNoSignedWrap(Inst.hasNoSignedWrap()); + NewBO->setHasNoUnsignedWrap(Inst.hasNoUnsignedWrap()); + } + if (isa<PossiblyExactOperator>(NewBO)) + NewBO->setIsExact(Inst.isExact()); } - if (isa<PossiblyExactOperator>(NewBO)) - NewBO->setIsExact(Inst.isExact()); - return NewBO; + return BORes; } /// \brief Makes transformation of binary operation specific for vector types. @@ -1122,7 +1122,7 @@ Value *InstCombiner::SimplifyVectorOp(BinaryOperator &Inst) { isa<UndefValue>(RShuf->getOperand(1)) && LShuf->getOperand(0)->getType() == RShuf->getOperand(0)->getType() && LShuf->getMask() == RShuf->getMask()) { - BinaryOperator *NewBO = CreateBinOpAsGiven(Inst, LShuf->getOperand(0), + Value *NewBO = CreateBinOpAsGiven(Inst, LShuf->getOperand(0), RShuf->getOperand(0), Builder); Value *Res = Builder->CreateShuffleVector(NewBO, UndefValue::get(NewBO->getType()), LShuf->getMask()); @@ -1168,7 +1168,7 @@ Value *InstCombiner::SimplifyVectorOp(BinaryOperator &Inst) { NewLHS = Shuffle->getOperand(0); NewRHS = C2; } - BinaryOperator *NewBO = CreateBinOpAsGiven(Inst, NewLHS, NewRHS, Builder); + Value *NewBO = CreateBinOpAsGiven(Inst, NewLHS, NewRHS, Builder); Value *Res = Builder->CreateShuffleVector(NewBO, UndefValue::get(Inst.getType()), Shuffle->getMask()); return Res; |