brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 3402886 Raw
183 lines · plain
1; RUN: opt -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info %s 2>&1 | FileCheck %s2 3; %col.ptr.1 and %col.ptr.2 do not alias, if we know that %skip >= 0, because4; the distance between %col.ptr.1 and %col.ptr.2 is %skip + 6 and we load 65; elements.6define void @test1(ptr %ptr, i32 %skip) {7; CHECK-LABEL: Function: test1: 2 pointers, 1 call sites8; CHECK-NEXT:  NoAlias: <6 x double>* %col.ptr.2, <6 x double>* %ptr9;10  %gt = icmp sgt i32 %skip, -111  call void @llvm.assume(i1 %gt)12  %stride = add nsw nuw i32 %skip, 613  %lv.1 = load <6 x double>, ptr %ptr, align 814  %col.ptr.2 = getelementptr double, ptr %ptr, i32 %stride15  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 816  %res.1 = fadd <6 x double> %lv.1, %lv.117  %res.2 = fadd <6 x double> %lv.2, %lv.218  store <6 x double> %res.1, ptr %ptr, align 819  store <6 x double> %res.2, ptr %col.ptr.2, align 820  ret void21}22 23; Same as @test1, but now we do not have an assume guaranteeing %skip >= 0.24define void @test2(ptr %ptr, i32 %skip) {25; CHECK-LABEL: Function: test2: 2 pointers, 0 call sites26; CHECK-NEXT:    MayAlias:  <6 x double>* %col.ptr.2, <6 x double>* %ptr27;28  %stride = add nsw nuw i32 %skip, 629  %lv.1 = load <6 x double>, ptr %ptr, align 830  %col.ptr.2 = getelementptr double, ptr  %ptr, i32 %stride31  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 832  %res.1 = fadd <6 x double> %lv.1, %lv.133  %res.2 = fadd <6 x double> %lv.2, %lv.234  store <6 x double> %res.1, ptr %ptr, align 835  store <6 x double> %res.2, ptr %col.ptr.2, align 836  ret void37}38 39; Same as @test1, this time the assume just guarantees %skip > -3, which is40; enough to derive NoAlias for %ptr and %col.ptr.2 (distance is more than 341; doubles, and we load 1 double), but not %col.ptr.1 and %col.ptr.2 (distance42; is more than 3 doubles, and we load 6 doubles).43define void @test3(ptr %ptr, i32 %skip) {44; CHECK-LABEL: Function: test3: 2 pointers, 1 call sites45; CHECK-NEXT:   MayAlias:	<6 x double>* %col.ptr.2, <6 x double>* %ptr46;47  %gt = icmp sgt i32 %skip, -348  call void @llvm.assume(i1 %gt)49  %stride = add nsw nuw i32 %skip, 650  %lv.1 = load <6 x double>, ptr %ptr, align 851  %col.ptr.2 = getelementptr double, ptr %ptr, i32 %stride52  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 853  %res.1 = fadd <6 x double> %lv.1, %lv.154  %res.2 = fadd <6 x double> %lv.2, %lv.255  store <6 x double> %res.1, ptr %ptr, align 856  store <6 x double> %res.2, ptr %col.ptr.2, align 857  ret void58}59 60; Same as @test1, but the assume uses the sge predicate for %skip >= 0.61define void @test4(ptr %ptr, i32 %skip) {62; CHECK-LABEL: Function: test4: 2 pointers, 1 call sites63; CHECK-NEXT:    NoAlias:	<6 x double>* %col.ptr.2, <6 x double>* %ptr64;65  %gt = icmp sge i32 %skip, 066  call void @llvm.assume(i1 %gt)67  %stride = add nsw nuw i32 %skip, 668  %lv.1 = load <6 x double>, ptr %ptr, align 869  %col.ptr.2 = getelementptr double, ptr %ptr, i32 %stride70  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 871  %res.1 = fadd <6 x double> %lv.1, %lv.172  %res.2 = fadd <6 x double> %lv.2, %lv.273  store <6 x double> %res.1, ptr %ptr, align 874  store <6 x double> %res.2, ptr %col.ptr.2, align 875  ret void76}77 78define void @symmetry(ptr %ptr, i32 %a, i32 %b, i32 %c) {79; CHECK-LABEL: Function: symmetry80; CHECK: NoAlias: i8* %gep1, i8* %gep281;82  %b.cmp = icmp slt i32 %b, 083  call void @llvm.assume(i1 %b.cmp)84  %gep1 = getelementptr [0 x i8], ptr %ptr, i32 %a, i32 %b85  load i8, ptr %gep186  call void @barrier()87  %c.cmp = icmp sgt i32 %c, -188  call void @llvm.assume(i1 %c.cmp)89  %c.off = add nuw nsw i32 %c, 190  %gep2 = getelementptr [0 x i8], ptr %ptr, i32 %a, i32 %c.off91  load i8, ptr %gep292  ret void93}94 95; %ptr.neg and %ptr.shl may alias, as the shl renders the previously96; non-negative value potentially negative.97define void @shl_of_non_negative(ptr %ptr, i64 %a) {98; CHECK-LABEL: Function: shl_of_non_negative99; CHECK: NoAlias: i8* %ptr.a, i8* %ptr.neg100; CHECK: MayAlias: i8* %ptr.neg, i8* %ptr.shl101;102  %a.cmp = icmp sge i64 %a, 0103  call void @llvm.assume(i1 %a.cmp)104  %ptr.neg = getelementptr i8, ptr %ptr, i64 -2105  %ptr.a = getelementptr i8, ptr %ptr, i64 %a106  %shl = shl i64 %a, 1107  %ptr.shl = getelementptr i8, ptr %ptr, i64 %shl108  load i8, ptr %ptr.a109  load i8, ptr %ptr.neg110  load i8, ptr %ptr.shl111  ret void112}113 114; Unlike the previous case, %ptr.neg and %ptr.shl can't alias, because115; shl nsw of non-negative is non-negative.116define void @shl_nsw_of_non_negative(ptr %ptr, i64 %a) {117; CHECK-LABEL: Function: shl_nsw_of_non_negative118; CHECK: NoAlias: i8* %ptr.a, i8* %ptr.neg119; CHECK: NoAlias: i8* %ptr.neg, i8* %ptr.shl120;121  %a.cmp = icmp sge i64 %a, 0122  call void @llvm.assume(i1 %a.cmp)123  %ptr.neg = getelementptr i8, ptr %ptr, i64 -2124  %ptr.a = getelementptr i8, ptr %ptr, i64 %a125  %shl = shl nsw i64 %a, 1126  %ptr.shl = getelementptr i8, ptr %ptr, i64 %shl127  load i8, ptr %ptr.a128  load i8, ptr %ptr.neg129  load i8, ptr %ptr.shl130  ret void131}132 133define void @test5(ptr %ptr, i32 %stride) {134; CHECK-LABEL: Function: test5: 2 pointers, 1 call sites135; CHECK-NEXT:    MayAlias:   <6 x double>* %col.ptr.2, <6 x double>* %ptr136;137  %gt = icmp sge i32 %stride, 5138  call void @llvm.assume(i1 %gt)139  %lv.1 = load <6 x double>, ptr %ptr, align 8140  %col.ptr.2= getelementptr double, ptr %ptr, i32 %stride141  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 8142  %res.1 = fadd <6 x double> %lv.1, %lv.1143  %res.2 = fadd <6 x double> %lv.2, %lv.2144  store <6 x double> %res.1, ptr %ptr, align 8145  store <6 x double> %res.2, ptr %col.ptr.2, align 8146  ret void147}148 149define void @test6(ptr %ptr, i32 %stride) {150; CHECK-LABEL: Function: test6: 2 pointers, 1 call sites151; CHECK-NEXT:    NoAlias:  <6 x double>* %col.ptr.2, <6 x double>* %ptr152;153  %gt = icmp sge i32 %stride, 6154  call void @llvm.assume(i1 %gt)155  %lv.1 = load <6 x double>, ptr %ptr, align 8156  %col.ptr.2= getelementptr double, ptr %ptr, i32 %stride157  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 8158  %res.1 = fadd <6 x double> %lv.1, %lv.1159  %res.2 = fadd <6 x double> %lv.2, %lv.2160  store <6 x double> %res.1, ptr %ptr, align 8161  store <6 x double> %res.2, ptr %col.ptr.2, align 8162  ret void163}164 165define void @test7(ptr %ptr, i32 %stride) {166; CHECK-LABEL: Function: test7: 2 pointers, 1 call sites167; CHECK-NEXT:    MayAlias: <6 x double>* %col.ptr.2, <6 x double>* %ptr168;169  %gt = icmp sge i32 %stride, 0170  call void @llvm.assume(i1 %gt)171  %lv.1 = load <6 x double>, ptr %ptr, align 8172  %col.ptr.2= getelementptr double, ptr %ptr, i32 %stride173  %lv.2 = load <6 x double>, ptr %col.ptr.2, align 8174  %res.1 = fadd <6 x double> %lv.1, %lv.1175  %res.2 = fadd <6 x double> %lv.2, %lv.2176  store <6 x double> %res.1, ptr %ptr, align 8177  store <6 x double> %res.2, ptr %col.ptr.2, align 8178  ret void179}180 181declare void @llvm.assume(i1 %cond)182declare void @barrier()183