[PATCH] R600: Better fix for bug 20982

Tom Stellard tom at stellard.net
Thu Sep 18 17:37:27 PDT 2014


On Thu, Sep 18, 2014 at 05:01:31PM +0000, Matt Arsenault wrote:
> Just do the left shift as unsigned to avoid the UB.
> 

LGTM.

> http://reviews.llvm.org/D5398
> 
> Files:
>   lib/Target/R600/AMDGPUISelLowering.cpp
>   test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll

> Index: lib/Target/R600/AMDGPUISelLowering.cpp
> ===================================================================
> --- lib/Target/R600/AMDGPUISelLowering.cpp
> +++ lib/Target/R600/AMDGPUISelLowering.cpp
> @@ -1896,7 +1896,8 @@
>  static SDValue constantFoldBFE(SelectionDAG &DAG, IntTy Src0,
>                                 uint32_t Offset, uint32_t Width) {
>    if (Width + Offset < 32) {
> -    IntTy Result = (Src0 << (32 - Offset - Width)) >> (32 - Width);
> +    uint32_t Shl = static_cast<uint32_t>(Src0) << (32 - Offset - Width);
> +    IntTy Result = static_cast<IntTy>(Shl) >> (32 - Width);
>      return DAG.getConstant(Result, MVT::i32);
>    }
>  
> @@ -2053,12 +2054,8 @@
>          // Avoid undefined left shift of a negative in the constant fold.
>          // TODO: I'm not sure what the behavior of the hardware is, this should
>          // probably follow that instead.
> -        int32_t Val = CVal->getSExtValue();
> -        if (Val < 0)
> -          return SDValue();
> -
>          return constantFoldBFE<int32_t>(DAG,
> -                                        Val,
> +                                        CVal->getSExtValue(),
>                                          OffsetVal,
>                                          WidthVal);
>        }
> Index: test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll
> ===================================================================
> --- test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll
> +++ test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll
> @@ -370,13 +370,12 @@
>    ret void
>  }
>  
> -; FIXME: This should fold to something
>  ; FUNC-LABEL: @bfe_i32_constant_fold_test_16
> -; SI: S_BFE_I32 [[SREG:s[0-9]+]], -1, 0x70001
> -; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], [[SREG]]
> +; SI-NOT: BFE
> +; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
>  ; SI: BUFFER_STORE_DWORD [[VREG]],
>  ; SI: S_ENDPGM
> -
> +; EG-NOT: BFE
>  define void @bfe_i32_constant_fold_test_16(i32 addrspace(1)* %out) nounwind {
>    %bfe_i32 = call i32 @llvm.AMDGPU.bfe.i32(i32 4294967295, i32 1, i32 7) nounwind readnone
>    store i32 %bfe_i32, i32 addrspace(1)* %out, align 4

> _______________________________________________
> 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