brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.8 KiB · 6153637 Raw
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