[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