xref: /llvm-project/llvm/test/Transforms/IROutliner/phi-nodes-parent-block-referential.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
14e500df8SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s
34e500df8SAndrew Litteken
44e500df8SAndrew Litteken; Show that we do not outline when all of the phi nodes in the beginning
54e500df8SAndrew Litteken; block are included not in the region.
64e500df8SAndrew Litteken
7*f4b925eeSMatt Arsenaultdefine void @function1(ptr %a, ptr %b) {
84e500df8SAndrew Littekenentry:
94e500df8SAndrew Litteken  %0 = alloca i32, align 4
10*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
114e500df8SAndrew Litteken  %y = add i32 %c, %c
124e500df8SAndrew Litteken  br label %test1
134e500df8SAndrew Littekendummy:
144e500df8SAndrew Litteken  ret void
154e500df8SAndrew Littekentest1:
164e500df8SAndrew Litteken  %1 = phi i32 [ %e, %test1 ], [ %y, %entry ]
174e500df8SAndrew Litteken  %2 = phi i32 [ %e, %test1 ], [ %y, %entry  ]
18*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
194e500df8SAndrew Litteken  %3 = add i32 %c, %c
204e500df8SAndrew Litteken  %4 = sub i32 %c, %c
214e500df8SAndrew Litteken  br i1 true, label %first, label %test1
224e500df8SAndrew Littekenfirst:
234e500df8SAndrew Litteken  ret void
244e500df8SAndrew Litteken}
254e500df8SAndrew Litteken
26*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) {
274e500df8SAndrew Littekenentry:
284e500df8SAndrew Litteken  %0 = alloca i32, align 4
29*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
304e500df8SAndrew Litteken  %y = mul i32 %c, %c
314e500df8SAndrew Litteken  br label %test1
324e500df8SAndrew Littekendummy:
334e500df8SAndrew Litteken  ret void
344e500df8SAndrew Littekentest1:
354e500df8SAndrew Litteken  %1 = phi i32 [ %e, %test1 ], [ %y, %entry ]
364e500df8SAndrew Litteken  %2 = phi i32 [ %y, %entry ], [ %e, %test1 ]
37*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
384e500df8SAndrew Litteken  %3 = add i32 %c, %c
394e500df8SAndrew Litteken  %4 = mul i32 %c, %c
404e500df8SAndrew Litteken  br i1 true, label %first, label %test1
414e500df8SAndrew Littekenfirst:
424e500df8SAndrew Litteken  ret void
434e500df8SAndrew Litteken}
444e500df8SAndrew Litteken; CHECK-LABEL: @function1(
454e500df8SAndrew Litteken; CHECK-NEXT:  entry:
464e500df8SAndrew Litteken; CHECK-NEXT:    [[E_LOC:%.*]] = alloca i32, align 4
474e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
48*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0]], align 4
494e500df8SAndrew Litteken; CHECK-NEXT:    [[Y:%.*]] = add i32 [[C]], [[C]]
504e500df8SAndrew Litteken; CHECK-NEXT:    br label [[TEST1:%.*]]
514e500df8SAndrew Litteken; CHECK:       dummy:
524e500df8SAndrew Litteken; CHECK-NEXT:    ret void
534e500df8SAndrew Litteken; CHECK:       test1:
544e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[E_RELOAD:%.*]], [[TEST1]] ], [ [[Y]], [[ENTRY:%.*]] ]
554e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = phi i32 [ [[E_RELOAD]], [[TEST1]] ], [ [[Y]], [[ENTRY]] ]
56*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[E_LOC]])
57*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[TMP0]], i32 [[C]], ptr [[E_LOC]])
58*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E_RELOAD]] = load i32, ptr [[E_LOC]], align 4
59*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[E_LOC]])
604e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = sub i32 [[C]], [[C]]
614e500df8SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST:%.*]], label [[TEST1]]
624e500df8SAndrew Litteken; CHECK:       first:
634e500df8SAndrew Litteken; CHECK-NEXT:    ret void
644e500df8SAndrew Litteken;
654e500df8SAndrew Litteken;
664e500df8SAndrew Litteken; CHECK-LABEL: @function2(
674e500df8SAndrew Litteken; CHECK-NEXT:  entry:
684e500df8SAndrew Litteken; CHECK-NEXT:    [[E_LOC:%.*]] = alloca i32, align 4
694e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
70*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0]], align 4
714e500df8SAndrew Litteken; CHECK-NEXT:    [[Y:%.*]] = mul i32 [[C]], [[C]]
724e500df8SAndrew Litteken; CHECK-NEXT:    br label [[TEST1:%.*]]
734e500df8SAndrew Litteken; CHECK:       dummy:
744e500df8SAndrew Litteken; CHECK-NEXT:    ret void
754e500df8SAndrew Litteken; CHECK:       test1:
764e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[E_RELOAD:%.*]], [[TEST1]] ], [ [[Y]], [[ENTRY:%.*]] ]
774e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = phi i32 [ [[Y]], [[ENTRY]] ], [ [[E_RELOAD]], [[TEST1]] ]
78*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[E_LOC]])
79*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[TMP0]], i32 [[C]], ptr [[E_LOC]])
80*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E_RELOAD]] = load i32, ptr [[E_LOC]], align 4
81*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[E_LOC]])
824e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = mul i32 [[C]], [[C]]
834e500df8SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST:%.*]], label [[TEST1]]
844e500df8SAndrew Litteken; CHECK:       first:
854e500df8SAndrew Litteken; CHECK-NEXT:    ret void
864e500df8SAndrew Litteken;
874e500df8SAndrew Litteken;
884e500df8SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0(
894e500df8SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
904e500df8SAndrew Litteken; CHECK-NEXT:    br label [[TEST1_TO_OUTLINE:%.*]]
914e500df8SAndrew Litteken; CHECK:       test1_to_outline:
92*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
934e500df8SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1:%.*]], [[TMP1]]
944e500df8SAndrew Litteken; CHECK-NEXT:    br label [[TEST1_AFTER_OUTLINE_EXITSTUB:%.*]]
954e500df8SAndrew Litteken; CHECK:       test1_after_outline.exitStub:
96*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP2:%.*]], align 4
974e500df8SAndrew Litteken; CHECK-NEXT:    ret void
984e500df8SAndrew Litteken;
99