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