[llvm-commits] Fold multiply by 0 and 1 when in UnsafeFPMath mode in SelectionDAG::getNode()

Michael Ilseman milseman at apple.com
Fri Sep 7 17:03:34 PDT 2012


Unfortunately, CFP is an SDNode: the assignment statement with dyncast ends up calling the SDValue's *operator. I could probably call the SDValue constructor on CFP, and in that case would the resno just be 0?

On Sep 7, 2012, at 4:59 PM, Chandler Carruth <chandlerc at google.com> wrote:

> 
> On Fri, Sep 7, 2012 at 7:55 PM, Michael Ilseman <milseman at apple.com> wrote:
> Thanks for the comment. New patch attached. I'm not too familiar with SDValue/SDNode, so if you see a way that it can be cleaned up further, let me know!
> 
> Hmm, I would have assumed (naively, and without running the compiler over it) that you could write this as:
> 
>       } else if (Opcode == ISD::FMUL) {
>         ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1);
>         SDNode *Arg = N2;
> 
>         // If the first operand isn't the constant, try the second
>         if (!CFP) {
>           CFP = dyn_cast<ConstantFPSDNode>(N2);
>           Arg = N1;
>         }
> 
>         if (CFP) {
>           // 0*x --> 0
>           if (CFP->isZero())
>             return CFP;
>           // 1*x --> x
>           if (CFP->isExactlyValue(1.0))
>             return Arg;
>         }
> 
> If that doesn't work, your version seems fine.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120907/758f9666/attachment.html>


More information about the llvm-commits mailing list