[PATCH] R600: Bug 20982 - Avoid undefined left shift of negative value

Tom Stellard tom at stellard.net
Thu Sep 18 06:57:32 PDT 2014


On Thu, Sep 18, 2014 at 12:36:56AM +0000, Matt Arsenault wrote:
> I'm not sure what the hardware actually does, so don't bother trying to fold it for now.

LGTM.

> 
> http://reviews.llvm.org/D5388
> 
> 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
> @@ -2048,16 +2048,23 @@
>        return DAG.getZeroExtendInReg(BitsFrom, DL, SmallVT);
>      }
>  
> -    if (ConstantSDNode *Val = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
> +    if (ConstantSDNode *CVal = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
>        if (Signed) {
> +        // 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->getSExtValue(),
> +                                        Val,
>                                          OffsetVal,
>                                          WidthVal);
>        }
>  
>        return constantFoldBFE<uint32_t>(DAG,
> -                                       Val->getZExtValue(),
> +                                       CVal->getZExtValue(),
>                                         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
> @@ -1,9 +1,6 @@
>  ; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
>  ; RUN: llc -march=r600 -mcpu=redwood -show-mc-encoding -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
>  
> -; http://llvm.org/bugs/show_bug.cgi?id=20982
> -; REQUIRES: not_ubsan
> -
>  declare i32 @llvm.AMDGPU.bfe.i32(i32, i32, i32) nounwind readnone
>  
>  ; FUNC-LABEL: @bfe_i32_arg_arg_arg
> @@ -373,12 +370,13 @@
>    ret void
>  }
>  
> +; FIXME: This should fold to something
>  ; FUNC-LABEL: @bfe_i32_constant_fold_test_16
> -; SI-NOT: BFE
> -; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], -1
> +; SI: S_BFE_I32 [[SREG:s[0-9]+]], -1, 0x70001
> +; SI: V_MOV_B32_e32 [[VREG:v[0-9]+]], [[SREG]]
>  ; 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