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 | 62356fc694149e9c82041c45a0884d02c5299c5e (patch) | |
tree | 9256871205823ba2574b4534b24f02f188a06bd8 /lib/Transforms | |
parent | d8be72124961bf81bd74f8e277fd6dad12c00aa9 (diff) | |
download | llvm-62356fc694149e9c82041c45a0884d02c5299c5e.tar.gz llvm-62356fc694149e9c82041c45a0884d02c5299c5e.tar.bz2 llvm-62356fc694149e9c82041c45a0884d02c5299c5e.tar.xz |
InstCombine: Replace custom constant folding code with ConstantExpr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201352 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCalls.cpp | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 8e308ecacf..9e8d1bc3bd 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/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; } |