1e8f4e41bSAndrew 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 3e8f4e41bSAndrew Litteken 4e8f4e41bSAndrew Litteken; Show that we are able to outline when all of the phi nodes in the starting 5e8f4e41bSAndrew Litteken; block are included in the region and there is no more than one predecessor 6e8f4e41bSAndrew Litteken; into those phi nodes from outside of the region. 7e8f4e41bSAndrew Litteken 8*f4b925eeSMatt Arsenaultdefine void @function1(ptr %a, ptr %b) { 9e8f4e41bSAndrew Littekenentry: 10e8f4e41bSAndrew Litteken %0 = alloca i32, align 4 11*f4b925eeSMatt Arsenault %c = load i32, ptr %0, align 4 12e8f4e41bSAndrew Litteken %y = add i32 %c, %c 13e8f4e41bSAndrew Litteken br label %test1 14e8f4e41bSAndrew Littekendummy: 15e8f4e41bSAndrew Litteken ret void 16e8f4e41bSAndrew Littekentest1: 17e8f4e41bSAndrew Litteken %1 = phi i32 [ %e, %test1 ], [ %y, %entry ] 18e8f4e41bSAndrew Litteken %2 = phi i32 [ %e, %test1 ], [ %y, %entry ] 19*f4b925eeSMatt Arsenault %e = load i32, ptr %0, align 4 20e8f4e41bSAndrew Litteken %3 = add i32 %c, %c 21e8f4e41bSAndrew Litteken br i1 true, label %test, label %test1 22e8f4e41bSAndrew Littekentest: 23*f4b925eeSMatt Arsenault %d = load i32, ptr %0, align 4 24e8f4e41bSAndrew Litteken br label %first 25e8f4e41bSAndrew Littekenfirst: 26e8f4e41bSAndrew Litteken ret void 27e8f4e41bSAndrew Litteken} 28e8f4e41bSAndrew Litteken 29*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) { 30e8f4e41bSAndrew Littekenentry: 31e8f4e41bSAndrew Litteken %0 = alloca i32, align 4 32*f4b925eeSMatt Arsenault %c = load i32, ptr %0, align 4 33e8f4e41bSAndrew Litteken %y = mul i32 %c, %c 34e8f4e41bSAndrew Litteken br label %test1 35e8f4e41bSAndrew Littekendummy: 36e8f4e41bSAndrew Litteken ret void 37e8f4e41bSAndrew Littekentest1: 38e8f4e41bSAndrew Litteken %1 = phi i32 [ %e, %test1 ], [ %y, %entry ] 39e8f4e41bSAndrew Litteken %2 = phi i32 [ %e, %test1 ], [ %y, %entry ] 40*f4b925eeSMatt Arsenault %e = load i32, ptr %0, align 4 41e8f4e41bSAndrew Litteken %3 = add i32 %c, %c 42e8f4e41bSAndrew Litteken br i1 true, label %test, label %test1 43e8f4e41bSAndrew Littekentest: 44*f4b925eeSMatt Arsenault %d = load i32, ptr %0, align 4 45e8f4e41bSAndrew Litteken br label %first 46e8f4e41bSAndrew Littekenfirst: 47e8f4e41bSAndrew Litteken ret void 48e8f4e41bSAndrew Litteken} 49e8f4e41bSAndrew Litteken; CHECK-LABEL: @function1( 50e8f4e41bSAndrew Litteken; CHECK-NEXT: entry: 51e8f4e41bSAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 52*f4b925eeSMatt Arsenault; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[TMP0]], align 4 53e8f4e41bSAndrew Litteken; CHECK-NEXT: [[Y:%.*]] = add i32 [[C]], [[C]] 54e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[TEST1:%.*]] 55e8f4e41bSAndrew Litteken; CHECK: dummy: 56e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 57e8f4e41bSAndrew Litteken; CHECK: test1: 58*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[Y]], ptr [[TMP0]], i32 [[C]]) 59e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[FIRST:%.*]] 60e8f4e41bSAndrew Litteken; CHECK: first: 61e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 62e8f4e41bSAndrew Litteken; 63e8f4e41bSAndrew Litteken; 64e8f4e41bSAndrew Litteken; CHECK-LABEL: @function2( 65e8f4e41bSAndrew Litteken; CHECK-NEXT: entry: 66e8f4e41bSAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 67*f4b925eeSMatt Arsenault; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[TMP0]], align 4 68e8f4e41bSAndrew Litteken; CHECK-NEXT: [[Y:%.*]] = mul i32 [[C]], [[C]] 69e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[TEST1:%.*]] 70e8f4e41bSAndrew Litteken; CHECK: dummy: 71e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 72e8f4e41bSAndrew Litteken; CHECK: test1: 73*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[Y]], ptr [[TMP0]], i32 [[C]]) 74e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[FIRST:%.*]] 75e8f4e41bSAndrew Litteken; CHECK: first: 76e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 77e8f4e41bSAndrew Litteken; 78e8f4e41bSAndrew Litteken; 79e8f4e41bSAndrew Litteken; CHECK: define internal void @outlined_ir_func_0( 80e8f4e41bSAndrew Litteken; CHECK-NEXT: newFuncRoot: 81e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[TEST1_TO_OUTLINE:%.*]] 82e8f4e41bSAndrew Litteken; CHECK: test1_to_outline: 83e8f4e41bSAndrew Litteken; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[E:%.*]], [[TEST1_TO_OUTLINE]] ], [ [[TMP0:%.*]], [[NEWFUNCROOT:%.*]] ] 84e8f4e41bSAndrew Litteken; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[E]], [[TEST1_TO_OUTLINE]] ], [ [[TMP0]], [[NEWFUNCROOT]] ] 85*f4b925eeSMatt Arsenault; CHECK-NEXT: [[E]] = load i32, ptr [[TMP1:%.*]], align 4 86e8f4e41bSAndrew Litteken; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP2:%.*]], [[TMP2]] 87e8f4e41bSAndrew Litteken; CHECK-NEXT: br i1 true, label [[TEST:%.*]], label [[TEST1_TO_OUTLINE]] 88e8f4e41bSAndrew Litteken; CHECK: test: 89*f4b925eeSMatt Arsenault; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[TMP1]], align 4 90e8f4e41bSAndrew Litteken; CHECK-NEXT: br label [[FIRST_EXITSTUB:%.*]] 91e8f4e41bSAndrew Litteken; CHECK: first.exitStub: 92e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 93e8f4e41bSAndrew Litteken; 94