mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[SelectionDAG] ComputeNumSignBits - cleanup ROTL/ROTR wrapping to match DAGCombine etc.
Use RotAmt.urem(VTBits) instead of AND(RotAmt, VTBits - 1) TBH I don't expect non-power-of-2 types to be created, but it makes the logic clearer and matches what we do in other rotation combines. llvm-svn: 313245
This commit is contained in:
parent
d08c7b8d9c
commit
efa82226b8
@ -3124,16 +3124,16 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
||||
case ISD::ROTL:
|
||||
case ISD::ROTR:
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
unsigned RotAmt = C->getZExtValue() & (VTBits-1);
|
||||
unsigned RotAmt = C->getAPIntValue().urem(VTBits);
|
||||
|
||||
// Handle rotate right by N like a rotate left by 32-N.
|
||||
if (Op.getOpcode() == ISD::ROTR)
|
||||
RotAmt = (VTBits-RotAmt) & (VTBits-1);
|
||||
RotAmt = (VTBits - RotAmt) % VTBits;
|
||||
|
||||
// If we aren't rotating out all of the known-in sign bits, return the
|
||||
// number that are left. This handles rotl(sext(x), 1) for example.
|
||||
Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
|
||||
if (Tmp > RotAmt+1) return Tmp-RotAmt;
|
||||
if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
|
||||
}
|
||||
break;
|
||||
case ISD::ADD:
|
||||
|
Loading…
Reference in New Issue
Block a user