159 lines · plain
1; RUN: opt -passes=aa-eval -aa-pipeline=nvptx-aa -print-all-alias-modref-info < %s -S 2>&1 \2; RUN: | FileCheck %s --check-prefixes CHECK-ALIAS3;4; RUN: opt -aa-pipeline=nvptx-aa -passes=licm < %s -S | FileCheck %s --check-prefixes CHECK-AA-CONST5; RUN: opt -aa-pipeline=basic-aa -passes=licm < %s -S | FileCheck %s --check-prefixes CHECK-NOAA-CONST6 7target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"8target triple = "nvptx64-nvidia-cuda"9 10; CHECK-ALIAS-LABEL: Function: test11; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global12; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(3)* %shared13; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(3)* %shared14; CHECK-ALIAS: MayAlias: i8 addrspace(4)* %const, i8* %gen15; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(1)* %global16; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(3)* %shared17; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(5)* %local18; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(5)* %local19; CHECK-ALIAS: NoAlias: i8 addrspace(5)* %local, i8 addrspace(3)* %shared20; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(5)* %local21; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(7)* %shared_cluster22; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(7)* %shared_cluster23; CHECK-ALIAS: MayAlias: i8 addrspace(3)* %shared, i8 addrspace(7)* %shared_cluster24; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(7)* %shared_cluster25; CHECK-ALIAS: NoAlias: i8 addrspace(5)* %local, i8 addrspace(7)* %shared_cluster26; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(101)* %param27; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(101)* %param28; CHECK-ALIAS: NoAlias: i8 addrspace(101)* %param, i8 addrspace(3)* %shared29; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(101)* %param30; CHECK-ALIAS: NoAlias: i8 addrspace(5)* %local, i8 addrspace(101)* %param31; CHECK-ALIAS: NoAlias: i8 addrspace(101)* %param, i8 addrspace(7)* %shared_cluster32 33define i8 @test_alias(ptr %gen, ptr addrspace(1) %global, ptr addrspace(3) %shared, ptr addrspace(4) %const, ptr addrspace(5) %local, ptr addrspace(7) %shared_cluster) {34 %param = addrspacecast ptr %gen to ptr addrspace(101)35 %v1 = load i8, ptr %gen36 %v2 = load i8, ptr addrspace(1) %global37 %v3 = load i8, ptr addrspace(3) %shared38 %v4 = load i8, ptr addrspace(4) %const39 %v5 = load i8, ptr addrspace(5) %local40 %v6 = load i8, ptr addrspace(7) %shared_cluster41 %v7 = load i8, ptr addrspace(101) %param42 %res1 = add i8 %v1, %v243 %res2 = add i8 %res1, %v344 %res3 = add i8 %res2, %v445 %res4 = add i8 %res3, %v546 %res5 = add i8 %res4, %v647 %res6 = add i8 %res4, %v748 ret i8 %res549}50 51; CHECK-ALIAS-LABEL: Function: test_const52; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global53; CHECK-ALIAS: NoAlias: i8 addrspace(4)* %const, i8 addrspace(1)* %global54; CHECK-ALIAS: MayAlias: i8 addrspace(4)* %const, i8* %gen55;56define i8 @test_const(ptr %gen, ptr addrspace(1) %global, ptr addrspace(4) %const) {57;58; Even though %gen and %const may alias and there is a store to %gen,59; LICM should be able to hoist %load_const because it is known to be60; constant (AA::pointsToConstantMemory()).61;62; CHECK-AA-CONST-LABEL: @test_const63; CHECK-AA-CONST-LABEL: entry64; CHECK-AA-CONST: %[[LOAD_CONST:.+]] = load i8, ptr addrspace(4)65; CHECK-AA-CONST-LABEL: loop66; CHECK-AA-CONST: add {{.*}}%[[LOAD_CONST]]67;68; Without NVPTX AA the load is left in the loop because we assume that69; it may be clobbered by the store.70;71; CHECK-NOAA-CONST-LABEL: @test_const72; CHECK-NOAA-CONST-LABEL: loop73; CHECK-NOAA-CONST: %[[LOAD_CONST:.+]] = load i8, ptr addrspace(4)74; CHECK-NOAA-CONST: add {{.*}}%[[LOAD_CONST]]75entry:76 br label %loop77loop:78 %v = phi i8 [0, %entry], [%v2, %loop]79 %load_global = load i8, ptr addrspace(1) %global80 store i8 %load_global, ptr %gen81 %load_const = load i8, ptr addrspace(4) %const82 %v2 = add i8 %v, %load_const83 %cond = icmp eq i8 %load_const, 084 br i1 %cond, label %done, label %loop85done:86 ret i8 %v287}88 89; Same as @test_const above, but for param space.90;91; CHECK-ALIAS-LABEL: Function: test_param92; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(1)* %global93; CHECK-ALIAS: NoAlias: i8 addrspace(1)* %global, i8 addrspace(101)* %param94; CHECK-ALIAS: MayAlias: i8* %gen, i8 addrspace(101)* %param95;96define i8 @test_param(ptr %gen, ptr addrspace(1) %global, ptr %param_gen) {97;98; CHECK-AA-CONST-LABEL: @test_param99; CHECK-AA-CONST-LABEL: entry100; CHECK-AA-CONST: %[[LOAD_PARAM:.+]] = load i8, ptr addrspace(101)101; CHECK-AA-CONST-LABEL: loop102; CHECK-AA-CONST: add {{.*}}%[[LOAD_PARAM]]103;104; CHECK-NOAA-CONST-LABEL: @test_param105; CHECK-NOAA-CONST-LABEL: loop106; CHECK-NOAA-CONST: %[[LOAD_PARAM:.+]] = load i8, ptr addrspace(101)107; CHECK-NOAA-CONST: add {{.*}}%[[LOAD_PARAM]]108entry:109 %param = addrspacecast ptr %param_gen to ptr addrspace(101)110 br label %loop111loop:112 %v = phi i8 [0, %entry], [%v2, %loop]113 %load_global = load i8, ptr addrspace(1) %global114 store i8 %load_global, ptr %gen115 %load_const = load i8, ptr addrspace(101) %param116 %v2 = add i8 %v, %load_const117 %cond = icmp eq i8 %load_const, 0118 br i1 %cond, label %done, label %loop119done:120 ret i8 %v2121}122 123;; Address space information may be encoded anywhere along the UD chain.124;; We define a set of tests that:125;; 1. Perform some number of address space casts on pointer A and B126;; 2. Store a value to address A127;; 3. Store a value to address B (that we know does not alias with A)128 129;; generic->space130; CHECK-ALIAS-LABEL: Function: test_traversal_gen_space131; CHECK-ALIAS: NoAlias: i32 addrspace(1)* %global, i32 addrspace(5)* %local132define void @test_traversal_gen_space(ptr %gen, ptr addrspace(1) %global) {133 %local = addrspacecast ptr %gen to ptr addrspace(5)134 store i32 1, ptr addrspace(5) %local, align 8135 store i32 5, ptr addrspace(1) %global, align 8136 ret void137}138 139;; space->generic140; CHECK-ALIAS-LABEL: Function: test_traversal_space_gen141; CHECK-ALIAS: NoAlias: i32* %gen, i32 addrspace(1)* %global142define void @test_traversal_space_gen(ptr addrspace(5) %local, ptr addrspace(1) %global) {143 %gen = addrspacecast ptr addrspace(5) %local to ptr144 store i32 2, ptr %gen, align 8145 store i32 5, ptr addrspace(1) %global, align 8146 ret void147}148 149;; generic->space->generic150; CHECK-ALIAS-LABEL: Function: test_traversal_gen_space_gen151; CHECK-ALIAS: NoAlias: i32* %gen2, i32 addrspace(1)* %global152define void @test_traversal_gen_space_gen(ptr %gen1, ptr addrspace(1) %global) {153 %local = addrspacecast ptr %gen1 to ptr addrspace(5)154 %gen2 = addrspacecast ptr addrspace(5) %local to ptr155 store i32 3, ptr %gen2, align 8156 store i32 5, ptr addrspace(1) %global, align 8157 ret void158}159