[llvm-commits] Patch resubmit: ROTL/ROTR cleanups
Scott Michel
scottm at aero.org
Mon Apr 2 14:44:12 PDT 2007
On Apr 2, 2007, at 1:11 PM, Chris Lattner wrote:
> On Mar 30, 2007, at 12:02 PM, Scott Michel wrote:
>> Spotted what was probably a long-standing bug, since some of my
>> cleanups
>> were simple substitutions.
>
> Sorry for the delay. In general, if you keep the changes as simple
> and disjoint as possible, I'm more likely to look at them soon :).
> Here you could split up the "allow custom legalize of rotates" part
> from the "introduce some temporary vars" part from "match ext
> rotate cases" part.
I did, I did, I did! Really! They're part and parcel of the same
functionality... :-)
>> +
>> + // Look for sign/zext/any-extended cases:
>> + if ((LHSShiftAmt.getOpcode() == ISD::SIGN_EXTEND
>> + || LHSShiftAmt.getOpcode() == ISD::ZERO_EXTEND
>> + || LHSShiftAmt.getOpcode() == ISD::ANY_EXTEND) &&
>> + (RHSShiftAmt.getOpcode() == ISD::SIGN_EXTEND
>> + || RHSShiftAmt.getOpcode() == ISD::ZERO_EXTEND
>> + || RHSShiftAmt.getOpcode() == ISD::ANY_EXTEND)) {
>> + SDOperand LExtOp0 = LHSShiftAmt.getOperand(0);
>> + SDOperand RExtOp0 = RHSShiftAmt.getOperand(0);
>> + if (RExtOp0.getOpcode() == ISD::SUB &&
>> + RExtOp0.getOperand(1) == LExtOp0) {
>> + // fold (or (shl x, (*ext y)), (srl x, (*ext (sub 32, y)))) ->
>> + // (rotr x, y)
>> + // fold (or (shl x, (*ext y)), (srl x, (*ext (sub 32, y)))) ->
>> + // (rotl x, (sub 32, y))
>> + if (ConstantSDNode *SUBC = cast<ConstantSDNode>
>> (RExtOp0.getOperand(0))) {
>> + if (SUBC->getValue() == OpSizeInBits) {
>> + if (HasROTL)
>> + return DAG.getNode(ISD::ROTL, VT, LHSShiftArg,
>> LHSShiftAmt).Val;
>> + else
>> + return DAG.getNode(ISD::ROTR, VT, LHSShiftArg,
>> RHSShiftAmt).Val;
>> + }
>
> Okay, but needs an extra level of spacing for the indentation here
> (2 spaces, not 1).
>
>> + }
>> + } else if (LExtOp0.getOpcode() == ISD::SUB &&
>> + RExtOp0 == LExtOp0.getOperand(1)) {
>> + // fold (or (shl x, (*ext (sub 32, y))), (srl x, (*ext r))) ->
>> + // (rotl x, y)
>> + // fold (or (shl x, (*ext (sub 32, y))), (srl x, (*ext r))) ->
>> + // (rotr x, (sub 32, y))
>> + if (ConstantSDNode *SUBC = cast<ConstantSDNode>
>> (LExtOp0.getOperand(0))) {
>> + if (SUBC->getValue() == OpSizeInBits) {
>> + if (HasROTL)
>> + return DAG.getNode(ISD::ROTL, VT, LHSShiftArg,
>> RHSShiftAmt).Val;
>> + else
>> + return DAG.getNode(ISD::ROTL, VT, LHSShiftArg,
>> LHSShiftAmt).Val;
>> + }
>
> Likewise.
Fixed tab violations, which made it look like incorrect indentation...
-scooter
More information about the llvm-commits
mailing list