mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
ff58b9b50b
Extracted regions can have both inputs and outputs. In addition, the CodeExtractor removes inputs that are only used in llvm.assumes, and sunken allocas (values are used entirely in the extracted region as denoted by lifetime intrinsics). We also cannot combine sections that have different constants in the same structural location, and these constants will have to elevated to argument. This patch deduplicates extracted functions that only have inputs and non of the special cases. We test that correctly deduplicate in: test/Transforms/IROutliner/outlining-same-globals.ll test/Transforms/IROutliner/outlining-same-constants.ll test/Transforms/IROutliner/outlining-different-structure.ll Reviewers: jroelofs, paquette Differential Revision: https://reviews.llvm.org/D86978
50 lines
1.4 KiB
LLVM
50 lines
1.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -verify -iroutliner < %s | FileCheck %s
|
|
|
|
; Show that we do not extract phi nodes as it would require extra label and
|
|
; control flow checking.
|
|
|
|
define void @function1(i32* %a, i32* %b) {
|
|
; CHECK-LABEL: @function1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FIRST:%.*]]
|
|
; CHECK: first:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 3, [[NEXT:%.*]] ]
|
|
; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A:%.*]], i32* [[B:%.*]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: next:
|
|
; CHECK-NEXT: br label [[FIRST]]
|
|
;
|
|
entry:
|
|
br label %first
|
|
first:
|
|
%0 = phi i32 [ 0, %entry ], [ 3, %next ]
|
|
store i32 2, i32* %a, align 4
|
|
store i32 3, i32* %b, align 4
|
|
ret void
|
|
next:
|
|
br label %first
|
|
}
|
|
|
|
define void @function2(i32* %a, i32* %b) {
|
|
; CHECK-LABEL: @function2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FIRST:%.*]]
|
|
; CHECK: first:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 3, [[NEXT:%.*]] ]
|
|
; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A:%.*]], i32* [[B:%.*]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: next:
|
|
; CHECK-NEXT: br label [[FIRST]]
|
|
;
|
|
entry:
|
|
br label %first
|
|
first:
|
|
%0 = phi i32 [ 0, %entry ], [ 3, %next ]
|
|
store i32 2, i32* %a, align 4
|
|
store i32 3, i32* %b, align 4
|
|
ret void
|
|
next:
|
|
br label %first
|
|
}
|