[llvm] r218057 - R600: Bug 20982 - Avoid undefined left shift of negative value
Matt Arsenault
Matthew.Arsenault at amd.com
Thu Sep 18 08:52:27 PDT 2014
Author: arsenm
Date: Thu Sep 18 10:52:26 2014
New Revision: 218057
URL: http://llvm.org/viewvc/llvm-project?rev=218057&view=rev
Log:
R600: Bug 20982 - Avoid undefined left shift of negative value
I'm not sure what the hardware actually does, so don't
bother trying to fold it for now.
Modified:
llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp
llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll
Modified: llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp?rev=218057&r1=218056&r2=218057&view=diff
==============================================================================
--- llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp Thu Sep 18 10:52:26 2014
@@ -2048,16 +2048,23 @@ SDValue AMDGPUTargetLowering::PerformDAG
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);
}
Modified: llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll?rev=218057&r1=218056&r2=218057&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll (original)
+++ llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.bfe.i32.ll Thu Sep 18 10:52:26 2014
@@ -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 @@ define void @bfe_i32_constant_fold_test_
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
More information about the llvm-commits
mailing list