mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-16 18:35:53 +00:00

Summary: Conditional returns were not taken into consideration at all. Implement them by turning them into jumps and normal returns. This means there is a slightly higher performance penalty for conditional returns, but this is the best we can do, and it still disturbs little of the rest. Reviewers: dberris, echristo Subscribers: sanjoy, nemanjai, hiraditya, kbarton, llvm-commits Differential Revision: https://reviews.llvm.org/D38102 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314005 91177308-0d34-0410-b5e6-96231b3b80d8
80 lines
1.8 KiB
LLVM
80 lines
1.8 KiB
LLVM
; RUN: llc -filetype=asm -o - -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
define void @Foo(i32 signext %a, i32 signext %b) #0 {
|
|
; CHECK-LABEL: @Foo
|
|
; CHECK: cmpw [[CR:[0-9]+]]
|
|
; CHECK-NEXT: ble [[CR]], [[LABEL:\.[a-zA-Z0-9]+]]
|
|
; CHECK-NEXT: .p2align 3
|
|
; CHECK-NEXT: {{\.[a-zA-Z0-9]+}}:
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: std 0
|
|
; CHECK-NEXT: mflr 0
|
|
; CHECK-NEXT: bl __xray_FunctionExit
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: mtlr 0
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: [[LABEL]]:
|
|
entry:
|
|
%cmp = icmp sgt i32 %a, %b
|
|
br i1 %cmp, label %return, label %if.end
|
|
|
|
; CHECK: .p2align 3
|
|
; CHECK-NEXT: {{\.[a-zA-Z0-9]+}}:
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: std 0
|
|
; CHECK-NEXT: mflr 0
|
|
; CHECK-NEXT: bl __xray_FunctionExit
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: mtlr 0
|
|
; CHECK-NEXT: blr
|
|
if.end:
|
|
tail call void @Bar()
|
|
br label %return
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
define void @Foo2(i32 signext %a, i32 signext %b) #0 {
|
|
; CHECK-LABEL: @Foo2
|
|
; CHECK: cmpw [[CR:[0-9]+]]
|
|
; CHECK-NEXT: bge [[CR]], [[LABEL:\.[a-zA-Z0-9]+]]
|
|
; CHECK-NEXT: .p2align 3
|
|
; CHECK-NEXT: {{\.[a-zA-Z0-9]+}}:
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: std 0
|
|
; CHECK-NEXT: mflr 0
|
|
; CHECK-NEXT: bl __xray_FunctionExit
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: mtlr 0
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: [[LABEL]]:
|
|
entry:
|
|
%cmp = icmp slt i32 %a, %b
|
|
br i1 %cmp, label %return, label %if.end
|
|
|
|
; CHECK: .p2align 3
|
|
; CHECK-NEXT: {{\.[a-zA-Z0-9]+}}:
|
|
; CHECK-NEXT: blr
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: std 0
|
|
; CHECK-NEXT: mflr 0
|
|
; CHECK-NEXT: bl __xray_FunctionExit
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: mtlr 0
|
|
; CHECK-NEXT: blr
|
|
if.end:
|
|
tail call void @Bar()
|
|
br label %return
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
declare void @Bar()
|
|
|
|
attributes #0 = { "function-instrument"="xray-always" }
|