[LLVMdev] Possible missed optimization? 2.0

Borja Ferrer borja.ferav at gmail.com
Thu Sep 9 15:31:35 PDT 2010


>>Note that the isCommutable flag is only really useful for two-address
instructions. If the two inputs are not constrained, nothing is really won
by swapping them.
Ahh i see, good to know that.

>> Does the -view-*-dags output look correct?
They do look correct, there are three Xmul_lohi blocks, one returns the low
part copied into R14 and the rest of combinations get added and merged into
R15.

Here is my selectionDAG code, i used X86's MUL code and adapted it to my
target:

    case ISD::SMUL_LOHI:
    case ISD::UMUL_LOHI:
        {
            SDValue Op1 = N->getOperand(0);
            SDValue Op2 = N->getOperand(1);
            unsigned LoReg = R0, HiReg = R1;
            unsigned Opc = MULRdRr;

            SDValue InFlag = SDValue(CurDAG->getMachineNode(Opc,
                                                            dl,
                                                            MVT::Flag,
                                                            Op1,
                                                            Op2), 0);

            // Copy the low half of the result, if it is needed.
            if (!SDValue(N, 0).use_empty())
            {
                SDValue Result =
CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
                                                        dl,
                                                        LoReg,
                                                        NVT,
                                                        InFlag);
                InFlag = Result.getValue(2);
                ReplaceUses(SDValue(N, 0), Result);
            }

            // Copy the high half of the result, if it is needed.
            if (!SDValue(N, 1).use_empty())
            {
                SDValue Result =
CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
                                                        dl,
                                                        HiReg,
                                                        NVT,
                                                        InFlag);
                InFlag = Result.getValue(2);
                ReplaceUses(SDValue(N, 1), Result);
            }

            return NULL;
        }

ISD::MUL is set to be expanded.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100910/e7572deb/attachment.html>


More information about the llvm-dev mailing list