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 Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_zext 6*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @test_with_zext() { 9*9880d681SAndroid Build Coastguard Worker %1 = tail call i8* @malloc(i64 120) 10*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %1, i64 8 11*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds i8, i8* %1, i64 16 12*9880d681SAndroid Build Coastguard Worker %3 = zext i32 3 to i64 13*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %2, i64 %3 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_lshr 18*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine void @test_with_lshr(i64 %i) { 21*9880d681SAndroid Build Coastguard Worker %1 = tail call i8* @malloc(i64 120) 22*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %1, i64 8 23*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds i8, i8* %1, i64 16 24*9880d681SAndroid Build Coastguard Worker %3 = lshr i64 %i, 2 25*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %2, i64 %3 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_a_loop 30*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine void @test_with_a_loop(i8* %mem) { 33*9880d681SAndroid Build Coastguard Worker br label %for.loop 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerfor.loop: 36*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] 37*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 8 38*9880d681SAndroid Build Coastguard Worker %a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16 39*9880d681SAndroid Build Coastguard Worker %i.64 = zext i32 %i to i64 40*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64 41*9880d681SAndroid Build Coastguard Worker %i.plus1 = add nuw nsw i32 %i, 1 42*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %i.plus1, 10 43*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.loop.exit, label %for.loop 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerfor.loop.exit: 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_varying_base_pointer_in_loop 50*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine void @test_with_varying_base_pointer_in_loop(i8* %mem.orig) { 53*9880d681SAndroid Build Coastguard Worker br label %for.loop 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerfor.loop: 56*9880d681SAndroid Build Coastguard Worker %mem = phi i8* [ %mem.orig, %0 ], [ %mem.plus1, %for.loop ] 57*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] 58*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 8 59*9880d681SAndroid Build Coastguard Worker %a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16 60*9880d681SAndroid Build Coastguard Worker %i.64 = zext i32 %i to i64 61*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64 62*9880d681SAndroid Build Coastguard Worker %i.plus1 = add nuw nsw i32 %i, 1 63*9880d681SAndroid Build Coastguard Worker %mem.plus1 = getelementptr inbounds i8, i8* %mem, i64 8 64*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %i.plus1, 10 65*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.loop.exit, label %for.loop 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerfor.loop.exit: 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_sign_extension 72*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i64* %b.i64, i8* %a 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine void @test_sign_extension(i32 %p) { 75*9880d681SAndroid Build Coastguard Worker %1 = tail call i8* @malloc(i64 120) 76*9880d681SAndroid Build Coastguard Worker %p.64 = zext i32 %p to i64 77*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %1, i64 %p.64 78*9880d681SAndroid Build Coastguard Worker %p.minus1 = add i32 %p, -1 79*9880d681SAndroid Build Coastguard Worker %p.minus1.64 = zext i32 %p.minus1 to i64 80*9880d681SAndroid Build Coastguard Worker %b.i8 = getelementptr inbounds i8, i8* %1, i64 %p.minus1.64 81*9880d681SAndroid Build Coastguard Worker %b.i64 = bitcast i8* %b.i8 to i64* 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fe_tools 86*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32* %a, i32* %b 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine void @test_fe_tools([8 x i32]* %values) { 89*9880d681SAndroid Build Coastguard Worker br label %reorder 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerfor.loop: 92*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %reorder ], [ %i.next, %for.loop ] 93*9880d681SAndroid Build Coastguard Worker %idxprom = zext i32 %i to i64 94*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 %idxprom 95*9880d681SAndroid Build Coastguard Worker %i.next = add nuw nsw i32 %i, 1 96*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %i.next, 10 97*9880d681SAndroid Build Coastguard Worker br i1 %1, label %for.loop.exit, label %for.loop 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerreorder: 100*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 1 101*9880d681SAndroid Build Coastguard Worker br label %for.loop 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerfor.loop.exit: 104*9880d681SAndroid Build Coastguard Worker ret void 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker@b = global i32 0, align 4 108*9880d681SAndroid Build Coastguard Worker@d = global i32 0, align 4 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_spec2006 111*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32** %x, i32** %y 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine void @test_spec2006() { 114*9880d681SAndroid Build Coastguard Worker %h = alloca [1 x [2 x i32*]], align 16 115*9880d681SAndroid Build Coastguard Worker %d.val = load i32, i32* @d, align 4 116*9880d681SAndroid Build Coastguard Worker %d.promoted = sext i32 %d.val to i64 117*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %d.val, 2 118*9880d681SAndroid Build Coastguard Worker br i1 %1, label %.lr.ph, label %3 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker.lr.ph: ; preds = %0 121*9880d681SAndroid Build Coastguard Worker br label %2 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; <label>:2 ; preds = %.lr.ph, %2 124*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ %d.val, %.lr.ph ], [ %i.plus1, %2 ] 125*9880d681SAndroid Build Coastguard Worker %i.promoted = sext i32 %i to i64 126*9880d681SAndroid Build Coastguard Worker %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %d.promoted, i64 %i.promoted 127*9880d681SAndroid Build Coastguard Worker %i.plus1 = add nsw i32 %i, 1 128*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.plus1, 2 129*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %2, label %3 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; <label>:3 ; preds = %._crit_edge, %0 132*9880d681SAndroid Build Coastguard Worker %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_easy_case 137*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32** %x, i32** %y 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_easy_case(i64 %i) { 140*9880d681SAndroid Build Coastguard Worker %h = alloca [1 x [2 x i32*]], align 16 141*9880d681SAndroid Build Coastguard Worker %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i, i64 0 142*9880d681SAndroid Build Coastguard Worker %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 143*9880d681SAndroid Build Coastguard Worker ret void 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_in_loop 147*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32** %x, i32** %y 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_in_loop() { 150*9880d681SAndroid Build Coastguard Worker %h = alloca [1 x [2 x i32*]], align 16 151*9880d681SAndroid Build Coastguard Worker br label %for.loop 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerfor.loop: 154*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] 155*9880d681SAndroid Build Coastguard Worker %i.promoted = sext i32 %i to i64 156*9880d681SAndroid Build Coastguard Worker %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 0 157*9880d681SAndroid Build Coastguard Worker %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 158*9880d681SAndroid Build Coastguard Worker %i.plus1 = add nsw i32 %i, 1 159*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.plus1, 2 160*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.loop, label %for.loop.exit 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerfor.loop.exit: 163*9880d681SAndroid Build Coastguard Worker ret void 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_with_global 167*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32** %x, i32** %y 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_with_global() { 170*9880d681SAndroid Build Coastguard Worker %h = alloca [1 x [2 x i32*]], align 16 171*9880d681SAndroid Build Coastguard Worker %b = load i32, i32* @b, align 4 172*9880d681SAndroid Build Coastguard Worker %b.promoted = sext i32 %b to i64 173*9880d681SAndroid Build Coastguard Worker br label %for.loop 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerfor.loop: 176*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] 177*9880d681SAndroid Build Coastguard Worker %i.promoted = sext i32 %i to i64 178*9880d681SAndroid Build Coastguard Worker %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 %b.promoted 179*9880d681SAndroid Build Coastguard Worker %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 180*9880d681SAndroid Build Coastguard Worker %i.plus1 = add nsw i32 %i, 1 181*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.plus1, 2 182*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.loop, label %for.loop.exit 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerfor.loop.exit: 185*9880d681SAndroid Build Coastguard Worker ret void 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_const_eval 189*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 190*9880d681SAndroid Build Coastguard Workerdefine void @test_const_eval(i8* %ptr, i64 %offset) { 191*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %ptr, i64 %offset 192*9880d681SAndroid Build Coastguard Worker %a.dup = getelementptr inbounds i8, i8* %ptr, i64 %offset 193*9880d681SAndroid Build Coastguard Worker %three = zext i32 3 to i64 194*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %a.dup, i64 %three 195*9880d681SAndroid Build Coastguard Worker ret void 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_const_eval_scaled 199*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i8* %a, i8* %b 200*9880d681SAndroid Build Coastguard Workerdefine void @test_const_eval_scaled(i8* %ptr) { 201*9880d681SAndroid Build Coastguard Worker %three = zext i32 3 to i64 202*9880d681SAndroid Build Coastguard Worker %six = mul i64 %three, 2 203*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %ptr, i64 %six 204*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %ptr, i64 6 205*9880d681SAndroid Build Coastguard Worker ret void 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: foo 209*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: float* %arrayidx, float* %arrayidx4.84 210*9880d681SAndroid Build Coastguard Workerdefine float @foo(i32 *%A, float %rend, float** %wayar) { 211*9880d681SAndroid Build Coastguard Workerentry: 212*9880d681SAndroid Build Coastguard Worker %x0 = load i32, i32* %A, align 4 213*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %x0 to i64 214*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i64 %conv, 3 215*9880d681SAndroid Build Coastguard Worker %call = tail call i8* @malloc(i64 %mul) 216*9880d681SAndroid Build Coastguard Worker %x1 = bitcast i8* %call to float* 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %x0, -1 219*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %sub to i64 220*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %x1, i64 %idxprom 221*9880d681SAndroid Build Coastguard Worker store float %rend, float* %arrayidx, align 8 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker %indvars.iv76.83 = add nsw i64 %conv, -1 224*9880d681SAndroid Build Coastguard Worker %arrayidx4.84 = getelementptr inbounds float, float* %x1, i64 %indvars.iv76.83 225*9880d681SAndroid Build Coastguard Worker %x4 = load float, float* %arrayidx4.84, align 8 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker ret float %x4 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 231*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @malloc(i64) 232