mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
ea7e6b3857
This patch accompanies the RFC posted here: http://lists.llvm.org/pipermail/llvm-dev/2018-October/127239.html This patch adds a new CallBr IR instruction to support asm-goto inline assembly like gcc as used by the linux kernel. This instruction is both a call instruction and a terminator instruction with multiple successors. Only inline assembly usage is supported today. This also adds a new INLINEASM_BR opcode to SelectionDAG and MachineIR to represent an INLINEASM block that is also considered a terminator instruction. There will likely be more bug fixes and optimizations to follow this, but we felt it had reached a point where we would like to switch to an incremental development model. Patch by Craig Topper, Alexander Ivchenko, Mikhail Dvoretckii Differential Revision: https://reviews.llvm.org/D53765 llvm-svn: 353563
15 lines
428 B
LLVM
15 lines
428 B
LLVM
; RUN: llvm-dis < %s.bc | FileCheck %s
|
|
|
|
; callbr.ll.bc was generated by passing this file to llvm-as.
|
|
|
|
define i32 @test_asm_goto(i32 %x){
|
|
entry:
|
|
; CHECK: callbr void asm "", "r,X"(i32 %x, i8* blockaddress(@test_asm_goto, %fail))
|
|
; CHECK-NEXT: to label %normal [label %fail]
|
|
callbr void asm "", "r,X"(i32 %x, i8* blockaddress(@test_asm_goto, %fail)) to label %normal [label %fail]
|
|
normal:
|
|
ret i32 1
|
|
fail:
|
|
ret i32 0
|
|
}
|