mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-21 00:32:23 +00:00
d1f1656447
Our PPC64 ELF V2 call lowering logic added r2 as an operand to all direct call instructions in order to represent the dependency on the TOC base pointer value. Restricting this to ELF V2, however, does not seem to make sense: calls under ELF V1 have the same dependence, and indirect calls have an r2 dependence just as direct ones. Make sure the dependence is noted for all calls under both ELF V1 and ELF V2. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226432 91177308-0d34-0410-b5e6-96231b3b80d8
48 lines
1.4 KiB
LLVM
48 lines
1.4 KiB
LLVM
; RUN: llc -mcpu=a2 < %s | FileCheck %s -check-prefix=INVFUNCDESC
|
|
; RUN: llc -mcpu=a2 -mattr=-invariant-function-descriptors < %s | FileCheck %s -check-prefix=NONINVFUNCDESC
|
|
target datalayout = "E-m:e-i64:64-n32:64"
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
; Function Attrs: nounwind
|
|
define void @bar(void (...)* nocapture %x) #0 {
|
|
entry:
|
|
%callee.knr.cast = bitcast void (...)* %x to void ()*
|
|
br label %for.body
|
|
|
|
; INVFUNCDESC-LABEL: @bar
|
|
; INVFUNCDESC-DAG: ld [[REG1:[0-9]+]], 8(3)
|
|
; INVFUNCDESC-DAG: ld [[REG2:[0-9]+]], 16(3)
|
|
; INVFUNCDESC-DAG: ld [[REG3:[0-9]+]], 0(3)
|
|
|
|
; INVFUNCDESC: %for.body
|
|
; INVFUNCDESC: std 2, 40(1)
|
|
; INVFUNCDESC-DAG: mtctr [[REG3]]
|
|
; INVFUNCDESC-DAG: mr 11, [[REG2]]
|
|
; INVFUNCDESC-DAG: mr 2, [[REG1]]
|
|
; INVFUNCDESC: bctrl
|
|
; INVFUNCDESC-NEXT: ld 2, 40(1)
|
|
|
|
; NONINVFUNCDESC-LABEL: @bar
|
|
; NONINVFUNCDESC: %for.body
|
|
; NONINVFUNCDESC: std 2, 40(1)
|
|
; NONINVFUNCDESC-DAG: ld 3, 0(30)
|
|
; NONINVFUNCDESC-DAG: ld 11, 16(30)
|
|
; NONINVFUNCDESC-DAG: ld 2, 8(30)
|
|
; NONINVFUNCDESC: mtctr 3
|
|
; NONINVFUNCDESC: bctrl
|
|
; NONINVFUNCDESC-NEXT: ld 2, 40(1)
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
|
tail call void %callee.knr.cast() #0
|
|
%inc = add nuw nsw i32 %i.02, 1
|
|
%exitcond = icmp eq i32 %inc, 1600000000
|
|
br i1 %exitcond, label %for.end, label %for.body
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|
|
|