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