1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%struct = type { i32, i32, i32 } 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_simple 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %x 10*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %y 11*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %z 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y 14*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z 15*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, %struct* %y_12 18*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x 19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i64* %y_8 22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8 23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y 26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8 27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine void @test_simple(%struct* %st, i64 %i, i64 %j, i64 %k) { 30*9880d681SAndroid Build Coastguard Worker %x = getelementptr %struct, %struct* %st, i64 %i, i32 0 31*9880d681SAndroid Build Coastguard Worker %y = getelementptr %struct, %struct* %st, i64 %j, i32 1 32*9880d681SAndroid Build Coastguard Worker %z = getelementptr %struct, %struct* %st, i64 %k, i32 2 33*9880d681SAndroid Build Coastguard Worker %y_12 = bitcast i32* %y to %struct* 34*9880d681SAndroid Build Coastguard Worker %y_10 = bitcast i32* %y to i80* 35*9880d681SAndroid Build Coastguard Worker %y_8 = bitcast i32* %y to i64* 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_in_array 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %x 42*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %y 43*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %z 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y 46*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z 47*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x %struct]* %st 50*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x 51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i64* %y_8 54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8 55*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y 58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8 59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine void @test_in_array([1 x %struct]* %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1) { 62*9880d681SAndroid Build Coastguard Worker %x = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %i, i64 %i1, i32 0 63*9880d681SAndroid Build Coastguard Worker %y = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %j, i64 %j1, i32 1 64*9880d681SAndroid Build Coastguard Worker %z = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %k, i64 %k1, i32 2 65*9880d681SAndroid Build Coastguard Worker %y_12 = bitcast i32* %y to %struct* 66*9880d681SAndroid Build Coastguard Worker %y_10 = bitcast i32* %y to i80* 67*9880d681SAndroid Build Coastguard Worker %y_8 = bitcast i32* %y to i64* 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_in_3d_array 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %x 74*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %y 75*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %z 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y 78*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z 79*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x [1 x [1 x %struct]]]* %st 82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x 83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i64* %y_8 86*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8 87*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y 90*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8 91*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine void @test_in_3d_array([1 x [1 x [1 x %struct]]]* %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) { 94*9880d681SAndroid Build Coastguard Worker %x = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %i, i64 %i1, i64 %i2, i64 %i3, i32 0 95*9880d681SAndroid Build Coastguard Worker %y = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %j, i64 %j1, i64 %j2, i64 %j3, i32 1 96*9880d681SAndroid Build Coastguard Worker %z = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %k, i64 %k1, i64 %k2, i64 %k3, i32 2 97*9880d681SAndroid Build Coastguard Worker %y_12 = bitcast i32* %y to %struct* 98*9880d681SAndroid Build Coastguard Worker %y_10 = bitcast i32* %y to i80* 99*9880d681SAndroid Build Coastguard Worker %y_8 = bitcast i32* %y to i64* 100*9880d681SAndroid Build Coastguard Worker ret void 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_same_underlying_object_same_indices 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %x2 106*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %y2 107*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %z, i32* %z2 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %y2 110*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %z2 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %y 113*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %z2 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %z 116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y2, i32* %z 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine void @test_same_underlying_object_same_indices(%struct* %st, i64 %i, i64 %j, i64 %k) { 119*9880d681SAndroid Build Coastguard Worker %st2 = getelementptr %struct, %struct* %st, i32 10 120*9880d681SAndroid Build Coastguard Worker %x2 = getelementptr %struct, %struct* %st2, i64 %i, i32 0 121*9880d681SAndroid Build Coastguard Worker %y2 = getelementptr %struct, %struct* %st2, i64 %j, i32 1 122*9880d681SAndroid Build Coastguard Worker %z2 = getelementptr %struct, %struct* %st2, i64 %k, i32 2 123*9880d681SAndroid Build Coastguard Worker %x = getelementptr %struct, %struct* %st, i64 %i, i32 0 124*9880d681SAndroid Build Coastguard Worker %y = getelementptr %struct, %struct* %st, i64 %j, i32 1 125*9880d681SAndroid Build Coastguard Worker %z = getelementptr %struct, %struct* %st, i64 %k, i32 2 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_same_underlying_object_different_indices 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %x2 132*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %y2 133*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i32* %z2 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %y2 136*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %z2 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %y 139*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %z2 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %z 142*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y2, i32* %z 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine void @test_same_underlying_object_different_indices(%struct* %st, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %k2, i64 %j2) { 145*9880d681SAndroid Build Coastguard Worker %st2 = getelementptr %struct, %struct* %st, i32 10 146*9880d681SAndroid Build Coastguard Worker %x2 = getelementptr %struct, %struct* %st2, i64 %i2, i32 0 147*9880d681SAndroid Build Coastguard Worker %y2 = getelementptr %struct, %struct* %st2, i64 %j2, i32 1 148*9880d681SAndroid Build Coastguard Worker %z2 = getelementptr %struct, %struct* %st2, i64 %k2, i32 2 149*9880d681SAndroid Build Coastguard Worker %x = getelementptr %struct, %struct* %st, i64 %i1, i32 0 150*9880d681SAndroid Build Coastguard Worker %y = getelementptr %struct, %struct* %st, i64 %j1, i32 1 151*9880d681SAndroid Build Coastguard Worker %z = getelementptr %struct, %struct* %st, i64 %k1, i32 2 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker%struct2 = type { [1 x { i32, i32 }], [2 x { i32 }] } 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_struct_in_array 159*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %x, i32* %y 160*9880d681SAndroid Build Coastguard Workerdefine void @test_struct_in_array(%struct2* %st, i64 %i, i64 %j, i64 %k) { 161*9880d681SAndroid Build Coastguard Worker %x = getelementptr %struct2, %struct2* %st, i32 0, i32 1, i32 1, i32 0 162*9880d681SAndroid Build Coastguard Worker %y = getelementptr %struct2, %struct2* %st, i32 0, i32 0, i32 1, i32 1 163*9880d681SAndroid Build Coastguard Worker ret void 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; PR27418 - Treat GEP indices with the same value but different types the same 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_different_index_types 168*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i16* %tmp1, i16* %tmp2 169*9880d681SAndroid Build Coastguard Workerdefine void @test_different_index_types([2 x i16]* %arr) { 170*9880d681SAndroid Build Coastguard Worker %tmp1 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i32 1 171*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i16 1 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174