73 lines · plain
1; RUN: opt -disable-output -aa-pipeline=basic-aa -passes='loop-mssa(licm),print<memoryssa>' < %s 2>&1 | FileCheck %s2 3 4@a = external dso_local global i16, align 15@c = external dso_local global i16, align 16 7; CHECK-LABEL: @main()8 9; CHECK: entry:10; CHECK-NEXT: %res.addr.i = alloca i1611; CHECK-NEXT: ; MemoryUse(liveOnEntry)12; CHECK-NEXT: %c.promoted = load i16, ptr @c13; CHECK-NEXT: br label %for.cond.i14 15; CHECK: for.cond.i:16; CHECK-NEXT: ; [[NO5:.*]] = MemoryPhi({entry,liveOnEntry},{f.exit.i,[[NO5]]})17; CHECK-NEXT: %inc.i1 = phi i16 [ %inc.i, %f.exit.i ], [ %c.promoted, %entry ]18; CHECK-NEXT: %inc.i = add nsw i16 %inc.i1, 119; CHECK-NEXT: br i1 false, label %f.exit.thread.i, label %f.exit.i20 21; CHECK: f.exit.thread.i:22; CHECK-NEXT: %inc.i.lcssa = phi i16 [ %inc.i, %for.cond.i ]23; CHECK-NEXT: ; [[NO6:.*]] = MemoryDef([[NO5]])24; CHECK-NEXT: store i16 %inc.i.lcssa, ptr @c, align 125; CHECK-NEXT: ; [[NO2:.*]] = MemoryDef([[NO6]])26; CHECK-NEXT: store i16 1, ptr @a, align 127; CHECK-NEXT: ; MemoryUse([[NO6]])28; CHECK-NEXT: %tmp2 = load i16, ptr @c, align 129; CHECK-NEXT: br label %g.exit30 31; CHECK: f.exit.i32; CHECK-NEXT: br i1 false, label %g.exit.loopexit, label %for.cond.i33 34; CHECK: g.exit.loopexit:35; CHECK-NEXT: %inc.i.lcssa2 = phi i16 [ %inc.i, %f.exit.i ]36; CHECK-NEXT: ; [[NO7:.*]] = MemoryDef([[NO5]])37; CHECK-NEXT: store i16 %inc.i.lcssa2, ptr @c, align 138; CHECK-NEXT: br label %g.exit39 40; CHECK: g.exit41; CHECK-NEXT: ; [[NO4:.*]] = MemoryPhi({f.exit.thread.i,[[NO2]]},{g.exit.loopexit,[[NO7]]})42; CHECK-NEXT: ; MemoryUse([[NO4]])43; CHECK-NEXT: %tmp1 = load i16, ptr @c, align 144; CHECK-NEXT: ; [[NO3:.*]] = MemoryDef([[NO4]])45; CHECK-NEXT: store i16 %tmp1, ptr %res.addr.i, align 146; CHECK-NEXT: ret void47 48define dso_local void @main() {49entry:50 %res.addr.i = alloca i16, align 151 br label %for.cond.i52 53for.cond.i: ; preds = %f.exit.i, %entry54 %tmp0 = load i16, ptr @c, align 155 %inc.i = add nsw i16 %tmp0, 156 store i16 %inc.i, ptr @c, align 157 br i1 false, label %f.exit.thread.i, label %f.exit.i58 59f.exit.thread.i: ; preds = %for.cond.i60 store i16 1, ptr @a, align 161 %tmp2 = load i16, ptr @c, align 162 br label %g.exit63 64f.exit.i: ; preds = %for.cond.i65 br i1 false, label %g.exit, label %for.cond.i66 67g.exit: ; preds = %f.exit.i, %f.exit.thread.i68 %tmp1 = load i16, ptr @c, align 169 store i16 %tmp1, ptr %res.addr.i, align 170 ret void71}72 73