113 lines
4.5 KiB
LLVM
113 lines
4.5 KiB
LLVM
; RUN: opt -passes=aa-eval -aa-pipeline=nvptx-aa -print-all-alias-modref-info < %s -S 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefixes CHECK-ALIAS
|
|
;
|
|
; RUN: opt -aa-pipeline=nvptx-aa -passes=licm < %s -S | FileCheck %s --check-prefixes CHECK-AA-CONST
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=licm < %s -S | FileCheck %s --check-prefixes CHECK-NOAA-CONST
|
|
|
|
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
|
|
target triple = "nvptx64-nvidia-cuda"
|
|
|
|
; CHECK-ALIAS-LABEL: Function: test
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(3)* %shared
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(3)* %shared
|
|
; CHECK-ALIAS: MayAlias: i8 addrspace(4)* %const, i8* %gen
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(1)* %global
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(3)* %shared
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(5)* %local
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(5)* %local
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(5)* %local, i8 addrspace(3)* %shared
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(5)* %local
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(101)* %param
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(101)* %param
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(101)* %param, i8 addrspace(3)* %shared
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(101)* %param
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(5)* %local, i8 addrspace(101)* %param
|
|
|
|
define i8 @test_alias(ptr %gen, ptr addrspace(1) %global, ptr addrspace(3) %shared, ptr addrspace(4) %const, ptr addrspace(5) %local) {
|
|
%param = addrspacecast ptr %gen to ptr addrspace(101)
|
|
%v1 = load i8, ptr %gen
|
|
%v2 = load i8, ptr addrspace(1) %global
|
|
%v3 = load i8, ptr addrspace(3) %shared
|
|
%v4 = load i8, ptr addrspace(4) %const
|
|
%v5 = load i8, ptr addrspace(5) %local
|
|
%v6 = load i8, ptr addrspace(101) %param
|
|
%res1 = add i8 %v1, %v2
|
|
%res2 = add i8 %res1, %v3
|
|
%res3 = add i8 %res2, %v4
|
|
%res4 = add i8 %res3, %v5
|
|
%res5 = add i8 %res4, %v6
|
|
ret i8 %res5
|
|
}
|
|
|
|
; CHECK-ALIAS-LABEL: Function: test_const
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(1)* %global
|
|
; CHECK-ALIAS: MayAlias: i8 addrspace(4)* %const, i8* %gen
|
|
;
|
|
define i8 @test_const(ptr %gen, ptr addrspace(1) %global, ptr addrspace(4) %const) {
|
|
;
|
|
; Even though %gen and %const may alias and there is a store to %gen,
|
|
; LICM should be able to hoist %load_const because it is known to be
|
|
; constant (AA::pointsToConstantMemory()).
|
|
;
|
|
; CHECK-AA-CONST-LABEL: @test_const
|
|
; CHECK-AA-CONST-LABEL: entry
|
|
; CHECK-AA-CONST: %[[LOAD_CONST:.+]] = load i8, ptr addrspace(4)
|
|
; CHECK-AA-CONST-LABEL: loop
|
|
; CHECK-AA-CONST: add {{.*}}%[[LOAD_CONST]]
|
|
;
|
|
; Without NVPTX AA the load is left in the loop because we assume that
|
|
; it may be clobbered by the store.
|
|
;
|
|
; CHECK-NOAA-CONST-LABEL: @test_const
|
|
; CHECK-NOAA-CONST-LABEL: loop
|
|
; CHECK-NOAA-CONST: %[[LOAD_CONST:.+]] = load i8, ptr addrspace(4)
|
|
; CHECK-NOAA-CONST: add {{.*}}%[[LOAD_CONST]]
|
|
entry:
|
|
br label %loop
|
|
loop:
|
|
%v = phi i8 [0, %entry], [%v2, %loop]
|
|
%load_global = load i8, ptr addrspace(1) %global
|
|
store i8 %load_global, ptr %gen
|
|
%load_const = load i8, ptr addrspace(4) %const
|
|
%v2 = add i8 %v, %load_const
|
|
%cond = icmp eq i8 %load_const, 0
|
|
br i1 %cond, label %done, label %loop
|
|
done:
|
|
ret i8 %v2
|
|
}
|
|
|
|
; Same as @test_const above, but for param space.
|
|
;
|
|
; CHECK-ALIAS-LABEL: Function: test_param
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global
|
|
; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(101)* %param
|
|
; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(101)* %param
|
|
;
|
|
define i8 @test_param(ptr %gen, ptr addrspace(1) %global, ptr %param_gen) {
|
|
;
|
|
; CHECK-AA-CONST-LABEL: @test_param
|
|
; CHECK-AA-CONST-LABEL: entry
|
|
; CHECK-AA-CONST: %[[LOAD_PARAM:.+]] = load i8, ptr addrspace(101)
|
|
; CHECK-AA-CONST-LABEL: loop
|
|
; CHECK-AA-CONST: add {{.*}}%[[LOAD_PARAM]]
|
|
;
|
|
; CHECK-NOAA-CONST-LABEL: @test_param
|
|
; CHECK-NOAA-CONST-LABEL: loop
|
|
; CHECK-NOAA-CONST: %[[LOAD_PARAM:.+]] = load i8, ptr addrspace(101)
|
|
; CHECK-NOAA-CONST: add {{.*}}%[[LOAD_PARAM]]
|
|
entry:
|
|
%param = addrspacecast ptr %param_gen to ptr addrspace(101)
|
|
br label %loop
|
|
loop:
|
|
%v = phi i8 [0, %entry], [%v2, %loop]
|
|
%load_global = load i8, ptr addrspace(1) %global
|
|
store i8 %load_global, ptr %gen
|
|
%load_const = load i8, ptr addrspace(101) %param
|
|
%v2 = add i8 %v, %load_const
|
|
%cond = icmp eq i8 %load_const, 0
|
|
br i1 %cond, label %done, label %loop
|
|
done:
|
|
ret i8 %v2
|
|
}
|