[IROutliner] Handling outlined code with no exit paths

As a result of adding multiblock outlining, it became possible to outline the entirety of basic block, and branches that only pointed to the basic blocks contained in the outlined section. This means that there are no exit paths, and no return statement. There was a previous assertion from the older version of the outliner that explicitly made sure there was a return statement. This removes that assertion.

Reviewers: paquette

Differential Revision: https://reviews.llvm.org/D120868
This commit is contained in:
Andrew Litteken 2022-03-02 22:50:40 -06:00
parent c31f0a0050
commit 0b3a6c8d20
2 changed files with 55 additions and 2 deletions

View File

@ -691,8 +691,6 @@ static void moveFunctionData(Function &Old, Function &New,
for (Instruction *I : DebugInsts)
I->eraseFromParent();
}
assert(NewEnds.size() > 0 && "No return instruction for new function?");
}
/// Find the the constants that will need to be lifted into arguments

View File

@ -0,0 +1,55 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s
; Make sure that we outline safely from functions with no return instructions.
; The code extractor will insert return instructions in the outer function
; due to assumptions about the contents of the outlined region.
define void @f1() {
bb:
br label %bb1
bb1:
br label %bb1
}
define void @f2() {
bb:
br label %bb1
bb1:
br label %bb1
}
define void @f3() {
bb:
br label %bb1
bb1:
br label %bb1
}
; CHECK-LABEL: @f1(
; CHECK-NEXT: bb:
; CHECK-NEXT: br label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB1]]
;
;
; CHECK-LABEL: @f2(
; CHECK-NEXT: bb:
; CHECK-NEXT: call void @outlined_ir_func_0()
; CHECK-NEXT: ret void
;
;
; CHECK-LABEL: @f3(
; CHECK-NEXT: bb:
; CHECK-NEXT: call void @outlined_ir_func_0()
; CHECK-NEXT: ret void
;
;
; CHECK-LABEL: define internal void @outlined_ir_func_0(
; CHECK-NEXT: newFuncRoot:
; CHECK-NEXT: br label [[BB_TO_OUTLINE:%.*]]
; CHECK: bb_to_outline:
; CHECK-NEXT: br label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB1]]
;