brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 008d73e Raw
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