brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 80d5d38 Raw
205 lines · plain
1target datalayout =2"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"3 4; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s5 6; ptr_phi and ptr2_phi do not alias.7; CHECK: test_noalias_18; CHECK: NoAlias: i32* %ptr2_phi, i32* %ptr_phi9; CHECK: NoAlias: i32* %ptr2_inc, i32* %ptr_inc10define i32 @test_noalias_1(ptr %ptr2, i32 %count, ptr %coeff) {11entry:12  %ptr = getelementptr inbounds i32, ptr %ptr2, i64 113  br label %while.body14 15while.body:16  %num = phi i32 [ %count, %entry ], [ %dec, %while.body ]17  %ptr_phi = phi ptr [ %ptr, %entry ], [ %ptr_inc, %while.body ]18  %ptr2_phi = phi ptr [ %ptr2, %entry ], [ %ptr2_inc, %while.body ]19  %result.09 = phi i32 [ 0 , %entry ], [ %add, %while.body ]20  %dec = add nsw i32 %num, -121  %0 = load i32, ptr %ptr_phi, align 422  store i32 %0, ptr %ptr2_phi, align 423  %1 = load i32, ptr %coeff, align 424  %2 = load i32, ptr %ptr_phi, align 425  %mul = mul nsw i32 %1, %226  %add = add nsw i32 %mul, %result.0927  %tobool = icmp eq i32 %dec, 028  %ptr_inc = getelementptr inbounds i32, ptr %ptr_phi, i64 129  %ptr2_inc = getelementptr inbounds i32, ptr %ptr2_phi, i64 130  load i32, ptr %ptr_inc31  load i32, ptr %ptr2_inc32  br i1 %tobool, label %the_exit, label %while.body33 34the_exit:35  ret i32 %add36}37 38; CHECK: test_noalias_239; CHECK-DAG: NoAlias: i32* %ptr_outer_phi, i32* %ptr_outer_phi240; CHECK-DAG: NoAlias: i32* %ptr2_inc_outer, i32* %ptr_inc_outer41; CHECK-DAG: NoAlias: i32* %ptr2_phi, i32* %ptr_phi42; CHECK-DAG: NoAlias: i32* %ptr2_inc, i32* %ptr_inc43define i32 @test_noalias_2(ptr %ptr2, i32 %count, ptr %coeff) {44entry:45  %ptr = getelementptr inbounds i32, ptr %ptr2, i64 146  br label %outer.while.header47 48outer.while.header:49  %ptr_outer_phi = phi ptr [%ptr_inc_outer, %outer.while.backedge], [ %ptr, %entry]50  %ptr_outer_phi2 = phi ptr [%ptr2_inc_outer, %outer.while.backedge], [ %ptr2, %entry]51  %num.outer = phi i32 [ %count, %entry ], [ %dec.outer, %outer.while.backedge ]52  %ignore1 = load i32, ptr %ptr_outer_phi53  %ignore2 = load i32, ptr %ptr_outer_phi254  br label %while.body55 56while.body:57  %num = phi i32 [ %count, %outer.while.header ], [ %dec, %while.body ]58  %ptr_phi = phi ptr [ %ptr_outer_phi, %outer.while.header ], [ %ptr_inc, %while.body ]59  %ptr2_phi = phi ptr [ %ptr_outer_phi2, %outer.while.header ], [ %ptr2_inc, %while.body ]60  %result.09 = phi i32 [ 0 , %outer.while.header ], [ %add, %while.body ]61  %dec = add nsw i32 %num, -162  %0 = load i32, ptr %ptr_phi, align 463  store i32 %0, ptr %ptr2_phi, align 464  %1 = load i32, ptr %coeff, align 465  %2 = load i32, ptr %ptr_phi, align 466  %mul = mul nsw i32 %1, %267  %add = add nsw i32 %mul, %result.0968  %tobool = icmp eq i32 %dec, 069  %ptr_inc = getelementptr inbounds i32, ptr %ptr_phi, i64 170  %ptr2_inc = getelementptr inbounds i32, ptr %ptr2_phi, i64 171  load i32, ptr %ptr_inc72  load i32, ptr %ptr2_inc73  br i1 %tobool, label %outer.while.backedge, label %while.body74 75outer.while.backedge:76  %ptr_inc_outer = getelementptr inbounds i32, ptr %ptr_phi, i64 177  %ptr2_inc_outer = getelementptr inbounds i32, ptr %ptr2_phi, i64 178  load i32, ptr %ptr_inc_outer79  load i32, ptr %ptr2_inc_outer80  %dec.outer = add nsw i32 %num.outer, -181  %br.cond = icmp eq i32 %dec.outer, 082  br i1 %br.cond, label %the_exit, label %outer.while.header83 84the_exit:85  ret i32 %add86}87 88; CHECK: test_noalias_389; CHECK: MayAlias: i8* %ptr2_phi, i8* %ptr_phi90define i32 @test_noalias_3(ptr noalias %x, ptr noalias %y, ptr noalias %z,91                           i32 %count) {92entry:93  br label %while.body94 95while.body:96  %num = phi i32 [ %count, %entry ], [ %dec, %while.body ]97  %ptr_phi = phi ptr [ %x, %entry ], [ %z, %while.body ]98  %ptr2_phi = phi ptr [ %y, %entry ], [ %ptr_phi, %while.body ]99  load i8, ptr %ptr_phi100  load i8, ptr %ptr2_phi101  %dec = add nsw i32 %num, -1102  %tobool = icmp eq i32 %dec, 0103  br i1 %tobool, label %the_exit, label %while.body104 105the_exit:106  ret i32 1107}108 109; CHECK-LABEL: test_different_stride_noalias110; CHECK: NoAlias: i8* %x.base, i16* %y.base111; CHECK: NoAlias: i8* %x, i16* %y112; CHECK: NoAlias: i8* %x.next, i16* %y.next113define void @test_different_stride_noalias(i1 %c, ptr noalias %x.base, ptr noalias %y.base) {114entry:115  load i8, ptr %x.base116  load i16, ptr %y.base117  br label %loop118 119loop:120  %x = phi ptr [ %x.base, %entry ], [ %x.next, %loop ]121  %y = phi ptr [ %y.base, %entry ], [ %y.next, %loop ]122  load i8, ptr %x123  load i16, ptr %y124  %x.next = getelementptr i8, ptr %x, i64 1125  %y.next = getelementptr i16, ptr %y, i64 1126  load i8, ptr %x.next127  load i16, ptr %y.next128  br i1 %c, label %loop, label %exit129 130exit:131  ret void132}133 134; CHECK-LABEL: test_no_loop_mustalias135; CHECK: MustAlias: i16* %z16, i8* %z8136define void @test_no_loop_mustalias(i1 %c, ptr noalias %x8, ptr noalias %y8) {137  br i1 %c, label %if, label %else138 139if:140  br label %end141 142else:143  br label %end144 145end:146  %z8 = phi ptr [ %x8, %if ], [ %y8, %else ]147  %z16 = phi ptr [ %x8, %if ], [ %y8, %else ]148  load i8, ptr %z8149  load i16, ptr %z16150  ret void151}152 153; CHECK-LABEL: test_same_stride_mustalias154; CHECK: MustAlias: i4* %x.base, i8* %x.base155; CHECK: MayAlias: i8* %x, i4* %y156; CHECK: MayAlias: i8* %x.next, i4* %y.next157; TODO: (x, y) could be MustAlias158define void @test_same_stride_mustalias(i1 %c, ptr noalias %x.base) {159entry:160  load i8, ptr %x.base161  load i4, ptr %x.base162  br label %loop163 164loop:165  %x = phi ptr [ %x.base, %entry ], [ %x.next, %loop ]166  %y = phi ptr [ %x.base, %entry ], [ %y.next, %loop ]167  load i8, ptr %x168  load i4, ptr %y169  %x.next = getelementptr i8, ptr %x, i64 1170  %y.next = getelementptr i4, ptr %y, i64 1171  load i8, ptr %x.next172  load i4, ptr %y.next173  br i1 %c, label %loop, label %exit174 175exit:176  ret void177}178 179; CHECK-LABEL: test_different_stride_mustalias180; CHECK: MustAlias: i16* %x.base, i8* %x.base181; CHECK: MayAlias: i8* %x, i16* %y182; CHECK: MayAlias: i8* %x.next, i16* %y.next183; Even though the base pointers MustAlias, the different strides don't preserve184; this property across iterations.185define void @test_different_stride_mustalias(i1 %c, ptr noalias %x.base) {186entry:187  load i8, ptr %x.base188  load i16, ptr %x.base189  br label %loop190 191loop:192  %x = phi ptr [ %x.base, %entry ], [ %x.next, %loop ]193  %y = phi ptr [ %x.base, %entry ], [ %y.next, %loop ]194  load i8, ptr %x195  load i16, ptr %y196  %x.next = getelementptr i8, ptr %x, i64 1197  %y.next = getelementptr i16, ptr %y, i64 1198  load i8, ptr %x.next199  load i16, ptr %y.next200  br i1 %c, label %loop, label %exit201 202exit:203  ret void204}205