[llvm-commits] [llvm] r91378 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/setcc.ll test/CodeGen/X86/zext-shl.ll

Eli Friedman eli.friedman at gmail.com
Mon Dec 14 17:54:06 PST 2009


On Mon, Dec 14, 2009 at 4:41 PM, Evan Cheng <evan.cheng at apple.com> wrote:
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Dec 14 18:41:36 2009
> @@ -3278,6 +3278,16 @@
>     if (SCC.getNode()) return SCC;
>   }
>
> +  // (zext (shl (zext x), y)) -> (shl (zext x), (zext y))
> +  if ((N0.getOpcode() == ISD::SHL || N0.getOpcode() == ISD::SRL) &&
> +      N0.getOperand(0).getOpcode() == ISD::ZERO_EXTEND &&
> +      N0.hasOneUse()) {
> +    DebugLoc dl = N->getDebugLoc();
> +    return DAG.getNode(N0.getOpcode(), dl, VT,
> +                       DAG.getNode(ISD::ZERO_EXTEND, dl, VT, N0.getOperand(0)),
> +                       DAG.getNode(ISD::ZERO_EXTEND, dl, VT, N0.getOperand(1)));
> +  }
> +
>   return SDValue();
>  }

I think you need a check here to make sure the original shift never
shifts out any set bits.  (Only happens with unusual widths, but I
think it's possible before legalization.)

-Eli




More information about the llvm-commits mailing list