1c172f1adSAndrew 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 3c172f1adSAndrew Litteken 4c172f1adSAndrew Litteken; Show that we do not extract similar regions that would involve the splitting 5c172f1adSAndrew Litteken; of phi nodes on exit. 6c172f1adSAndrew Litteken 7*f4b925eeSMatt Arsenaultdefine void @function1(ptr %a, ptr %b) { 8c172f1adSAndrew Littekenentry: 9c172f1adSAndrew Litteken %0 = alloca i32, align 4 10*f4b925eeSMatt Arsenault %c = load i32, ptr %0, align 4 11c172f1adSAndrew Litteken br label %test1 12c172f1adSAndrew Littekentest1: 13*f4b925eeSMatt Arsenault %e = load i32, ptr %0, align 4 14c172f1adSAndrew Litteken br label %first 15c172f1adSAndrew Littekentest: 16*f4b925eeSMatt Arsenault %d = load i32, ptr %0, align 4 17c172f1adSAndrew Litteken br label %first 18e8f4e41bSAndrew Littekendummy: 19e8f4e41bSAndrew Litteken ret void 20c172f1adSAndrew Littekenfirst: 21c172f1adSAndrew Litteken %1 = phi i32 [ %c, %test ], [ %e, %test1 ] 22c172f1adSAndrew Litteken ret void 23c172f1adSAndrew Litteken} 24c172f1adSAndrew Litteken 25*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) { 26c172f1adSAndrew Littekenentry: 27c172f1adSAndrew Litteken %0 = alloca i32, align 4 28*f4b925eeSMatt Arsenault %c = load i32, ptr %0, align 4 29c172f1adSAndrew Litteken br label %test1 30c172f1adSAndrew Littekentest1: 31*f4b925eeSMatt Arsenault %e = load i32, ptr %0, align 4 32c172f1adSAndrew Litteken br label %first 33c172f1adSAndrew Littekentest: 34*f4b925eeSMatt Arsenault %d = load i32, ptr %0, align 4 35c172f1adSAndrew Litteken br label %first 36e8f4e41bSAndrew Littekendummy: 37e8f4e41bSAndrew Litteken ret void 38c172f1adSAndrew Littekenfirst: 39c172f1adSAndrew Litteken %1 = phi i32 [ %c, %test ], [ %e, %test1 ] 40c172f1adSAndrew Litteken ret void 41c172f1adSAndrew Litteken} 42c172f1adSAndrew Litteken; CHECK-LABEL: @function1( 43c172f1adSAndrew Litteken; CHECK-NEXT: entry: 44dcc3e728SAndrew Litteken; CHECK-NEXT: [[DOTCE_LOC:%.*]] = alloca i32, align 4 45c172f1adSAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 46*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]]) 47*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[TMP0]], ptr [[DOTCE_LOC]]) 48*f4b925eeSMatt Arsenault; CHECK-NEXT: [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4 49*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]]) 50c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FIRST:%.*]] 51e8f4e41bSAndrew Litteken; CHECK: dummy: 52e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 53c172f1adSAndrew Litteken; CHECK: first: 54dcc3e728SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ] 55c172f1adSAndrew Litteken; CHECK-NEXT: ret void 56c172f1adSAndrew Litteken; 57c172f1adSAndrew Litteken; 58c172f1adSAndrew Litteken; CHECK-LABEL: @function2( 59c172f1adSAndrew Litteken; CHECK-NEXT: entry: 60dcc3e728SAndrew Litteken; CHECK-NEXT: [[DOTCE_LOC:%.*]] = alloca i32, align 4 61c172f1adSAndrew Litteken; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 62*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]]) 63*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[TMP0]], ptr [[DOTCE_LOC]]) 64*f4b925eeSMatt Arsenault; CHECK-NEXT: [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4 65*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]]) 66c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FIRST:%.*]] 67e8f4e41bSAndrew Litteken; CHECK: dummy: 68e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 69c172f1adSAndrew Litteken; CHECK: first: 70dcc3e728SAndrew Litteken; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ] 71c172f1adSAndrew Litteken; CHECK-NEXT: ret void 72c172f1adSAndrew Litteken; 73c172f1adSAndrew Litteken; 74dcc3e728SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0( 75c172f1adSAndrew Litteken; CHECK-NEXT: newFuncRoot: 76dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]] 77dcc3e728SAndrew Litteken; CHECK: entry_to_outline: 78*f4b925eeSMatt Arsenault; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[TMP0:%.*]], align 4 79dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[TEST1:%.*]] 80dcc3e728SAndrew Litteken; CHECK: test1: 81*f4b925eeSMatt Arsenault; CHECK-NEXT: [[E:%.*]] = load i32, ptr [[TMP0]], align 4 82dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[FIRST_SPLIT:%.*]] 83dcc3e728SAndrew Litteken; CHECK: test: 84*f4b925eeSMatt Arsenault; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[TMP0]], align 4 85dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[FIRST_SPLIT]] 86dcc3e728SAndrew Litteken; CHECK: first.split: 87dcc3e728SAndrew Litteken; CHECK-NEXT: [[DOTCE:%.*]] = phi i32 [ [[C]], [[TEST:%.*]] ], [ [[E]], [[TEST1]] ] 88c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FIRST_EXITSTUB:%.*]] 89c172f1adSAndrew Litteken; CHECK: first.exitStub: 90*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[DOTCE]], ptr [[TMP1:%.*]], align 4 91c172f1adSAndrew Litteken; CHECK-NEXT: ret void 92c172f1adSAndrew Litteken; 93