1a919d3d8SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs 2*9dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 3a919d3d8SAndrew Litteken 4a919d3d8SAndrew Litteken; A PHINode defines the global value number of a split phi node for 5a919d3d8SAndrew Litteken; an exit paths based on the canonical number for the incoming values, and 6a919d3d8SAndrew Litteken; the canonical number for the basic block. This checks that we accurately 7a919d3d8SAndrew Litteken; capture a different numbering for the same incoming value but with different 8a919d3d8SAndrew Litteken; blocks. 9a919d3d8SAndrew Litteken 10a919d3d8SAndrew Littekendefine void @func1(i32 %0, i32 %1) local_unnamed_addr #0 { 11a919d3d8SAndrew Littekenbb1: 12a919d3d8SAndrew Litteken br label %bb5 13a919d3d8SAndrew Litteken 14a919d3d8SAndrew Littekenbb2: 15a919d3d8SAndrew Litteken %a = add i32 %0, %1 16a919d3d8SAndrew Litteken %b = add i32 %0, %1 17a919d3d8SAndrew Litteken %c = icmp eq i32 %b, 1 18a919d3d8SAndrew Litteken br i1 %c, label %bb5, label %bb3 19a919d3d8SAndrew Litteken 20a919d3d8SAndrew Littekenbb3: 21a919d3d8SAndrew Litteken %d = add i32 %0, %1 22a919d3d8SAndrew Litteken br label %bb5 23a919d3d8SAndrew Litteken 24a919d3d8SAndrew Littekenbb4: 25a919d3d8SAndrew Litteken %e = sub i32 %0, %1 26a919d3d8SAndrew Litteken br label %bb2 27a919d3d8SAndrew Litteken 28a919d3d8SAndrew Littekenbb5: 29a919d3d8SAndrew Litteken %f = phi i32 [ 0, %bb1 ], [ 1, %bb2 ], [ 1, %bb3 ] 30a919d3d8SAndrew Litteken ret void 31a919d3d8SAndrew Litteken} 32a919d3d8SAndrew Litteken 33a919d3d8SAndrew Littekendefine void @func2(i32 %0, i32 %1) local_unnamed_addr #0 { 34a919d3d8SAndrew Littekenbb1: 35a919d3d8SAndrew Litteken br label %bb5 36a919d3d8SAndrew Litteken 37a919d3d8SAndrew Littekenbb2: 38a919d3d8SAndrew Litteken %a = sub i32 %0, %1 39a919d3d8SAndrew Litteken %b = add i32 %0, %1 40a919d3d8SAndrew Litteken %c = icmp eq i32 %b, 1 41a919d3d8SAndrew Litteken br i1 %c, label %bb5, label %bb3 42a919d3d8SAndrew Litteken 43a919d3d8SAndrew Littekenbb3: 44a919d3d8SAndrew Litteken %d = add i32 %0, %1 45a919d3d8SAndrew Litteken br label %bb5 46a919d3d8SAndrew Litteken 47a919d3d8SAndrew Littekenbb4: 48a919d3d8SAndrew Litteken %e = add i32 %0, %1 49a919d3d8SAndrew Litteken br label %bb2 50a919d3d8SAndrew Litteken 51a919d3d8SAndrew Littekenbb5: 52a919d3d8SAndrew Litteken %f = phi i32 [ 0, %bb1 ], [ 1, %bb3 ], [ 1, %bb2 ] 53a919d3d8SAndrew Litteken ret void 54a919d3d8SAndrew Litteken} 55a919d3d8SAndrew Litteken; CHECK-LABEL: @func1( 56a919d3d8SAndrew Litteken; CHECK-NEXT: bb1: 57a919d3d8SAndrew Litteken; CHECK-NEXT: [[F_CE_LOC:%.*]] = alloca i32, align 4 58a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5:%.*]] 59a919d3d8SAndrew Litteken; CHECK: bb2: 60a919d3d8SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = add i32 [[TMP0:%.*]], [[TMP1:%.*]] 6141d5033eSNikita Popov; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[F_CE_LOC]]) 6241d5033eSNikita Popov; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[TMP0]], i32 [[TMP1]], ptr [[F_CE_LOC]], i32 0) 6341d5033eSNikita Popov; CHECK-NEXT: [[F_CE_RELOAD:%.*]] = load i32, ptr [[F_CE_LOC]], align 4 6441d5033eSNikita Popov; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[F_CE_LOC]]) 65a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5]] 66a919d3d8SAndrew Litteken; CHECK: bb4: 67a919d3d8SAndrew Litteken; CHECK-NEXT: [[E:%.*]] = sub i32 [[TMP0]], [[TMP1]] 68a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB2:%.*]] 69a919d3d8SAndrew Litteken; CHECK: bb5: 70a919d3d8SAndrew Litteken; CHECK-NEXT: [[F:%.*]] = phi i32 [ 0, [[BB1:%.*]] ], [ [[F_CE_RELOAD]], [[BB2]] ] 71a919d3d8SAndrew Litteken; CHECK-NEXT: ret void 72a919d3d8SAndrew Litteken; 73a919d3d8SAndrew Litteken; 74a919d3d8SAndrew Litteken; CHECK-LABEL: @func2( 75a919d3d8SAndrew Litteken; CHECK-NEXT: bb1: 76a919d3d8SAndrew Litteken; CHECK-NEXT: [[F_CE_LOC:%.*]] = alloca i32, align 4 77a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5:%.*]] 78a919d3d8SAndrew Litteken; CHECK: bb2: 79a919d3d8SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = sub i32 [[TMP0:%.*]], [[TMP1:%.*]] 8041d5033eSNikita Popov; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[F_CE_LOC]]) 8141d5033eSNikita Popov; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[TMP0]], i32 [[TMP1]], ptr [[F_CE_LOC]], i32 1) 8241d5033eSNikita Popov; CHECK-NEXT: [[F_CE_RELOAD:%.*]] = load i32, ptr [[F_CE_LOC]], align 4 8341d5033eSNikita Popov; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[F_CE_LOC]]) 84a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5]] 85a919d3d8SAndrew Litteken; CHECK: bb4: 86a919d3d8SAndrew Litteken; CHECK-NEXT: [[E:%.*]] = add i32 [[TMP0]], [[TMP1]] 87a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB2:%.*]] 88a919d3d8SAndrew Litteken; CHECK: bb5: 89a919d3d8SAndrew Litteken; CHECK-NEXT: [[F:%.*]] = phi i32 [ 0, [[BB1:%.*]] ], [ [[F_CE_RELOAD]], [[BB2]] ] 90a919d3d8SAndrew Litteken; CHECK-NEXT: ret void 91a919d3d8SAndrew Litteken; 92a919d3d8SAndrew Litteken; 93a919d3d8SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0( 94a919d3d8SAndrew Litteken; CHECK-NEXT: newFuncRoot: 95a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB2_TO_OUTLINE:%.*]] 96a919d3d8SAndrew Litteken; CHECK: bb2_to_outline: 97a919d3d8SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = add i32 [[TMP0:%.*]], [[TMP1:%.*]] 98a919d3d8SAndrew Litteken; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[B]], 1 99a919d3d8SAndrew Litteken; CHECK-NEXT: br i1 [[C]], label [[BB5_SPLIT:%.*]], label [[BB3:%.*]] 100a919d3d8SAndrew Litteken; CHECK: bb3: 101a919d3d8SAndrew Litteken; CHECK-NEXT: [[D:%.*]] = add i32 [[TMP0]], [[TMP1]] 102a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5_SPLIT]] 103a919d3d8SAndrew Litteken; CHECK: bb5.split: 104a919d3d8SAndrew Litteken; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ 1, [[BB3]] ], [ 1, [[BB2_TO_OUTLINE]] ] 105a919d3d8SAndrew Litteken; CHECK-NEXT: [[F_CE:%.*]] = phi i32 [ 1, [[BB2_TO_OUTLINE]] ], [ 1, [[BB3]] ] 106a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[BB5_EXITSTUB:%.*]] 107a919d3d8SAndrew Litteken; CHECK: bb5.exitStub: 108a919d3d8SAndrew Litteken; CHECK-NEXT: switch i32 [[TMP3:%.*]], label [[FINAL_BLOCK_0:%.*]] [ 109a919d3d8SAndrew Litteken; CHECK-NEXT: i32 0, label [[OUTPUT_BLOCK_0_0:%.*]] 110a919d3d8SAndrew Litteken; CHECK-NEXT: i32 1, label [[OUTPUT_BLOCK_1_0:%.*]] 111a919d3d8SAndrew Litteken; CHECK-NEXT: ] 112a919d3d8SAndrew Litteken; CHECK: output_block_0_0: 11341d5033eSNikita Popov; CHECK-NEXT: store i32 [[F_CE]], ptr [[TMP2:%.*]], align 4 114a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_0]] 115a919d3d8SAndrew Litteken; CHECK: output_block_1_0: 11641d5033eSNikita Popov; CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP2]], align 4 117a919d3d8SAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_0]] 118a919d3d8SAndrew Litteken; CHECK: final_block_0: 119a919d3d8SAndrew Litteken; CHECK-NEXT: ret void 120a919d3d8SAndrew Litteken; 121