[llvm-commits] [llvm] r55457 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGNodes.h include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/TargetSelectionDAG.td lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Instr64bit.td lib/Target/X86/X86InstrInfo.td

Dale Johannesen dalej at apple.com
Mon Sep 22 17:22:10 PDT 2008


On Sep 22, 2008, at 5:08 PMPDT, Dan Gohman wrote:

> On Aug 29, 2008, at 8:19 AM, Duncan Sands wrote:
>
>>> Not necessarily. The purpose of MemoryVT is to provide the type
>>> when it differs from what the load or store would normally have,
>>> in the case of an extending load or truncating store.
>>
>> This occurs exactly when the type being loaded is not legal for
>> the target.
>
> This isn't the only case where MemoryVT is used. We also use
> it when folding sext/zext/trunc into loads and stores, as
> an optimization on targets that can do such operations natively.
>
>> For example, suppose in the IR you load an i8, but
>> codegen on a target for which i8 is not legal (but i32 is).  This
>> gets turned into an extending load with MemoryVT equal to i8 and
>> result type equal to i32.  It seems quite similar to the situation
>> of doing an atomic operation on an i8 in the IR: it would get
>> legalized into an extending operation with MemoryVT equal to i8
>> and (assuming the operation returned an i8 value) returning an i32.
>
>
> I agree with this though.

It would be reasonable, and I may get around to it sometime.

> It seems to me that MemoryVT is very appropriate for these AMOs.
> And, it would be a lot cleaner than code like this:
>
>            N->getOpcode() == ISD::ATOMIC_CMP_SWAP_8   ||
>            N->getOpcode() == ISD::ATOMIC_SWAP_8       ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_ADD_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_SUB_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_AND_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_OR_8    ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_XOR_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_NAND_8  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MIN_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MAX_8   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMIN_8  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMAX_8  ||
>
>            N->getOpcode() == ISD::ATOMIC_CMP_SWAP_16  ||
>            N->getOpcode() == ISD::ATOMIC_SWAP_16      ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_ADD_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_SUB_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_AND_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_OR_16   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_XOR_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_NAND_16 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MIN_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MAX_16  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMIN_16 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMAX_16 ||
>
>            N->getOpcode() == ISD::ATOMIC_CMP_SWAP_32  ||
>            N->getOpcode() == ISD::ATOMIC_SWAP_32      ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_ADD_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_SUB_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_AND_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_OR_32   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_XOR_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_NAND_32 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MIN_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MAX_32  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMIN_32 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMAX_32 ||
>
>            N->getOpcode() == ISD::ATOMIC_CMP_SWAP_64  ||
>            N->getOpcode() == ISD::ATOMIC_SWAP_64      ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_ADD_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_SUB_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_AND_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_OR_64   ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_XOR_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_NAND_64 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MIN_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_MAX_64  ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMIN_64 ||
>            N->getOpcode() == ISD::ATOMIC_LOAD_UMAX_64;
>
> Dale, what do you think?
>
> Dan
>
> _______________________________________________
> 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