diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-02-13 18:23:24 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-02-13 18:23:24 +0000 |
commit | 920409585f1db2b272ed3103696f578a4babc69c (patch) | |
tree | 7ef8a379239274fe340536298cfb3c592cfbf65b /llvm/lib/Transforms | |
parent | 4f2a067df11d807d464c097e0252c4e792cace0f (diff) | |
download | bcm5719-llvm-920409585f1db2b272ed3103696f578a4babc69c.tar.gz bcm5719-llvm-920409585f1db2b272ed3103696f578a4babc69c.zip |
InstCombine: Replace custom constant folding code with ConstantExpr.
llvm-svn: 201352
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 8e308ecacf3..9e8d1bc3bd6 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -666,22 +666,12 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { // Check for constant LHS & RHS - in this case we just simplify. bool Zext = (II->getIntrinsicID() == Intrinsic::arm_neon_vmullu); VectorType *NewVT = cast<VectorType>(II->getType()); - unsigned NewWidth = NewVT->getElementType()->getIntegerBitWidth(); - if (ConstantDataVector *CV0 = dyn_cast<ConstantDataVector>(Arg0)) { - if (ConstantDataVector *CV1 = dyn_cast<ConstantDataVector>(Arg1)) { - VectorType* VT = cast<VectorType>(CV0->getType()); - SmallVector<Constant*, 4> NewElems; - for (unsigned i = 0; i < VT->getNumElements(); ++i) { - APInt CV0E = - (cast<ConstantInt>(CV0->getAggregateElement(i)))->getValue(); - CV0E = Zext ? CV0E.zext(NewWidth) : CV0E.sext(NewWidth); - APInt CV1E = - (cast<ConstantInt>(CV1->getAggregateElement(i)))->getValue(); - CV1E = Zext ? CV1E.zext(NewWidth) : CV1E.sext(NewWidth); - NewElems.push_back( - ConstantInt::get(NewVT->getElementType(), CV0E * CV1E)); - } - return ReplaceInstUsesWith(CI, ConstantVector::get(NewElems)); + if (Constant *CV0 = dyn_cast<Constant>(Arg0)) { + if (Constant *CV1 = dyn_cast<Constant>(Arg1)) { + CV0 = ConstantExpr::getIntegerCast(CV0, NewVT, /*isSigned=*/!Zext); + CV1 = ConstantExpr::getIntegerCast(CV1, NewVT, /*isSigned=*/!Zext); + + return ReplaceInstUsesWith(CI, ConstantExpr::getMul(CV0, CV1)); } // Couldn't simplify - canonicalize constant to the RHS. @@ -689,17 +679,12 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { } // Handle mul by one: - if (ConstantDataVector *CV1 = dyn_cast<ConstantDataVector>(Arg1)) { + if (Constant *CV1 = dyn_cast<Constant>(Arg1)) if (ConstantInt *Splat = - dyn_cast_or_null<ConstantInt>(CV1->getSplatValue())) { - if (Splat->isOne()) { - if (Zext) - return CastInst::CreateZExtOrBitCast(Arg0, II->getType()); - // else - return CastInst::CreateSExtOrBitCast(Arg0, II->getType()); - } - } - } + dyn_cast_or_null<ConstantInt>(CV1->getSplatValue())) + if (Splat->isOne()) + return CastInst::CreateIntegerCast(Arg0, II->getType(), + /*isSigned=*/!Zext); break; } |