[llvm-commits] [llvm] r46140 - in /llvm/trunk: include/llvm/Target/ lib/CodeGen/SelectionDAG/ lib/Target/ lib/Target/ARM/ lib/Target/Alpha/ lib/Target/CellSPU/ lib/Target/Mips/ lib/Target/PowerPC/ lib/Target/Sparc/ lib/Target/X86/ test/CodeGen/X86/

Duncan Sands duncan.sands at math.u-psud.fr
Thu Jan 17 22:03:40 PST 2008


Hi Chris,

> +  LegalizeAction getTruncStoreAction(MVT::ValueType ValVT, 
> +                                     MVT::ValueType MemVT) const {
> +    assert(ValVT < MVT::LAST_VALUETYPE && MemVT < 32 && 

what is 32?  Did you mean <= LAST_INTEGER_VALUETYPE or something?  Now I
come to notice it, it is bad that you have to use < for LAST_VALUE_TYPE
but <= for LAST_INTEGER_VALUETYPE and friends...


> +  void setTruncStoreAction(MVT::ValueType ValVT, MVT::ValueType MemVT,
> +                           LegalizeAction Action) {
> +    assert(ValVT < MVT::LAST_VALUETYPE && MemVT < 32 && 

Again the magic 32.

> -  /// isStoreXLegal - Return true if the specified store with truncation is
> +  /// isTruncStoreLegal - Return true if the specified store with truncation is
>    /// legal on this target.
> -  bool isStoreXLegal(MVT::ValueType VT) const {
> -    return getStoreXAction(VT) == Legal || getStoreXAction(VT) == Custom;
> +  bool isTruncStoreLegal(MVT::ValueType ValVT, MVT::ValueType MemVT) const {
> +    return getTruncStoreAction(ValVT, MemVT) == Legal ||
> +           getTruncStoreAction(ValVT, MemVT) == Custom;
>    }

It would be more friendly to have isStoreXLegal return false if VT or MemVT is
an extended value type, rather than having it assert in getTruncStoreAction...

> +  // If this is an FP_ROUND or TRUNC followed by a store, fold this into a
> +  // truncating store.  We can do this even if this is already a truncstore.
> +  if ((Value.getOpcode() == ISD::FP_ROUND || Value.getOpcode() == ISD::TRUNCATE)
> +      && TLI.isTypeLegal(Value.getOperand(0).getValueType()) &&
> +      Value.Val->hasOneUse() && ST->isUnindexed() &&
> +      TLI.isTruncStoreLegal(Value.getOperand(0).getValueType(),
> +                            ST->getStoredVT())) {

For example, this will assert if ST->getStoredVT() >= 32, eg an apfloat (!).  Also,
before legalize this could be done whether all these guys are legal or not I suppose.

> +      case Expand:
> +        // Just store the low part.  This may become a non-trunc store, so make
> +        // sure to use getTruncStore, not UpdateNodeOperands below.
> +        ExpandOp(ST->getValue(), Tmp3, Tmp4);
> +        return DAG.getTruncStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(),
> +                                 SVOffset, MVT::i8, isVolatile, Alignment);

This may be wrong for apints, since the expanded value type may be smaller than
ST->getStoredVT(), eg if you are expanding i64, and ST->getStoredVT() is i40.  I
can take care of this.

Ciao,

Duncan.



More information about the llvm-commits mailing list