mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
a724b41684
Summary: The main challenge here is that X86InstrInfo::AnalyzeBranch doesn't understand the way we're using a CALL instruction as a branch, so we can't list the CallTarget MBB as a successor of the entry block. If we don't list it as a successor, then the AsmPrinter doesn't print a label for the MBB. Fix the issue by inserting our own label at the beginning of the call target block. We can rely on the AsmPrinter to always emit it, even though the block appears to be unreachable, but address-taken. Fixes PR38391. Reviewers: thegameg, chandlerc, echristo Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D53653 llvm-svn: 345426
43 lines
1.3 KiB
LLVM
43 lines
1.3 KiB
LLVM
; RUN: llc -verify-machineinstrs -mtriple=i686-linux < %s | FileCheck --implicit-check-not="jmp.*\*" --implicit-check-not="call.*\*" %s
|
|
|
|
; Test 32-bit retpoline when -mregparm=3 is used. This case is interesting
|
|
; because there are no available scratch registers. The Linux kernel builds
|
|
; with -mregparm=3, so we need to support it. TCO should fail because we need
|
|
; to restore EDI.
|
|
|
|
define void @call_edi(void (i32, i32, i32)* %fp) #0 {
|
|
entry:
|
|
tail call void %fp(i32 inreg 0, i32 inreg 0, i32 inreg 0)
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: call_edi:
|
|
; EDI is used, so it must be saved.
|
|
; CHECK: pushl %edi
|
|
; CHECK-DAG: xorl %eax, %eax
|
|
; CHECK-DAG: xorl %edx, %edx
|
|
; CHECK-DAG: xorl %ecx, %ecx
|
|
; CHECK-DAG: movl {{.*}}, %edi
|
|
; CHECK: calll __llvm_retpoline_edi
|
|
; CHECK: popl %edi
|
|
; CHECK: retl
|
|
|
|
define void @edi_external(void (i32, i32, i32)* %fp) #1 {
|
|
entry:
|
|
tail call void %fp(i32 inreg 0, i32 inreg 0, i32 inreg 0)
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: edi_external:
|
|
; CHECK: pushl %edi
|
|
; CHECK-DAG: xorl %eax, %eax
|
|
; CHECK-DAG: xorl %edx, %edx
|
|
; CHECK-DAG: xorl %ecx, %ecx
|
|
; CHECK-DAG: movl {{.*}}, %edi
|
|
; CHECK: calll __x86_indirect_thunk_edi
|
|
; CHECK: popl %edi
|
|
; CHECK: retl
|
|
|
|
attributes #0 = { "target-features"="+retpoline-indirect-calls" }
|
|
attributes #1 = { "target-features"="+retpoline-indirect-calls,+retpoline-external-thunk" }
|