215 lines · plain
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s2target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"3target triple = "thumbv7--linux-gnueabi"4 5; CHECK-LABEL: test_zext_sext_amounts2556; CHECK: NoAlias: i8* %a, i8* %b7define void @test_zext_sext_amounts255(ptr %mem) {8 %sext.1 = sext i8 255 to i169 %sext.zext.1 = zext i16 %sext.1 to i6410 %sext.2 = sext i8 255 to i3211 %sext.zext.2 = zext i32 %sext.2 to i6412 %a = getelementptr inbounds i8, ptr %mem, i64 %sext.zext.113 %b = getelementptr inbounds i8, ptr %mem, i64 %sext.zext.214 load i8, ptr %a15 load i8, ptr %b16 ret void17}18 19; CHECK-LABEL: test_zext_sext_amounts20; CHECK: MayAlias: i8* %a, i8* %b21; %a and %b only PartialAlias as, although they're both zext(sext(%num)) they'll extend the sign by a different22; number of bits before zext-ing the remainder.23define void @test_zext_sext_amounts(ptr %mem, i8 %num) {24 %sext.1 = sext i8 %num to i1625 %sext.zext.1 = zext i16 %sext.1 to i6426 %sext.2 = sext i8 %num to i3227 %sext.zext.2 = zext i32 %sext.2 to i6428 %a = getelementptr inbounds i8, ptr %mem, i64 %sext.zext.129 %b = getelementptr inbounds i8, ptr %mem, i64 %sext.zext.230 load i8, ptr %a31 load i8, ptr %b32 ret void33}34 35; CHECK-LABEL: based_on_pr1806836; CHECK: NoAlias: i8* %a, i8* %b37; CHECK: NoAlias: i8* %a, i8* %c38define void @based_on_pr18068(i32 %loaded, ptr %mem) {39 %loaded.64 = zext i32 %loaded to i6440 %add1 = add i32 %loaded, -1 ; unsigned wraps unless %loaded == 041 %add1.64 = zext i32 %add1 to i64 ; is zext(%loaded) always != zext(%loaded - 1)? Yes -> NoAlias42 %sub1 = sub i32 %loaded, 1 ; unsigned wraps iff %loaded == 043 %sub1.64 = zext i32 %sub1 to i64 ; is zext(%loaded) always != zext(%loaded - 1)? Yes -> NoAlias44 %a = getelementptr inbounds i8, ptr %mem, i64 %loaded.6445 %b = getelementptr inbounds i8, ptr %mem, i64 %add1.6446 %c = getelementptr inbounds i8, ptr %mem, i64 %sub1.6447 load i8, ptr %a48 load i8, ptr %b49 load i8, ptr %c50 ret void51}52 53; CHECK-LABEL: test_path_dependence54; CHECK: MayAlias: i8* %a, i8* %b55; CHECK: MustAlias: i8* %a, i8* %c56; CHECK: MayAlias: i8* %a, i8* %d57define void @test_path_dependence(i16 %p, ptr %mem) {58 %p.minus1 = add i16 %p, -1 ; this will always unsigned-wrap, unless %p == 059 %p.minus1.64 = zext i16 %p.minus1 to i6460 %p.64.again = add i64 %p.minus1.64, 1 ; either %p (if we wrapped) or 65536 (if we didn't)61 62 %p.nsw.nuw.minus1 = sub nsw nuw i16 %p, 1 ; as nuw we know %p >= 1, and as nsw %p <= 3276763 %p.nsw.nuw.minus1.64 = zext i16 %p.nsw.nuw.minus1 to i6464 %p.nsw.nuw.64.again = add nsw nuw i64 %p.nsw.nuw.minus1.64, 1 ; ...so always exactly %p65 66 %p.nsw.minus1 = sub nsw i16 %p, 1 ; only nsw, so can only guarantee %p != 0x100067 %p.nsw.minus1.64 = zext i16 %p.nsw.minus1 to i64 ; when %p > 0x1000 (ie <= 0 as a signed number) then the zext will make this a huge positive number68 %p.nsw.64.again = add nsw i64 %p.nsw.minus1.64, 1 ; ...and so this is very much != %p69 70 %p.64 = zext i16 %p to i6471 %a = getelementptr inbounds i8, ptr %mem, i64 %p.6472 %b = getelementptr inbounds i8, ptr %mem, i64 %p.64.again73 %c = getelementptr inbounds i8, ptr %mem, i64 %p.nsw.nuw.64.again74 %d = getelementptr inbounds i8, ptr %mem, i64 %p.nsw.64.again75 load i8, ptr %a76 load i8, ptr %b77 load i8, ptr %c78 load i8, ptr %d79 ret void80}81 82; CHECK-LABEL: test_zext_sext_25583; CHECK: NoAlias: i8* %a, i8* %b84define void @test_zext_sext_255(ptr %mem) {85 %zext.255 = zext i8 255 to i16 ; 0x00FF86 %sext.255 = sext i8 255 to i16 ; 0xFFFF87 %zext.sext.255 = zext i16 %sext.255 to i32 ; 0x0000FFFF88 %sext.zext.255 = sext i16 %zext.255 to i32 ; 0x000000FF89 %zext.zext.sext.255 = zext i32 %zext.sext.255 to i6490 %zext.sext.zext.255 = zext i32 %sext.zext.255 to i6491 %a = getelementptr inbounds i8, ptr %mem, i64 %zext.zext.sext.25592 %b = getelementptr inbounds i8, ptr %mem, i64 %zext.sext.zext.25593 load i8, ptr %a94 load i8, ptr %b95 ret void96}97 98; CHECK-LABEL: test_zext_sext_num99; CHECK: MayAlias: i8* %a, i8* %b100; %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)101define void @test_zext_sext_num(ptr %mem, i8 %num) {102 %zext.num = zext i8 %num to i16103 %sext.num = sext i8 %num to i16104 %zext.sext.num = zext i16 %sext.num to i32105 %sext.zext.num = sext i16 %zext.num to i32106 %zext.zext.sext.num = zext i32 %zext.sext.num to i64107 %zext.sext.zext.num = zext i32 %sext.zext.num to i64108 %a = getelementptr inbounds i8, ptr %mem, i64 %zext.zext.sext.num109 %b = getelementptr inbounds i8, ptr %mem, i64 %zext.sext.zext.num110 load i8, ptr %a111 load i8, ptr %b112 ret void113}114 115; CHECK-LABEL: uncompressStream116; CHECK: MustAlias: i8* %a, i8* %b117; CHECK: NoAlias: i8* %a, i8* %c118define void @uncompressStream(ptr %mem) {119 %zext.255 = zext i8 255 to i32120 %sext.255 = sext i8 255 to i32121 %a = getelementptr inbounds i8, ptr %mem, i32 255122 %b = getelementptr inbounds i8, ptr %mem, i32 %zext.255123 %c = getelementptr inbounds i8, ptr %mem, i32 %sext.255124 load i8, ptr %a125 load i8, ptr %b126 load i8, ptr %c127 ret void128}129 130; CHECK-LABEL: constantOffsetHeuristic_i3_i32131; CHECK: NoAlias: i32* %a, i32* %b132; CHECK: NoAlias: i32* %a, i32* %c133; CHECK: NoAlias: i32* %b, i32* %c134define void @constantOffsetHeuristic_i3_i32(ptr %mem, i3 %val) {135 %zext.plus.7 = add nsw i3 %val, 7136 %zext.plus.4 = add nsw i3 %val, 4137 %zext.val = zext i3 %val to i32138 %zext.4 = zext i3 %zext.plus.4 to i32139 %zext.7 = zext i3 %zext.plus.7 to i32140 %a = getelementptr inbounds i32, ptr %mem, i32 %zext.4141 %b = getelementptr inbounds i32, ptr %mem, i32 %zext.7142 %c = getelementptr inbounds i32, ptr %mem, i32 %zext.val143 load i32, ptr %a144 load i32, ptr %b145 load i32, ptr %c146 ret void147}148 149; CHECK-LABEL: constantOffsetHeuristic_i8_i32150; CHECK: NoAlias: i32* %a, i32* %b151; CHECK: NoAlias: i32* %a, i32* %c152; CHECK: NoAlias: i32* %b, i32* %c153define void @constantOffsetHeuristic_i8_i32(ptr %mem, i8 %val) {154 %zext.plus.7 = add nsw i8 %val, 7155 %zext.plus.4 = add nsw i8 %val, 4156 %zext.val = zext i8 %val to i32157 %zext.4 = zext i8 %zext.plus.4 to i32158 %zext.7 = zext i8 %zext.plus.7 to i32159 %a = getelementptr inbounds i32, ptr %mem, i32 %zext.4160 %b = getelementptr inbounds i32, ptr %mem, i32 %zext.7161 %c = getelementptr inbounds i32, ptr %mem, i32 %zext.val162 load i32, ptr %a163 load i32, ptr %b164 load i32, ptr %c165 ret void166}167 168; CHECK-LABEL: constantOffsetHeuristic_i3_i8169; CHECK: MayAlias: i32* %a.8, i32* %b.8170; CHECK: NoAlias: i32* %a.8, i32* %c.8171; CHECK: MayAlias: i32* %b.8, i32* %c.8172define void @constantOffsetHeuristic_i3_i8(ptr %mem, i3 %val) {173 %zext.plus.7 = add nsw i3 %val, 7174 %zext.plus.4 = add nsw i3 %val, 4175 %zext.val = zext i3 %val to i32176 %zext.4 = zext i3 %zext.plus.4 to i32177 %zext.7 = zext i3 %zext.plus.7 to i32178 %a.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.4179 %b.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.7180 %c.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.val181 load i32, ptr %a.8182 load i32, ptr %b.8183 load i32, ptr %c.8184 ret void185}186 187; CHECK-LABEL: constantOffsetHeuristic_i8_i8188; CHECK: MayAlias: i32* %a.8, i32* %b.8189; CHECK: NoAlias: i32* %a.8, i32* %c.8190; CHECK: NoAlias: i32* %b.8, i32* %c.8191define void @constantOffsetHeuristic_i8_i8(ptr %mem, i8 %val) {192 %zext.plus.7 = add nsw i8 %val, 7193 %zext.plus.4 = add nsw i8 %val, 4194 %zext.val = zext i8 %val to i32195 %zext.4 = zext i8 %zext.plus.4 to i32196 %zext.7 = zext i8 %zext.plus.7 to i32197 %a.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.4198 %b.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.7199 %c.8 = getelementptr inbounds i8, ptr %mem, i32 %zext.val200 load i32, ptr %a.8201 load i32, ptr %b.8202 load i32, ptr %c.8203 ret void204}205 206; CHECK-LABEL: different_large_bitwidths207; MayAlias: ptr %p1, ptr %p2208define void @different_large_bitwidths(ptr %a, i64 %i, i128 %j) {209 %p1 = getelementptr i8, ptr %a, i64 %i210 %p2 = getelementptr i8, ptr %a, i128 %j211 load i8, ptr %p1212 load i8, ptr %p2213 ret void214}215