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-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "thumbv7--linux-gnueabi" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_zext_sext_amounts255 6*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 7*9880d681SAndroid Build Coastguard Workerdefine void @test_zext_sext_amounts255(i8* %mem) { 8*9880d681SAndroid Build Coastguard Worker %sext.1 = sext i8 255 to i16 9*9880d681SAndroid Build Coastguard Worker %sext.zext.1 = zext i16 %sext.1 to i64 10*9880d681SAndroid Build Coastguard Worker %sext.2 = sext i8 255 to i32 11*9880d681SAndroid Build Coastguard Worker %sext.zext.2 = zext i32 %sext.2 to i64 12*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %sext.zext.1 13*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %sext.zext.2 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_zext_sext_amounts 18*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i8* %a, i8* %b 19*9880d681SAndroid Build Coastguard Worker; %a and %b only PartialAlias as, although they're both zext(sext(%num)) they'll extend the sign by a different 20*9880d681SAndroid Build Coastguard Worker; number of bits before zext-ing the remainder. 21*9880d681SAndroid Build Coastguard Workerdefine void @test_zext_sext_amounts(i8* %mem, i8 %num) { 22*9880d681SAndroid Build Coastguard Worker %sext.1 = sext i8 %num to i16 23*9880d681SAndroid Build Coastguard Worker %sext.zext.1 = zext i16 %sext.1 to i64 24*9880d681SAndroid Build Coastguard Worker %sext.2 = sext i8 %num to i32 25*9880d681SAndroid Build Coastguard Worker %sext.zext.2 = zext i32 %sext.2 to i64 26*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %sext.zext.1 27*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %sext.zext.2 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: based_on_pr18068 32*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 33*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %c 34*9880d681SAndroid Build Coastguard Workerdefine void @based_on_pr18068(i32 %loaded, i8* %mem) { 35*9880d681SAndroid Build Coastguard Worker %loaded.64 = zext i32 %loaded to i64 36*9880d681SAndroid Build Coastguard Worker %add1 = add i32 %loaded, -1 ; unsigned wraps unless %loaded == 0 37*9880d681SAndroid Build Coastguard Worker %add1.64 = zext i32 %add1 to i64 ; is zext(%loaded) always != zext(%loaded - 1)? Yes -> NoAlias 38*9880d681SAndroid Build Coastguard Worker %sub1 = sub i32 %loaded, 1 ; unsigned wraps iff %loaded == 0 39*9880d681SAndroid Build Coastguard Worker %sub1.64 = zext i32 %sub1 to i64 ; is zext(%loaded) always != zext(%loaded - 1)? Yes -> NoAlias 40*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %loaded.64 41*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %add1.64 42*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds i8, i8* %mem, i64 %sub1.64 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_path_dependence 47*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i8* %a, i8* %b 48*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i8* %a, i8* %c 49*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i8* %a, i8* %d 50*9880d681SAndroid Build Coastguard Workerdefine void @test_path_dependence(i32 %p, i8* %mem) { 51*9880d681SAndroid Build Coastguard Worker %p.minus1 = add i32 %p, -1 ; this will always unsigned-wrap, unless %p == 0 52*9880d681SAndroid Build Coastguard Worker %p.minus1.64 = zext i32 %p.minus1 to i64 53*9880d681SAndroid Build Coastguard Worker %p.64.again = add i64 %p.minus1.64, 1 ; either %p (if we wrapped) or 4294967296 (if we didn't) 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker %p.nsw.nuw.minus1 = sub nsw nuw i32 %p, 1 ; as nuw we know %p >= 1, and as nsw %p <= 2147483647 56*9880d681SAndroid Build Coastguard Worker %p.nsw.nuw.minus1.64 = zext i32 %p.nsw.nuw.minus1 to i64 57*9880d681SAndroid Build Coastguard Worker %p.nsw.nuw.64.again = add nsw nuw i64 %p.nsw.nuw.minus1.64, 1 ; ...so always exactly %p 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker %p.nsw.minus1 = sub nsw i32 %p, 1 ; only nsw, so can only guarantee %p != 0x10000000 60*9880d681SAndroid Build Coastguard Worker %p.nsw.minus1.64 = zext i32 %p.nsw.minus1 to i64 ; when %p > 0x10000000 (ie <= 0 as a signed number) then the zext will make this a huge positive number 61*9880d681SAndroid Build Coastguard Worker %p.nsw.64.again = add nsw i64 %p.nsw.minus1.64, 1 ; ...and so this is very much != %p 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker %p.64 = zext i32 %p to i64 64*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %p.64 65*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %p.64.again 66*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds i8, i8* %mem, i64 %p.nsw.nuw.64.again 67*9880d681SAndroid Build Coastguard Worker %d = getelementptr inbounds i8, i8* %mem, i64 %p.nsw.64.again 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_zext_sext_255 72*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b 73*9880d681SAndroid Build Coastguard Workerdefine void @test_zext_sext_255(i8* %mem) { 74*9880d681SAndroid Build Coastguard Worker %zext.255 = zext i8 255 to i16 ; 0x00FF 75*9880d681SAndroid Build Coastguard Worker %sext.255 = sext i8 255 to i16 ; 0xFFFF 76*9880d681SAndroid Build Coastguard Worker %zext.sext.255 = zext i16 %sext.255 to i32 ; 0x0000FFFF 77*9880d681SAndroid Build Coastguard Worker %sext.zext.255 = sext i16 %zext.255 to i32 ; 0x000000FF 78*9880d681SAndroid Build Coastguard Worker %zext.zext.sext.255 = zext i32 %zext.sext.255 to i64 79*9880d681SAndroid Build Coastguard Worker %zext.sext.zext.255 = zext i32 %sext.zext.255 to i64 80*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %zext.zext.sext.255 81*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %zext.sext.zext.255 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_zext_sext_num 86*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i8* %a, i8* %b 87*9880d681SAndroid Build Coastguard Worker; %a and %b NoAlias if %num == 255 (see @test_zext_sext_255), but %a and %b NoAlias for other values of %num (e.g. 0) 88*9880d681SAndroid Build Coastguard Workerdefine void @test_zext_sext_num(i8* %mem, i8 %num) { 89*9880d681SAndroid Build Coastguard Worker %zext.num = zext i8 %num to i16 90*9880d681SAndroid Build Coastguard Worker %sext.num = sext i8 %num to i16 91*9880d681SAndroid Build Coastguard Worker %zext.sext.num = zext i16 %sext.num to i32 92*9880d681SAndroid Build Coastguard Worker %sext.zext.num = sext i16 %zext.num to i32 93*9880d681SAndroid Build Coastguard Worker %zext.zext.sext.num = zext i32 %zext.sext.num to i64 94*9880d681SAndroid Build Coastguard Worker %zext.sext.zext.num = zext i32 %sext.zext.num to i64 95*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i64 %zext.zext.sext.num 96*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i64 %zext.sext.zext.num 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uncompressStream 101*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i8* %a, i8* %b 102*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %c 103*9880d681SAndroid Build Coastguard Workerdefine void @uncompressStream(i8* %mem) { 104*9880d681SAndroid Build Coastguard Worker %zext.255 = zext i8 255 to i32 105*9880d681SAndroid Build Coastguard Worker %sext.255 = sext i8 255 to i32 106*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i8, i8* %mem, i32 255 107*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i8, i8* %mem, i32 %zext.255 108*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds i8, i8* %mem, i32 %sext.255 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: constantOffsetHeuristic_i3_i32 113*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %b 114*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %c 115*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %b, i32* %c 116*9880d681SAndroid Build Coastguard Workerdefine void @constantOffsetHeuristic_i3_i32(i32* %mem, i3 %val) { 117*9880d681SAndroid Build Coastguard Worker %zext.plus.7 = add nsw i3 %val, 7 118*9880d681SAndroid Build Coastguard Worker %zext.plus.4 = add nsw i3 %val, 4 119*9880d681SAndroid Build Coastguard Worker %zext.val = zext i3 %val to i32 120*9880d681SAndroid Build Coastguard Worker %zext.4 = zext i3 %zext.plus.4 to i32 121*9880d681SAndroid Build Coastguard Worker %zext.7 = zext i3 %zext.plus.7 to i32 122*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i32, i32* %mem, i32 %zext.4 123*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i32, i32* %mem, i32 %zext.7 124*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds i32, i32* %mem, i32 %zext.val 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: constantOffsetHeuristic_i8_i32 129*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %b 130*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %c 131*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %b, i32* %c 132*9880d681SAndroid Build Coastguard Workerdefine void @constantOffsetHeuristic_i8_i32(i32* %mem, i8 %val) { 133*9880d681SAndroid Build Coastguard Worker %zext.plus.7 = add nsw i8 %val, 7 134*9880d681SAndroid Build Coastguard Worker %zext.plus.4 = add nsw i8 %val, 4 135*9880d681SAndroid Build Coastguard Worker %zext.val = zext i8 %val to i32 136*9880d681SAndroid Build Coastguard Worker %zext.4 = zext i8 %zext.plus.4 to i32 137*9880d681SAndroid Build Coastguard Worker %zext.7 = zext i8 %zext.plus.7 to i32 138*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds i32, i32* %mem, i32 %zext.4 139*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds i32, i32* %mem, i32 %zext.7 140*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds i32, i32* %mem, i32 %zext.val 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: constantOffsetHeuristic_i3_i8 145*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32* %a, i32* %b 146*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %c 147*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32* %b, i32* %c 148*9880d681SAndroid Build Coastguard Workerdefine void @constantOffsetHeuristic_i3_i8(i8* %mem, i3 %val) { 149*9880d681SAndroid Build Coastguard Worker %zext.plus.7 = add nsw i3 %val, 7 150*9880d681SAndroid Build Coastguard Worker %zext.plus.4 = add nsw i3 %val, 4 151*9880d681SAndroid Build Coastguard Worker %zext.val = zext i3 %val to i32 152*9880d681SAndroid Build Coastguard Worker %zext.4 = zext i3 %zext.plus.4 to i32 153*9880d681SAndroid Build Coastguard Worker %zext.7 = zext i3 %zext.plus.7 to i32 154*9880d681SAndroid Build Coastguard Worker %a.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.4 155*9880d681SAndroid Build Coastguard Worker %b.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.7 156*9880d681SAndroid Build Coastguard Worker %c.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.val 157*9880d681SAndroid Build Coastguard Worker %a = bitcast i8* %a.8 to i32* 158*9880d681SAndroid Build Coastguard Worker %b = bitcast i8* %b.8 to i32* 159*9880d681SAndroid Build Coastguard Worker %c = bitcast i8* %c.8 to i32* 160*9880d681SAndroid Build Coastguard Worker ret void 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: constantOffsetHeuristic_i8_i8 164*9880d681SAndroid Build Coastguard Worker; CHECK: PartialAlias: i32* %a, i32* %b 165*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %a, i32* %c 166*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i32* %b, i32* %c 167*9880d681SAndroid Build Coastguard Workerdefine void @constantOffsetHeuristic_i8_i8(i8* %mem, i8 %val) { 168*9880d681SAndroid Build Coastguard Worker %zext.plus.7 = add nsw i8 %val, 7 169*9880d681SAndroid Build Coastguard Worker %zext.plus.4 = add nsw i8 %val, 4 170*9880d681SAndroid Build Coastguard Worker %zext.val = zext i8 %val to i32 171*9880d681SAndroid Build Coastguard Worker %zext.4 = zext i8 %zext.plus.4 to i32 172*9880d681SAndroid Build Coastguard Worker %zext.7 = zext i8 %zext.plus.7 to i32 173*9880d681SAndroid Build Coastguard Worker %a.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.4 174*9880d681SAndroid Build Coastguard Worker %b.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.7 175*9880d681SAndroid Build Coastguard Worker %c.8 = getelementptr inbounds i8, i8* %mem, i32 %zext.val 176*9880d681SAndroid Build Coastguard Worker %a = bitcast i8* %a.8 to i32* 177*9880d681SAndroid Build Coastguard Worker %b = bitcast i8* %b.8 to i32* 178*9880d681SAndroid Build Coastguard Worker %c = bitcast i8* %c.8 to i32* 179*9880d681SAndroid Build Coastguard Worker ret void 180*9880d681SAndroid Build Coastguard Worker} 181