[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