1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs 2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 3 4; Show that we do extract phi nodes from the regions. 5 6define void @function1(ptr %a, ptr %b) { 7entry: 8 %0 = alloca i32, align 4 9 %c = load i32, ptr %0, align 4 10 br label %test1 11test1: 12 %e = load i32, ptr %0, align 4 13 br label %first 14test: 15 %d = load i32, ptr %0, align 4 16 br label %first 17first: 18 %1 = phi i32 [ %c, %test ], [ %e, %test1 ] 19 store i32 2, ptr %a, align 4 20 store i32 3, ptr %b, align 4 21 ret void 22} 23 24define void @function2(ptr %a, ptr %b) { 25entry: 26 %0 = alloca i32, align 4 27 %c = load i32, ptr %0, align 4 28 br label %test1 29test1: 30 %e = load i32, ptr %0, align 4 31 br label %first 32test: 33 %d = load i32, ptr %0, align 4 34 br label %first 35first: 36 %1 = phi i32 [ %c, %test ], [ %e, %test1 ] 37 store i32 2, ptr %a, align 4 38 store i32 3, ptr %b, align 4 39 ret void 40} 41; CHECK-LABEL: @function1( 42; CHECK-NEXT: entry: 43; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 44; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[TMP0]], ptr [[A:%.*]], ptr [[B:%.*]]) 45; CHECK-NEXT: ret void 46; 47; 48; CHECK-LABEL: @function2( 49; CHECK-NEXT: entry: 50; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 51; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[TMP0]], ptr [[A:%.*]], ptr [[B:%.*]]) 52; CHECK-NEXT: ret void 53; 54; 55; CHECK: define internal void @outlined_ir_func_0( 56; CHECK-NEXT: newFuncRoot: 57; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]] 58; CHECK: entry_to_outline: 59; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[TMP0:%.*]], align 4 60; CHECK-NEXT: br label [[TEST1:%.*]] 61; CHECK: test1: 62; CHECK-NEXT: [[E:%.*]] = load i32, ptr [[TMP0]], align 4 63; CHECK-NEXT: br label [[FIRST:%.*]] 64; CHECK: test: 65; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[TMP0]], align 4 66; CHECK-NEXT: br label [[FIRST]] 67; CHECK: first: 68; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[C]], [[TEST:%.*]] ], [ [[E]], [[TEST1]] ] 69; CHECK-NEXT: store i32 2, ptr [[TMP1:%.*]], align 4 70; CHECK-NEXT: store i32 3, ptr [[TMP2:%.*]], align 4 71; CHECK-NEXT: br label [[ENTRY_AFTER_OUTLINE_EXITSTUB:%.*]] 72; CHECK: entry_after_outline.exitStub: 73; CHECK-NEXT: ret void 74; 75