[llvm] r293542 - LSR: Don't drop address space when type doesn't match
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 1 14:12:06 PST 2017
Merged in r293819 as requested in PR31804.
On Mon, Jan 30, 2017 at 11:50 AM, Matt Arsenault via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: arsenm
> Date: Mon Jan 30 13:50:17 2017
> New Revision: 293542
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293542&view=rev
> Log:
> LSR: Don't drop address space when type doesn't match
>
> For targets with different addressing modes in each address space,
> if this is dropped querying isLegalAddressingMode later with this
> will give a nonsense result, breaking the isLegalUse assertions.
>
> This is a candidate for the 4.0 release branch.
>
> Added:
> llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll
> Modified:
> llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=293542&r1=293541&r2=293542&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Jan 30 13:50:17 2017
> @@ -158,8 +158,9 @@ struct MemAccessTy {
>
> bool operator!=(MemAccessTy Other) const { return !(*this == Other); }
>
> - static MemAccessTy getUnknown(LLVMContext &Ctx) {
> - return MemAccessTy(Type::getVoidTy(Ctx), UnknownAddressSpace);
> + static MemAccessTy getUnknown(LLVMContext &Ctx,
> + unsigned AS = UnknownAddressSpace) {
> + return MemAccessTy(Type::getVoidTy(Ctx), AS);
> }
> };
>
> @@ -2284,8 +2285,10 @@ bool LSRInstance::reconcileNewOffset(LSR
> // TODO: Be less conservative when the type is similar and can use the same
> // addressing modes.
> if (Kind == LSRUse::Address) {
> - if (AccessTy != LU.AccessTy)
> - NewAccessTy = MemAccessTy::getUnknown(AccessTy.MemTy->getContext());
> + if (AccessTy.MemTy != LU.AccessTy.MemTy) {
> + NewAccessTy = MemAccessTy::getUnknown(AccessTy.MemTy->getContext(),
> + AccessTy.AddrSpace);
> + }
> }
>
> // Conservatively assume HasBaseReg is true for now.
>
> Added: llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll?rev=293542&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll (added)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll Mon Jan 30 13:50:17 2017
> @@ -0,0 +1,54 @@
> +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -loop-reduce %s | FileCheck %s
> +
> +; Test for assert resulting from inconsistent isLegalAddressingMode
> +; answers when the address space was dropped from the query.
> +
> +target datalayout = "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"
> +
> +%0 = type { i32, double, i32, float }
> +
> +; CHECK-LABEL: @lsr_crash_preserve_addrspace_unknown_type(
> +; CHECK: %tmp4 = bitcast %0 addrspace(3)* %tmp to double addrspace(3)*
> +; CHECK: %scevgep5 = getelementptr double, double addrspace(3)* %tmp4, i32 1
> +; CHEC: load double, double addrspace(3)* %scevgep5
> +
> +; CHECK: %scevgep = getelementptr i32, i32 addrspace(3)* %tmp1, i32 4
> +; CHECK:%tmp14 = load i32, i32 addrspace(3)* %scevgep
> +define void @lsr_crash_preserve_addrspace_unknown_type() #0 {
> +bb:
> + br label %bb1
> +
> +bb1: ; preds = %bb17, %bb
> + %tmp = phi %0 addrspace(3)* [ undef, %bb ], [ %tmp18, %bb17 ]
> + %tmp2 = getelementptr inbounds %0, %0 addrspace(3)* %tmp, i64 0, i32 1
> + %tmp3 = load double, double addrspace(3)* %tmp2, align 8
> + br label %bb4
> +
> +bb4: ; preds = %bb1
> + br i1 undef, label %bb8, label %bb5
> +
> +bb5: ; preds = %bb4
> + unreachable
> +
> +bb8: ; preds = %bb4
> + %tmp9 = getelementptr inbounds %0, %0 addrspace(3)* %tmp, i64 0, i32 0
> + %tmp10 = load i32, i32 addrspace(3)* %tmp9, align 4
> + %tmp11 = icmp eq i32 0, %tmp10
> + br i1 %tmp11, label %bb12, label %bb17
> +
> +bb12: ; preds = %bb8
> + %tmp13 = getelementptr inbounds %0, %0 addrspace(3)* %tmp, i64 0, i32 2
> + %tmp14 = load i32, i32 addrspace(3)* %tmp13, align 4
> + %tmp15 = icmp eq i32 0, %tmp14
> + br i1 %tmp15, label %bb16, label %bb17
> +
> +bb16: ; preds = %bb12
> + unreachable
> +
> +bb17: ; preds = %bb12, %bb8
> + %tmp18 = getelementptr inbounds %0, %0 addrspace(3)* %tmp, i64 2
> + br label %bb1
> +}
> +
> +attributes #0 = { nounwind }
> +attributes #1 = { nounwind readnone }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list