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-p:32:32-f64:32:64-f80:32-n8:16:32-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "i386-unknown-linux-gnu" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i32* @random.i32(i32* %ptr) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: arr: 9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %alloca, i32* %p0 10*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %alloca, i32* %p1 11*9880d681SAndroid Build Coastguard Workerdefine void @arr() { 12*9880d681SAndroid Build Coastguard Worker %alloca = alloca i32, i32 4 13*9880d681SAndroid Build Coastguard Worker %random = call i32* @random.i32(i32* %alloca) 14*9880d681SAndroid Build Coastguard Worker %p0 = getelementptr inbounds i32, i32* %random, i32 0 15*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %random, i32 1 16*9880d681SAndroid Build Coastguard Worker ret void 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: arg: 20*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %arg, i32* %p0 21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %arg, i32* %p1 22*9880d681SAndroid Build Coastguard Workerdefine void @arg(i32* %arg) { 23*9880d681SAndroid Build Coastguard Worker %random = call i32* @random.i32(i32* %arg) 24*9880d681SAndroid Build Coastguard Worker %p0 = getelementptr inbounds i32, i32* %random, i32 0 25*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %random, i32 1 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker@gv = global i32 1 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: global: 31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %p0, i32* @gv 32*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %p1, i32* @gv 33*9880d681SAndroid Build Coastguard Workerdefine void @global() { 34*9880d681SAndroid Build Coastguard Worker %random = call i32* @random.i32(i32* @gv) 35*9880d681SAndroid Build Coastguard Worker %p0 = getelementptr inbounds i32, i32* %random, i32 0 36*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %random, i32 1 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: struct: 41*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %f0, i32* %p0 42*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %f1, i32* %p0 43*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %f0, i32* %p1 44*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %f1, i32* %p1 45*9880d681SAndroid Build Coastguard Worker%struct = type { i32, i32, i32 } 46*9880d681SAndroid Build Coastguard Workerdefine void @struct() { 47*9880d681SAndroid Build Coastguard Worker %alloca = alloca %struct 48*9880d681SAndroid Build Coastguard Worker %alloca.i32 = bitcast %struct* %alloca to i32* 49*9880d681SAndroid Build Coastguard Worker %random = call i32* @random.i32(i32* %alloca.i32) 50*9880d681SAndroid Build Coastguard Worker %f0 = getelementptr inbounds %struct, %struct* %alloca, i32 0, i32 0 51*9880d681SAndroid Build Coastguard Worker %f1 = getelementptr inbounds %struct, %struct* %alloca, i32 0, i32 1 52*9880d681SAndroid Build Coastguard Worker %p0 = getelementptr inbounds i32, i32* %random, i32 0 53*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %random, i32 1 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: complex1: 58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %a2.0, i32* %r2.0 59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %a2.0, i32* %r2.1 60*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %a2.0, i32* %r2.i 61*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %a2.0, i32* %r2.1i 62*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %a1, i32* %r2.0 63*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %a1, i32* %r2.1 64*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %a1, i32* %r2.i 65*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %a1, i32* %r2.1i 66*9880d681SAndroid Build Coastguard Worker%complex = type { i32, i32, [4 x i32] } 67*9880d681SAndroid Build Coastguard Workerdefine void @complex1(i32 %i) { 68*9880d681SAndroid Build Coastguard Worker %alloca = alloca %complex 69*9880d681SAndroid Build Coastguard Worker %alloca.i32 = bitcast %complex* %alloca to i32* 70*9880d681SAndroid Build Coastguard Worker %r.i32 = call i32* @random.i32(i32* %alloca.i32) 71*9880d681SAndroid Build Coastguard Worker %random = bitcast i32* %r.i32 to %complex* 72*9880d681SAndroid Build Coastguard Worker %a1 = getelementptr inbounds %complex, %complex* %alloca, i32 0, i32 1 73*9880d681SAndroid Build Coastguard Worker %a2.0 = getelementptr inbounds %complex, %complex* %alloca, i32 0, i32 2, i32 0 74*9880d681SAndroid Build Coastguard Worker %r2.0 = getelementptr inbounds %complex, %complex* %random, i32 0, i32 2, i32 0 75*9880d681SAndroid Build Coastguard Worker %r2.1 = getelementptr inbounds %complex, %complex* %random, i32 0, i32 2, i32 1 76*9880d681SAndroid Build Coastguard Worker %r2.i = getelementptr inbounds %complex, %complex* %random, i32 0, i32 2, i32 %i 77*9880d681SAndroid Build Coastguard Worker %r2.1i = getelementptr inbounds i32, i32* %r2.1, i32 %i 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: complex2: 82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %alloca, i32* %p120 83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %alloca, i32* %pi20 84*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %alloca, i32* %pij1 85*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MayAlias: i32* %a3, i32* %pij1 86*9880d681SAndroid Build Coastguard Worker%inner = type { i32, i32 } 87*9880d681SAndroid Build Coastguard Worker%outer = type { i32, i32, [10 x %inner] } 88*9880d681SAndroid Build Coastguard Workerdeclare %outer* @rand_outer(i32* %p) 89*9880d681SAndroid Build Coastguard Workerdefine void @complex2(i32 %i, i32 %j) { 90*9880d681SAndroid Build Coastguard Worker %alloca = alloca i32, i32 128 91*9880d681SAndroid Build Coastguard Worker %a3 = getelementptr inbounds i32, i32* %alloca, i32 3 92*9880d681SAndroid Build Coastguard Worker %random = call %outer* @rand_outer(i32* %alloca) 93*9880d681SAndroid Build Coastguard Worker %p120 = getelementptr inbounds %outer, %outer* %random, i32 1, i32 2, i32 2, i32 0 94*9880d681SAndroid Build Coastguard Worker %pi20 = getelementptr inbounds %outer, %outer* %random, i32 %i, i32 2, i32 2, i32 0 95*9880d681SAndroid Build Coastguard Worker %pij1 = getelementptr inbounds %outer, %outer* %random, i32 %i, i32 2, i32 %j, i32 1 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99