brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · e5dfb60 Raw
283 lines · plain
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s2 3%struct.S = type { i32, [2 x i32], i32 }4%struct.S2 = type { i32, [4 x i32], [4 x i32] }5@G = global [10 x i32] zeroinitializer, align 46 7; CHECK: Function: t18; CHECK: NoAlias: i32* %gep1, i32* %gep29define void @t1(ptr %s) {10  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 111  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 012  load i32, ptr %gep113  load i32, ptr %gep214  ret void15}16 17; CHECK: Function: t2_fwd18; CHECK: MayAlias: i32* %gep1, i32* %gep219define void @t2_fwd(ptr %s, ptr %q) {20  %in_array = load i32, ptr %q, !range !021  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array22  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 023  load i32, ptr %gep124  load i32, ptr %gep225  ret void26}27 28; CHECK: Function: t2_rev29; CHECK: MayAlias: i32* %gep1, i32* %gep230define void @t2_rev(ptr %s, ptr %q) {31  %in_array = load i32, ptr %q, !range !032  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 033  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array34  load i32, ptr %gep135  load i32, ptr %gep236  ret void37}38 39; CHECK: Function: t3_fwd40; CHECK: NoAlias: i32* %gep1, i32* %gep241define void @t3_fwd(ptr %s, ptr %q) {42  %knownzero = load i32, ptr %q, !range !143  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %knownzero44  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 145  load i32, ptr %gep146  load i32, ptr %gep247  ret void48}49 50; CHECK: Function: t3_rev51; CHECK: NoAlias: i32* %gep1, i32* %gep252define void @t3_rev(ptr %s, ptr %q) {53  %knownzero = load i32, ptr %q, !range !154  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 155  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %knownzero56  load i32, ptr %gep157  load i32, ptr %gep258  ret void59}60 61; CHECK: Function: member_after62; CHECK: NoAlias: i32* %gep1, i32* %gep263define void @member_after(ptr %s, ptr %q) {64  %in_array = load i32, ptr %q, !range !065  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array66  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 267  load i32, ptr %gep168  load i32, ptr %gep269  ret void70}71 72; CHECK: Function: member_after_rev73; CHECK: NoAlias: i32* %gep1, i32* %gep274define void @member_after_rev(ptr %s, ptr %q) {75  %in_array = load i32, ptr %q, !range !076  %gep2 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 277  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array78  load i32, ptr %gep179  load i32, ptr %gep280  ret void81}82 83; CHECK: Function: member_before84; CHECK: NoAlias: i32* %gep1, i32* %s85define void @member_before(ptr %s, ptr %q) {86  %in_array = load i32, ptr %q, !range !087  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array88  load i32, ptr %gep189  load i32, ptr %s90  ret void91}92 93; CHECK: Function: member_before_rev94; CHECK: NoAlias: i32* %gep1, i32* %s95define void @member_before_rev(ptr %s, ptr %q) {96  %in_array = load i32, ptr %q, !range !097  %gep1 = getelementptr inbounds %struct.S, ptr %s, i64 0, i32 1, i32 %in_array98  load i32, ptr %gep199  load i32, ptr %s100  ret void101}102 103; CHECK-LABEL: Function: t5104; CHECK: MayAlias: i32* %gep1, %struct.S2* %s105; CHECK: PartialAlias (off -4): i32* %gep2, %struct.S2* %s106; CHECK: NoAlias: i32* %gep1, i32* %gep2107define void @t5(ptr %s, ptr %q) {108  %in_array = load i32, ptr %q, !range !3109  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 %in_array110  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 1, i32 0111  load %struct.S2, ptr %s112  load i32, ptr %gep1113  load i32, ptr %gep2114  ret void115}116 117; CHECK-LABEL: Function: t6118; CHECK: MayAlias: i32* %gep1, %struct.S2* %s119; CHECK: PartialAlias (off -16): i32* %gep2, %struct.S2* %s120; CHECK: MayAlias: i32* %gep1, i32* %gep2121define void @t6(ptr %s, ptr %q) {122  %in_array = load i32, ptr %q, !range !3123  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 %in_array124  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 1, i32 3125  load %struct.S2, ptr %s126  load i32, ptr %gep1127  load i32, ptr %gep2128  ret void129}130 131; CHECK-LABEL: Function: t7132; CHECK: MayAlias: i32* %gep1, %struct.S2* %s133; CHECK: PartialAlias (off -20): i32* %gep2, %struct.S2* %s134; CHECK: NoAlias: i32* %gep1, i32* %gep2135define void @t7(ptr %s, ptr %q) {136  %in_array = load i32, ptr %q, !range !4137  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 %in_array138  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 0139  load %struct.S2, ptr %s140  load i32, ptr %gep1141  load i32, ptr %gep2142  ret void143}144 145; CHECK-LABEL: Function: t8146; CHECK: MayAlias: i32* %gep1, %struct.S2* %s147; CHECK: PartialAlias (off -24): i32* %gep2, %struct.S2* %s148; CHECK: MayAlias: i32* %gep1, i32* %gep2149define void @t8(ptr %s, ptr %q) {150  %in_array = load i32, ptr %q, !range !4151  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 %in_array152  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 1153  load %struct.S2, ptr %s154  load i32, ptr %q155  load i32, ptr %gep1156  load i32, ptr %gep2157  ret void158}159 160; CHECK-LABEL: Function: t9161; CHECK: MayAlias: i32* %gep1, %struct.S2* %s162; CHECK: PartialAlias (off -20): i32* %gep2, %struct.S2* %s163; CHECK: NoAlias: i32* %gep1, i32* %gep2164define void @t9(ptr %s, ptr %q) {165  %in_array = load i32, ptr %q, !range !5166  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 1, i32 %in_array167  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 0168  load %struct.S2, ptr %s169  load i32, ptr %gep1170  load i32, ptr %gep2171  ret void172}173 174; CHECK-LABEL: Function: t10175; CHECK: MayAlias: i32* %gep1, %struct.S2* %s176; CHECK: PartialAlias (off -4): i32* %gep2, %struct.S2* %s177; CHECK: MayAlias: i32* %gep1, i32* %gep2178define void @t10(ptr %s, ptr %q) {179  %in_array = load i32, ptr %q, !range !5180  %gep1 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 2, i32 %in_array181  %gep2 = getelementptr inbounds %struct.S2, ptr %s, i64 0, i32 1, i32 0182  load %struct.S2, ptr %s183  load i32, ptr %gep1184  load i32, ptr %gep2185  ret void186}187 188; CHECK-LABEL: Function: zeroext_index189; CHECK:  MayAlias:     i32* %gep, [256 x i32]* %s190define void @zeroext_index(ptr %s, ptr %q) {191  %a = load i8, ptr %q, !range !6192  %in_array = zext i8 %a to i32193  %gep = getelementptr inbounds [256 x i32], ptr %s, i64 0, i32 %in_array194  load [256 x i32], ptr %s195  load i32, ptr %gep196  ret void197}198 199; CHECK-LABEL: Function: multiple200; CHECK: MayAlias: i32* %p, i32* %p.01201; CHECK: MayAlias: i32* %p, i32* %p.02202; CHECK: MayAlias: i32* %p.01, i32* %p.02203; CHECK: NoAlias:  i32* %p.01, i32* %p.2204; CHECK: MayAlias: i32* %p.02, i32* %p.2205; CHECK: NoAlias:  i32* %p.01, i32* %p.3206; CHECK: NoAlias:  i32* %p.02, i32* %p.3207define void @multiple(ptr %p, ptr %o1_ptr, ptr %o2_ptr) {208  %o1 = load i32, ptr %o1_ptr, !range !0209  %o2 = load i32, ptr %o2_ptr, !range !0210  %p.01 = getelementptr i32, ptr %p, i32 %o1  ; p + [0, 1]211  %p.02 = getelementptr i32, ptr %p.01, i32 %o2 ; p + [0, 2]212  %p.2 = getelementptr i32, ptr %p, i32 2213  %p.3 = getelementptr i32, ptr %p, i32 3214  load i32, ptr %p215  load i32, ptr %p.01216  load i32, ptr %p.02217  load i32, ptr %p.2218  load i32, ptr %p.3219  ret void220}221 222; p.neg1 and p.o.1 don't alias, even though the addition o+1 may overflow.223; While it makes INT_MIN a possible offset, offset -1 is not possible.224; CHECK-LABEL: Function: benign_overflow225; CHECK: MayAlias: i8* %p, i8* %p.o226; CHECK: MayAlias: i8* %p.neg1, i8* %p.o227; CHECK: MayAlias: i8* %p, i8* %p.o.1228; CHECK: NoAlias: i8* %p.neg1, i8* %p.o.1229; CHECK: NoAlias:  i8* %p.o, i8* %p.o.1230define void @benign_overflow(ptr %p, i64 %o) {231  %c = icmp sge i64 %o, -1232  call void @llvm.assume(i1 %c)233  %p.neg1 = getelementptr i8, ptr %p, i64 -1234  %p.o = getelementptr i8, ptr %p, i64 %o235  %p.o.1 = getelementptr i8, ptr %p.o, i64 1236  load i8, ptr %p237  load i8, ptr %p.neg1238  load i8, ptr %p.o239  load i8, ptr %p.o.1240  ret void241}242 243; CHECK-LABEL: pr63266244; CHECK: MayAlias:	i8* %gep2, i8* %offset16245define void @pr63266(i1 %c, ptr %base) {246entry:247  %offset16 = getelementptr inbounds i8, ptr %base, i64 16248  %gep1 = getelementptr i8, ptr %base, i64 -9223372036854775792249  br i1 %c, label %if, label %join250 251if:252  br label %join253 254join:255  %phi = phi i64 [ -9223372036854775808, %if ], [ 0, %entry ]256  %gep2 = getelementptr i8, ptr %gep1, i64 %phi257  store i8 0, ptr %gep2258  load i8, ptr %offset16259  ret void260}261 262 263; CHECK-LABEL: Function: select_in_gep264; CHECK: NoAlias: i32* %arrayidx, i32* getelementptr inbounds ([10 x i32], ptr @G, i64 0, i64 3)265define i32 @select_in_gep(i1 %c)  {266entry:267  %select_ = select i1 %c, i64 2, i64 1268  %arrayidx = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select_269  store i32 42, ptr %arrayidx, align 4270  %load_ = load i32, ptr getelementptr inbounds ([10 x i32], ptr @G, i64 0, i64 3), align 4271  ret i32 %load_272}273 274declare void @llvm.assume(i1)275 276!0 = !{ i32 0, i32 2 }277!1 = !{ i32 0, i32 1 }278!2 = !{ i32 1, i32 2 }279!3 = !{ i32 -2, i32 0 }280!4 = !{ i32 1, i32 536870911 }281!5 = !{ i32 -536870911, i32 4 }282!6 = !{ i8 -2, i8 0 }283