From a0d765778901472fbe0ea324110d96e8d239913a Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Fri, 21 Oct 2016 20:25:11 +0000 Subject: [PATCH] AMDGPU/SI: Fix crash caused by r284267 Reviewers: arsenm, nhaehnle Subscribers: kzhuravl, wdng, nhaehnle, yaxunl, tony-tye, llvm-commits Differential Revision: https://reviews.llvm.org/D25782 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284875 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/AMDGPUISelLowering.cpp | 5 +++-- test/CodeGen/AMDGPU/mul_int24.ll | 25 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/lib/Target/AMDGPU/AMDGPUISelLowering.cpp index ac6c7e33fb3d..a7fd748e85d5 100644 --- a/lib/Target/AMDGPU/AMDGPUISelLowering.cpp +++ b/lib/Target/AMDGPU/AMDGPUISelLowering.cpp @@ -2631,8 +2631,9 @@ SDValue AMDGPUTargetLowering::PerformDAGCombine(SDNode *N, case AMDGPUISD::MUL_U24: case AMDGPUISD::MULHI_I24: case AMDGPUISD::MULHI_U24: { - simplifyI24(N, 0, DCI); - simplifyI24(N, 1, DCI); + // If the first call to simplify is successfull, then N may end up being + // deleted, so we shouldn't call simplifyI24 again. + simplifyI24(N, 0, DCI) || simplifyI24(N, 1, DCI); return SDValue(); } case AMDGPUISD::MUL_LOHI_I24: diff --git a/test/CodeGen/AMDGPU/mul_int24.ll b/test/CodeGen/AMDGPU/mul_int24.ll index 4503e86209b6..0beb9524ed79 100644 --- a/test/CodeGen/AMDGPU/mul_int24.ll +++ b/test/CodeGen/AMDGPU/mul_int24.ll @@ -146,4 +146,29 @@ entry: store i32 %trunc, i32 addrspace(1)* %out ret void } + +; GCN-LABEL: {{^}}simplify_i24_crash: +; GCN: v_mul_i32_i24_e32 v[[VAL_LO:[0-9]+]] +; GCN: v_mov_b32_e32 v[[VAL_HI:[0-9]+]], v[[VAL_LO]] +; GCN: buffer_store_dwordx2 v{{\[}}[[VAL_LO]]:[[VAL_HI]]{{\]}} +define void @simplify_i24_crash(<2 x i32> addrspace(1)* %out, i32 %arg0, <2 x i32> %arg1, <2 x i32> %arg2) { +bb: + %cmp = icmp eq i32 %arg0, 0 + br i1 %cmp, label %bb11, label %bb7 + +bb11: + %tmp14 = shufflevector <2 x i32> %arg1, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp16 = shufflevector <2 x i32> %arg2, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp17 = shl <2 x i32> %tmp14, + %tmp18 = ashr <2 x i32> %tmp17, + %tmp19 = shl <2 x i32> %tmp16, + %tmp20 = ashr <2 x i32> %tmp19, + %tmp21 = mul <2 x i32> %tmp18, %tmp20 + store <2 x i32> %tmp21, <2 x i32> addrspace(1)* %out + br label %bb7 + +bb7: + ret void + +} attributes #0 = { nounwind }