224 lines · plain
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s2 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"4 5%struct = type { i32, i32, i32 }6 7; CHECK-LABEL: test_simple8 9; CHECK-DAG: MayAlias: %struct* %st, i32* %x10; CHECK-DAG: MayAlias: %struct* %st, i32* %y11; CHECK-DAG: MayAlias: %struct* %st, i32* %z12 13; CHECK-DAG: NoAlias: i32* %x, i32* %y14; CHECK-DAG: NoAlias: i32* %x, i32* %z15; CHECK-DAG: NoAlias: i32* %y, i32* %z16 17; CHECK-DAG: MayAlias: %struct* %st, %struct* %y18; CHECK-DAG: MayAlias: i32* %x, %struct* %y19; CHECK-DAG: MayAlias: i32* %x, i80* %y20 21; CHECK-DAG: MayAlias: %struct* %st, i64* %y22; CHECK-DAG: MayAlias: i64* %y, i32* %z23; CHECK-DAG: NoAlias: i32* %x, i64* %y24 25; CHECK-DAG: MustAlias: %struct* %y, i32* %y26; CHECK-DAG: MustAlias: i64* %y, i32* %y27; CHECK-DAG: MustAlias: i80* %y, i32* %y28 29define void @test_simple(ptr %st, i64 %i, i64 %j, i64 %k) {30 %x = getelementptr inbounds %struct, ptr %st, i64 %i, i32 031 %y = getelementptr inbounds %struct, ptr %st, i64 %j, i32 132 %z = getelementptr inbounds %struct, ptr %st, i64 %k, i32 233 load %struct, ptr %st34 load i32, ptr %x35 load i32, ptr %y36 load i32, ptr %z37 load %struct, ptr %y38 load i80, ptr %y39 load i64, ptr %y40 ret void41}42 43; As the GEP is not inbounds, these pointers may alias due to overflow.44; CHECK-LABEL: test_not_inbounds45; CHECK: MayAlias: i32* %x, i32* %y46define void @test_not_inbounds(ptr %st, i64 %i, i64 %j, i64 %k) {47 %x = getelementptr %struct, ptr %st, i64 %i, i32 048 %y = getelementptr %struct, ptr %st, i64 %j, i32 149 load i32, ptr %x50 load i32, ptr %y51 ret void52}53 54; It is sufficient to have nusw instead of inbounds.55; CHECK-LABEL: test_nusw56; CHECK: NoAlias: i32* %x, i32* %y57define void @test_nusw(ptr %st, i64 %i, i64 %j, i64 %k) {58 %x = getelementptr nusw %struct, ptr %st, i64 %i, i32 059 %y = getelementptr nusw %struct, ptr %st, i64 %j, i32 160 load i32, ptr %x61 load i32, ptr %y62 ret void63}64 65; CHECK-LABEL: test_in_array66 67; CHECK-DAG: MayAlias: [1 x %struct]* %st, i32* %x68; CHECK-DAG: MayAlias: [1 x %struct]* %st, i32* %y69; CHECK-DAG: MayAlias: [1 x %struct]* %st, i32* %z70 71; CHECK-DAG: NoAlias: i32* %x, i32* %y72; CHECK-DAG: NoAlias: i32* %x, i32* %z73; CHECK-DAG: NoAlias: i32* %y, i32* %z74 75; CHECK-DAG: MayAlias: [1 x %struct]* %st, %struct* %y76; CHECK-DAG: MayAlias: i32* %x, %struct* %y77; CHECK-DAG: MayAlias: i32* %x, i80* %y78 79; CHECK-DAG: MayAlias: [1 x %struct]* %st, i64* %y80; CHECK-DAG: MayAlias: i64* %y, i32* %z81; CHECK-DAG: NoAlias: i32* %x, i64* %y82 83; CHECK-DAG: MustAlias: %struct* %y, i32* %y84; CHECK-DAG: MustAlias: i64* %y, i32* %y85; CHECK-DAG: MustAlias: i80* %y, i32* %y86 87define void @test_in_array(ptr %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1) {88 %x = getelementptr inbounds [1 x %struct], ptr %st, i64 %i, i64 %i1, i32 089 %y = getelementptr inbounds [1 x %struct], ptr %st, i64 %j, i64 %j1, i32 190 %z = getelementptr inbounds [1 x %struct], ptr %st, i64 %k, i64 %k1, i32 291 load [1 x %struct], ptr %st92 load i32, ptr %x93 load i32, ptr %y94 load i32, ptr %z95 load %struct, ptr %y96 load i80, ptr %y97 load i64, ptr %y98 ret void99}100 101; CHECK-LABEL: test_in_3d_array102 103; CHECK-DAG: MayAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %x104; CHECK-DAG: MayAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %y105; CHECK-DAG: MayAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %z106 107; CHECK-DAG: NoAlias: i32* %x, i32* %y108; CHECK-DAG: NoAlias: i32* %x, i32* %z109; CHECK-DAG: NoAlias: i32* %y, i32* %z110 111; CHECK-DAG: MayAlias: [1 x [1 x [1 x %struct]]]* %st, %struct* %y112; CHECK-DAG: MayAlias: i32* %x, %struct* %y113; CHECK-DAG: MayAlias: i32* %x, i80* %y114 115; CHECK-DAG: MayAlias: [1 x [1 x [1 x %struct]]]* %st, i64* %y116; CHECK-DAG: MayAlias: i64* %y, i32* %z117; CHECK-DAG: NoAlias: i32* %x, i64* %y118 119; CHECK-DAG: MustAlias: %struct* %y, i32* %y120; CHECK-DAG: MustAlias: i64* %y, i32* %y121; CHECK-DAG: MustAlias: i80* %y, i32* %y122 123define void @test_in_3d_array(ptr %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %j2, i64 %k2, i64 %i3, i64 %j3, i64 %k3) {124 %x = getelementptr inbounds [1 x [1 x [1 x %struct]]], ptr %st, i64 %i, i64 %i1, i64 %i2, i64 %i3, i32 0125 %y = getelementptr inbounds [1 x [1 x [1 x %struct]]], ptr %st, i64 %j, i64 %j1, i64 %j2, i64 %j3, i32 1126 %z = getelementptr inbounds [1 x [1 x [1 x %struct]]], ptr %st, i64 %k, i64 %k1, i64 %k2, i64 %k3, i32 2127 load [1 x [1 x [1 x %struct]]], ptr %st128 load i32, ptr %x129 load i32, ptr %y130 load i32, ptr %z131 load %struct, ptr %y132 load i80, ptr %y133 load i64, ptr %y134 ret void135}136 137; CHECK-LABEL: test_same_underlying_object_same_indices138 139; CHECK-DAG: NoAlias: i32* %x, i32* %x2140; CHECK-DAG: NoAlias: i32* %y, i32* %y2141; CHECK-DAG: NoAlias: i32* %z, i32* %z2142 143; CHECK-DAG: NoAlias: i32* %x, i32* %y2144; CHECK-DAG: NoAlias: i32* %x, i32* %z2145 146; CHECK-DAG: NoAlias: i32* %x2, i32* %y147; CHECK-DAG: NoAlias: i32* %y, i32* %z2148 149; CHECK-DAG: NoAlias: i32* %x2, i32* %z150; CHECK-DAG: NoAlias: i32* %y2, i32* %z151 152define void @test_same_underlying_object_same_indices(ptr %st, i64 %i, i64 %j, i64 %k) {153 %st2 = getelementptr inbounds %struct, ptr %st, i32 10154 %x2 = getelementptr inbounds %struct, ptr %st2, i64 %i, i32 0155 %y2 = getelementptr inbounds %struct, ptr %st2, i64 %j, i32 1156 %z2 = getelementptr inbounds %struct, ptr %st2, i64 %k, i32 2157 %x = getelementptr inbounds %struct, ptr %st, i64 %i, i32 0158 %y = getelementptr inbounds %struct, ptr %st, i64 %j, i32 1159 %z = getelementptr inbounds %struct, ptr %st, i64 %k, i32 2160 load i32, ptr %x161 load i32, ptr %y162 load i32, ptr %z163 load i32, ptr %x2164 load i32, ptr %y2165 load i32, ptr %z2166 ret void167}168 169; CHECK-LABEL: test_same_underlying_object_different_indices170 171; CHECK-DAG: MayAlias: i32* %x, i32* %x2172; CHECK-DAG: MayAlias: i32* %y, i32* %y2173; CHECK-DAG: MayAlias: i32* %z, i32* %z2174 175; CHECK-DAG: NoAlias: i32* %x, i32* %y2176; CHECK-DAG: NoAlias: i32* %x, i32* %z2177 178; CHECK-DAG: NoAlias: i32* %x2, i32* %y179; CHECK-DAG: NoAlias: i32* %y, i32* %z2180 181; CHECK-DAG: NoAlias: i32* %x2, i32* %z182; CHECK-DAG: NoAlias: i32* %y2, i32* %z183 184define void @test_same_underlying_object_different_indices(ptr %st, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %k2, i64 %j2) {185 %st2 = getelementptr inbounds %struct, ptr %st, i32 10186 %x2 = getelementptr inbounds %struct, ptr %st2, i64 %i2, i32 0187 %y2 = getelementptr inbounds %struct, ptr %st2, i64 %j2, i32 1188 %z2 = getelementptr inbounds %struct, ptr %st2, i64 %k2, i32 2189 %x = getelementptr inbounds %struct, ptr %st, i64 %i1, i32 0190 %y = getelementptr inbounds %struct, ptr %st, i64 %j1, i32 1191 %z = getelementptr inbounds %struct, ptr %st, i64 %k1, i32 2192 load i32, ptr %x193 load i32, ptr %y194 load i32, ptr %z195 load i32, ptr %x2196 load i32, ptr %y2197 load i32, ptr %z2198 ret void199}200 201 202%struct2 = type { [1 x { i32, i32 }], [2 x { i32 }] }203 204; CHECK-LABEL: test_struct_in_array205; CHECK-DAG: MustAlias: i32* %x, i32* %y206define void @test_struct_in_array(ptr %st, i64 %i, i64 %j, i64 %k) {207 %x = getelementptr inbounds %struct2, ptr %st, i32 0, i32 1, i32 1, i32 0208 %y = getelementptr inbounds %struct2, ptr %st, i32 0, i32 0, i32 1, i32 1209 load i32, ptr %x210 load i32, ptr %y211 ret void212}213 214; PR27418 - Treat GEP indices with the same value but different types the same215; CHECK-LABEL: test_different_index_types216; CHECK: MustAlias: i16* %tmp1, i16* %tmp2217define void @test_different_index_types(ptr %arr) {218 %tmp1 = getelementptr inbounds [2 x i16], ptr %arr, i16 0, i32 1219 %tmp2 = getelementptr inbounds [2 x i16], ptr %arr, i16 0, i16 1220 load i16, ptr %tmp1221 load i16, ptr %tmp2222 ret void223}224