diff options
author | Sanjay Patel <spatel@rotateright.com> | 2017-04-20 22:33:54 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2017-04-20 22:33:54 +0000 |
commit | c9485ca895a2f45b9f6b55c26ea624da8c152c5d (patch) | |
tree | 8c9a18887e3a117526721d0384f5dd2ebbe14813 /llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | |
parent | dc07769c904d8e0866997f7fb57f846f183ab3d4 (diff) | |
download | bcm5719-llvm-c9485ca895a2f45b9f6b55c26ea624da8c152c5d.tar.gz bcm5719-llvm-c9485ca895a2f45b9f6b55c26ea624da8c152c5d.zip |
[InstCombine] allow shl+shr demanded bits folds with splat constants
llvm-svn: 300911
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 3d14e59ea0d..899b5dfc575 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -472,15 +472,12 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask, case Instruction::Shl: { const APInt *SA; if (match(I->getOperand(1), m_APInt(SA))) { - { - Value *VarX; ConstantInt *C1; - if (match(I->getOperand(0), m_Shr(m_Value(VarX), m_ConstantInt(C1)))) { - Instruction *Shr = cast<Instruction>(I->getOperand(0)); - Value *R = SimplifyShrShlDemandedBits(Shr, I, DemandedMask, - KnownZero, KnownOne); - if (R) - return R; - } + const APInt *ShrAmt; + if (match(I->getOperand(0), m_Shr(m_Value(), m_APInt(ShrAmt)))) { + Instruction *Shr = cast<Instruction>(I->getOperand(0)); + if (Value *R = SimplifyShrShlDemandedBits( + Shr, *ShrAmt, I, *SA, DemandedMask, KnownZero, KnownOne)) + return R; } uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1); @@ -876,20 +873,17 @@ Value *InstCombiner::SimplifyMultipleUseDemandedBits(Instruction *I, /// /// As with SimplifyDemandedUseBits, it returns NULL if the simplification was /// not successful. -Value *InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr, - Instruction *Shl, - const APInt &DemandedMask, - APInt &KnownZero, - APInt &KnownOne) { - - const APInt &ShlOp1 = cast<ConstantInt>(Shl->getOperand(1))->getValue(); - const APInt &ShrOp1 = cast<ConstantInt>(Shr->getOperand(1))->getValue(); +Value * +InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr, const APInt &ShrOp1, + Instruction *Shl, const APInt &ShlOp1, + const APInt &DemandedMask, + APInt &KnownZero, APInt &KnownOne) { if (!ShlOp1 || !ShrOp1) - return nullptr; // Noop. + return nullptr; // No-op. Value *VarX = Shr->getOperand(0); Type *Ty = VarX->getType(); - unsigned BitWidth = Ty->getIntegerBitWidth(); + unsigned BitWidth = Ty->getScalarSizeInBits(); if (ShlOp1.uge(BitWidth) || ShrOp1.uge(BitWidth)) return nullptr; // Undef. |