[llvm-commits] [llvm] r53035 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAG.h lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/ARM/ARMISelLowering.cpp lib/Target/CellSPU/SPUISelLowering.cpp lib/Target/PowerPC/PPCISelLowering.cpp lib/Target/Sparc/SparcISelLowering.cpp lib/Target/X86/X86ISelLowering.cpp
Evan Cheng
evan.cheng at apple.com
Fri Jul 4 00:54:10 PDT 2008
Thanks Mon Ping. Please commit.
Evan
On Jul 3, 2008, at 11:43 PM, Mon P Wang wrote:
> Hi,
>
> The problem with the patch I commit was thought the stack alignment of
> the slot was correct, the stores we generated for the StackConvert
> assumed the larger alignment. It makes more sense to use the
> alignment of source when we store and the alignment of the destination
> type when we load. This avoids the problem for that and I get the same
> failure with and without the patch in tests. Sorry for the mistake.
>
>
> -- Mon Ping
>
>
> Index: include/llvm/CodeGen/SelectionDAG.h
> ===================================================================
> --- include/llvm/CodeGen/SelectionDAG.h (revision 53112)
> +++ include/llvm/CodeGen/SelectionDAG.h (working copy)
> @@ -589,9 +589,10 @@
> void dump() const;
>
> /// CreateStackTemporary - Create a stack temporary, suitable for
> holding the
> - /// specified value type.
> - SDOperand CreateStackTemporary(MVT VT);
> -
> + /// specified value type. If minAlign is specified, the slot size
> will have
> + /// at least that alignment.
> + SDOperand CreateStackTemporary(MVT VT, unsigned minAlign = 1);
> +
> /// FoldSetCC - Constant fold a setcc to true or false.
> SDOperand FoldSetCC(MVT VT, SDOperand N1,
> SDOperand N2, ISD::CondCode Cond);
> Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp (revision 53112)
> +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp (working copy)
> @@ -1080,16 +1080,17 @@
>
> /// CreateStackTemporary - Create a stack temporary, suitable for
> holding the
> /// specified value type.
> -SDOperand SelectionDAG::CreateStackTemporary(MVT VT) {
> +SDOperand SelectionDAG::CreateStackTemporary(MVT VT, unsigned
> minAlign) {
> MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();
> unsigned ByteSize = VT.getSizeInBits()/8;
> const Type *Ty = VT.getTypeForMVT();
> - unsigned StackAlign = (unsigned)TLI.getTargetData()-
>> getPrefTypeAlignment(Ty);
> + unsigned StackAlign =
> + std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty),
> minAlign);
> +
> int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign);
> return getFrameIndex(FrameIdx, TLI.getPointerTy());
> }
>
> -
> SDOperand SelectionDAG::FoldSetCC(MVT VT, SDOperand N1,
> SDOperand N2, ISD::CondCode Cond) {
> // These setcc operations always fold.
> Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (revision 53112)
> +++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (working copy)
> @@ -4871,35 +4871,41 @@
> MVT SlotVT,
> MVT DestVT) {
> // Create the stack frame object.
> - SDOperand FIPtr = DAG.CreateStackTemporary(SlotVT);
> -
> + unsigned SrcAlign = TLI.getTargetData()->getPrefTypeAlignment(
> +
> SrcOp.getValueType().getTypeForMVT());
> + SDOperand FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign);
> +
> FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
> int SPFI = StackPtrFI->getIndex();
> -
> +
> unsigned SrcSize = SrcOp.getValueType().getSizeInBits();
> unsigned SlotSize = SlotVT.getSizeInBits();
> unsigned DestSize = DestVT.getSizeInBits();
> + unsigned DestAlign = TLI.getTargetData()->getPrefTypeAlignment(
> +
> DestVT.getTypeForMVT());
>
> // Emit a store to the stack slot. Use a truncstore if the input
> value is
> // later than DestVT.
> SDOperand Store;
> +
> if (SrcSize > SlotSize)
> Store = DAG.getTruncStore(DAG.getEntryNode(), SrcOp, FIPtr,
> - PseudoSourceValue::getFixedStack(),
> - SPFI, SlotVT);
> + PseudoSourceValue::getFixedStack(),
> SPFI, SlotVT,
> + false, SrcAlign);
> else {
> assert(SrcSize == SlotSize && "Invalid store");
> Store = DAG.getStore(DAG.getEntryNode(), SrcOp, FIPtr,
> - PseudoSourceValue::getFixedStack(),
> - SPFI);
> + PseudoSourceValue::getFixedStack(), SPFI,
> + false, SrcAlign);
> }
>
> // Result is a load from the stack slot.
> if (SlotSize == DestSize)
> - return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0);
> + return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0, false,
> DestAlign);
>
> assert(SlotSize < DestSize && "Unknown extension!");
> - return DAG.getExtLoad(ISD::EXTLOAD, DestVT, Store, FIPtr, NULL, 0,
> SlotVT);
> + return DAG.getExtLoad(ISD::EXTLOAD, DestVT, Store, FIPtr, NULL, 0,
> SlotVT,
> + false, DestAlign);
> }
>
>
> On Jul 3, 2008, at 1:09 PM, Mon P Wang wrote:
>
>>
>> Thanks, I'll take a look and see what is wrong with it.
>>
>> -- Mon Ping
>>
>> On Jul 3, 2008, at 11:20 AM, Evan Cheng wrote:
>>
>>> This is backed out for now. Mon Ping, please take a look.
>>>
>>> Evan
>>>
>>> On Jul 3, 2008, at 9:45 AM, Chris Lattner wrote:
>>>
>>>>
>>>> On Jul 3, 2008, at 2:06 AM, Duncan Sands wrote:
>>>>
>>>>> Hi Evan,
>>>>>
>>>>>> test/CodeGen/PowerPC/vec_misaligned.ll is not crashing in the
>>>>>> Legalizer. Can you check if your patch is the cause?
>>>>>
>>>>> it was caused by r53031:
>>>>>
>>>>> r53031 | wangmp | 2008-07-02 19:07:12 +0200 (Wed, 02 Jul 2008) | 4
>>>>> lines
>>>>>
>>>>> Fixed problem in EmitStackConvert where the source and target type
>>>>> have different alignment by creating a stack slot with the max
>>>>> alignment of source and target type.
>>>>
>>>> If this patch is still causing breakage, please revert it. Mon
>>>> Ping
>>>> can track down the problem and reapply when it is fixed.
>>>>
>>>> -Chris
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list