mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
603148b130
This adds a custom InstVisitor to return false on instructions that should not be allowed to be outlined. These match the illegal instructions in the IRInstructionMapper with exception of the addition of the llvm.assume intrinsic. Tests all the tests marked: illegal-*-.ll with a test for each kind of instruction that has been marked as illegal. Reviewers: jroelofs, paquette Differential Revisions: https://reviews.llvm.org/D86976
71 lines
2.4 KiB
LLVM
71 lines
2.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -verify -iroutliner < %s | FileCheck %s
|
|
|
|
; This test checks that catchpad instructions are not outlined even if they
|
|
; in a similar section. Dealing with exception handling inside of an outlined
|
|
; function would require a lot of handling that is not implemented yet.
|
|
|
|
declare void @llvm.donothing() nounwind readnone
|
|
|
|
define void @function1() personality i8 3 {
|
|
; CHECK-LABEL: @function1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: invoke void @llvm.donothing()
|
|
; CHECK-NEXT: to label [[NORMAL:%.*]] unwind label [[EXCEPTION:%.*]]
|
|
; CHECK: exception:
|
|
; CHECK-NEXT: [[CS1:%.*]] = catchswitch within none [label %catchpad1] unwind to caller
|
|
; CHECK: catchpad1:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS1]] []
|
|
; CHECK-NEXT: call void @function1.outlined(i32* [[A]], i32* [[B]])
|
|
; CHECK-NEXT: br label [[NORMAL]]
|
|
; CHECK: normal:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%a = alloca i32, align 4
|
|
%b = alloca i32, align 4
|
|
invoke void @llvm.donothing() to label %normal unwind label %exception
|
|
exception:
|
|
%cs1 = catchswitch within none [label %catchpad1] unwind to caller
|
|
catchpad1:
|
|
catchpad within %cs1 []
|
|
store i32 2, i32* %a, align 4
|
|
store i32 3, i32* %b, align 4
|
|
br label %normal
|
|
normal:
|
|
ret void
|
|
}
|
|
|
|
define void @function2() personality i8 3 {
|
|
; CHECK-LABEL: @function2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
|
|
; CHECK-NEXT: invoke void @llvm.donothing()
|
|
; CHECK-NEXT: to label [[NORMAL:%.*]] unwind label [[EXCEPTION:%.*]]
|
|
; CHECK: exception:
|
|
; CHECK-NEXT: [[CS1:%.*]] = catchswitch within none [label %catchpad1] unwind to caller
|
|
; CHECK: catchpad1:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS1]] []
|
|
; CHECK-NEXT: call void @function2.outlined(i32* [[A]], i32* [[B]])
|
|
; CHECK-NEXT: br label [[NORMAL]]
|
|
; CHECK: normal:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%a = alloca i32, align 4
|
|
%b = alloca i32, align 4
|
|
invoke void @llvm.donothing() to label %normal unwind label %exception
|
|
exception:
|
|
%cs1 = catchswitch within none [label %catchpad1] unwind to caller
|
|
catchpad1:
|
|
catchpad within %cs1 []
|
|
store i32 2, i32* %a, align 4
|
|
store i32 3, i32* %b, align 4
|
|
br label %normal
|
|
normal:
|
|
ret void
|
|
}
|