1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00
llvm-mirror/test/CodeGen/PowerPC/branch_selector.ll
Guozhi Wei 5342d25971 [PPC] Adjust the computed branch offset for the possible shorter distance
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
2019-03-06 18:22:22 +00:00

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
}