> diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.619 > llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.620 > --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.619 Thu > Feb 1 16:30:07 2007 > +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu Feb 1 > 20:16:22 2007
I already committed some code. > @@ -1197,8 +1200,8 @@ > // the shift amount is >= the size of the datatype, which is > undefined. > if (DemandedMask == 1) { > // Perform the logical shift right. > - Value *NewVal = new ShiftInst(Instruction::LShr, I- > >getOperand(0), > - I->getOperand(1), I->getName()); > + Value *NewVal = BinaryOperator::create(Instruction::LShr, BinaryOperator::createLShr please, likewise elsewhere in many places in the file. > > @@ -4599,13 +4601,18 @@ > // could exist), turn it into (X & (C2 << C1)) != (C3 << > C1). This > // happens a LOT in code produced by the C front-end, > for bitfield > // access. > - ShiftInst *Shift = dyn_cast<ShiftInst>(LHSI->getOperand > (0)); > + BinaryOperator *Shift = dyn_cast<BinaryOperator>(LHSI- > >getOperand(0)); > + if (Shift && !Shift->isShift()) > + Shift = 0; > > // Check to see if there is a noop-cast between the > shift and the and. > if (!Shift) { > if (CastInst *CI = dyn_cast<CastInst>(LHSI->getOperand > (0))) > - if (CI->getOpcode() == Instruction::BitCast) > - Shift = dyn_cast<ShiftInst>(CI->getOperand(0)); > + if (CI->getOpcode() == Instruction::BitCast) { > + Shift = dyn_cast<BinaryOperator>(CI->getOperand(0)); > + if (Shift && !Shift->isShift()) > + Shift = 0; > + } > } This code can be eliminated. Noop casts are no longer an issue now that int->uint casts don't exist. > @@ -5489,13 +5508,12 @@ > > // Turn (Y + ((X >> C) & CC)) << C -> ((X & (CC << C)) > + (Y << C)) > if (isLeftShift && Op0BO->getOperand(1)->hasOneUse() && > - match(Op0BO->getOperand(1), > - m_And(m_Shr(m_Value(V1), m_Value(V2)), > - m_ConstantInt(CC))) && V2 == Op1 && > + match(Op0BO->getOperand(1), m_And(m_Shr(m_Value(V1), > m_Value(V2)), > + m_ConstantInt(CC))) && V2 == Op1 && Please fix the indentation here. > @@ -5595,15 +5613,15 @@ > } > > // Find out if this is a shift of a shift by a constant. > - ShiftInst *ShiftOp = 0; > - if (ShiftInst *Op0SI = dyn_cast<ShiftInst>(Op0)) > - ShiftOp = Op0SI; > - else if (BitCastInst *CI = dyn_cast<BitCastInst>(Op0)) { > - // If this is a noop-integer cast of a shift instruction, use > the shift. > - if (isa<ShiftInst>(CI->getOperand(0))) { > - ShiftOp = cast<ShiftInst>(CI->getOperand(0)); > - } > - } > + BinaryOperator *ShiftOp = dyn_cast<BinaryOperator>(Op0); > + if (ShiftOp && !ShiftOp->isShift()) > + ShiftOp = 0; > + if (!ShiftOp) > + if (BitCastInst *CI = dyn_cast<BitCastInst>(Op0)) > + // If this is a noop-integer cast of a shift instruction, > use the shift. > + if (BinaryOperator *SI = dyn_cast<BinaryOperator>(CI- > >getOperand(0))) > + if (SI->isShift()) > + ShiftOp = SI; Likewise, the noop-cast case here should be eliminated. > @@ -6570,11 +6595,13 @@ > return BinaryOperator::create(BO->getOpcode(), NewSI, MatchOp); > } > > - assert(isa<ShiftInst>(TI) && "Should only have Shift here"); > + assert(TI->isShift() && "Should only have Shift here"); > if (MatchIsOpZero) > - return new ShiftInst(cast<ShiftInst>(TI)->getOpcode(), > MatchOp, NewSI); > + return BinaryOperator::create(Instruction::BinaryOps(TI- > >getOpcode()), > + MatchOp, NewSI); > else > - return new ShiftInst(cast<ShiftInst>(TI)->getOpcode(), NewSI, > MatchOp); > + return BinaryOperator::create(Instruction::BinaryOps(TI- > >getOpcode()), > + NewSI, MatchOp); > } This code is dead, please remove. Nice series of patches Reid, this is a great change. -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits