mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
5342d25971
In file PPCBranchSelector.cpp we tend to over estimate code size due to large alignment and inline assembly. Usually it causes larger computed branch offset, it is not big problem. But sometimes it may also causes smaller computed branch offset than actual branch offset. If the offset is close to the limit of encoding, it may cause problem at run time. Following is a simplified example. actual estimated address address ... bne Far 100 10c .p2align 4 Near: 110 110 ... Far: 8108 8108 Actual offset: 0x8108 - 0x100 = 0x8008 Computed offset: 0x8108 - 0x10c = 0x7ffc The computed offset is at most ((1 << alignment) - 4) bytes smaller than actual offset. So we add this number to the offset for safety. Differential Revision: https://reviews.llvm.org/D57718 llvm-svn: 355529
46 lines
1.2 KiB
LLVM
46 lines
1.2 KiB
LLVM
; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
define i32 @relax_bcc(i1 %b) {
|
|
; CHECK-LABEL: relax_bcc:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: andi. 3, 3, 1
|
|
; CHECK-NEXT: #APP
|
|
; CHECK-NEXT: label:
|
|
; CHECK-NEXT: add 3, 3, 5
|
|
; CHECK-NEXT: cmpd 4, 3
|
|
; CHECK-NEXT: bne 0, label
|
|
; CHECK-NEXT: #NO_APP
|
|
; CHECK-NEXT: bc 12, 1, .+8
|
|
; CHECK-NEXT: b .LBB0_4
|
|
; CHECK-NEXT: # %bb.1:
|
|
; CHECK-NEXT: li 3, 101
|
|
; CHECK-NEXT: mtctr 3
|
|
; CHECK-NEXT: .p2align 4
|
|
; CHECK-NEXT: .LBB0_2:
|
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: bdnz .LBB0_2
|
|
; CHECK-NEXT: # %bb.3:
|
|
; CHECK-NEXT: #APP
|
|
; CHECK-NEXT: .space 32748
|
|
; CHECK-NEXT: #NO_APP
|
|
; CHECK-NEXT: .LBB0_4: # %tail
|
|
; CHECK-NEXT: li 3, 1
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
call void asm sideeffect "label:\0A\09add 3,3,5\0A\09cmpd 4,3\0A\09bne label", ""()
|
|
br i1 %b, label %for.body, label %tail
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%0 = phi i32 [0, %entry], [%1, %for.body]
|
|
%1 = add i32 %0, 1
|
|
%2 = icmp sgt i32 %1, 100
|
|
br i1 %2, label %exit, label %for.body
|
|
|
|
exit:
|
|
call void asm sideeffect ".space 32748", ""()
|
|
br label %tail
|
|
|
|
tail:
|
|
ret i32 1
|
|
}
|