From 3ac9e109b24eaae482eb914d970ba7980f462925 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 12 Jul 2008 05:04:38 +0000 Subject: [PATCH] Enhance analysis of srem. Remove dead code analyzing urem. 'urem' of power-of-2 is canonicalized to an 'and' instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53506 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 18 +++--------------- .../InstCombine/2008-07-11-RemAnd.ll | 9 +++++++++ 2 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 test/Transforms/InstCombine/2008-07-11-RemAnd.ll diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 5864a626777..20580e30ab4 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1254,6 +1254,9 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask, if (ConstantInt *Rem = dyn_cast(I->getOperand(1))) { APInt RA = Rem->getValue(); if (RA.isPowerOf2() || (-RA).isPowerOf2()) { + if (DemandedMask.ule(RA)) // srem won't affect demanded bits + return UpdateValueUsesWith(I, I->getOperand(0)); + APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA; APInt Mask2 = LowBits | APInt::getSignBit(BitWidth); if (SimplifyDemandedBits(I->getOperand(0), Mask2, @@ -1273,21 +1276,6 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask, } break; case Instruction::URem: { - if (ConstantInt *Rem = dyn_cast(I->getOperand(1))) { - APInt RA = Rem->getValue(); - if (RA.isPowerOf2()) { - APInt LowBits = (RA - 1); - APInt Mask2 = LowBits & DemandedMask; - KnownZero |= ~LowBits & DemandedMask; - if (SimplifyDemandedBits(I->getOperand(0), Mask2, - KnownZero, KnownOne, Depth+1)) - return true; - - assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?"); - break; - } - } - APInt KnownZero2(BitWidth, 0), KnownOne2(BitWidth, 0); APInt AllOnes = APInt::getAllOnesValue(BitWidth); if (SimplifyDemandedBits(I->getOperand(0), AllOnes, diff --git a/test/Transforms/InstCombine/2008-07-11-RemAnd.ll b/test/Transforms/InstCombine/2008-07-11-RemAnd.ll new file mode 100644 index 00000000000..0bfd41dd4e7 --- /dev/null +++ b/test/Transforms/InstCombine/2008-07-11-RemAnd.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep rem +; PR2330 + +define i32 @a(i32 %b) nounwind { +entry: + srem i32 %b, 8 ; :0 [#uses=1] + and i32 %0, 1 ; :1 [#uses=1] + ret i32 %1 +}