[PATCH] 128-bit ABI for x86_64-w64-mingw32 incorrectly generated

Alp Toker alp at nuanti.com
Sat Apr 19 21:33:26 PDT 2014


On 20/04/2014 05:03, Jameson Nash wrote:


Observation about code reuse only:

> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +      isTailCall = false;
> +    }

Looks similar to..

>
> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +    }

Which looks similar to..

>
> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +    }

Which looks similar to..

> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +    }

Which looks similar to..

>   
> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +    }

Which looks similar to..

>
> +    if (Win64 && Entry.Node.getValueType().getSizeInBits() > 64) {
> +      SDValue StackPtr = DAG.CreateStackTemporary(Entry.Node.getValueType(), 16);
> +      int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
> +      MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
> +      // Emit a store to the stack slot.
> +      InChain = DAG.getStore(InChain, dl, Entry.Node, StackPtr, PtrInfo,
> +                                   false, false, 16);
> +      Entry.Node = StackPtr;
> +      Entry.Ty = PointerType::get(Entry.Ty,0);
> +      Entry.isSExt = false;
> +      Entry.isZExt = false;
> +    }
>

How about factoring these and the existing surrounding copy-and-paste 
code into a function and calling into it instead of maintaining six copies?

Alp.

-- 
http://www.nuanti.com
the browser experts




More information about the llvm-commits mailing list