Commit 660b0d7f authored by Xiangling Liao's avatar Xiangling Liao
Browse files

[AIX] Enable frame pointer for AIX and add related test suite

This patch:
   - enable frame pointer for AIX;
   - update some of red zone comments;
   - add/update testcases;

Differential Revision: https://reviews.llvm.org/D72454
parent f270da6b
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ static unsigned computeTOCSaveOffset(const PPCSubtarget &STI) {
}

static unsigned computeFramePointerSaveOffset(const PPCSubtarget &STI) {
  // SVR4 ABI: First slot in the general register save area.
  // First slot in the general register save area.
  return STI.isPPC64() ? -8U : -4U;
}

@@ -2436,8 +2436,6 @@ unsigned PPCFrameLowering::getTOCSaveOffset() const {
}

unsigned PPCFrameLowering::getFramePointerSaveOffset() const {
  if (Subtarget.isAIXABI())
    report_fatal_error("FramePointer is not implemented on AIX yet.");
  return FramePointerSaveOffset;
}

+9 −2
Original line number Diff line number Diff line
@@ -292,8 +292,15 @@ public:
    return Align(16);
  }

  // PPC32 SVR4ABI has no red zone and PPC64 SVR4ABI has a 288-byte red zone.
  unsigned getRedZoneSize() const { return isPPC64() ? 288 : 0; }
  unsigned  getRedZoneSize() const {
    if (isPPC64())
      // 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved)
      return 288;

    // AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
    // PPC32 SVR4ABI has no redzone.
    return isAIXABI() ? 220 : 0;
  }

  bool hasHTM() const { return HasHTM; }
  bool hasFloat128() const { return HasFloat128; }
+0 −26
Original line number Diff line number Diff line
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC32
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC64
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=CHECK-PPC32-NOFP
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=CHECK-PPC64-NOFP
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC32

; CHECK-PPC32: stwu 1, -32(1)
; CHECK-PPC32: stw 31, 28(1)
; CHECK-PPC32: lwz 31, 0(1)
; CHECK-PPC32-NOFP: stwu 1, -32(1)
; CHECK-PPC32-NOFP: stw 31, 28(1)
; CHECK-PPC32-NOFP: lwz 31, 0(1)

; CHECK-PPC64: std 31, -8(1)
; CHECK-PPC64: stdu 1, -64(1)
; CHECK-PPC64: ld 1, 0(1)
; CHECK-PPC64: ld 31, -8(1)
; CHECK-PPC64-NOFP: std 31, -8(1)
; CHECK-PPC64-NOFP: stdu 1, -64(1)
; CHECK-PPC64-NOFP: ld 1, 0(1)
; CHECK-PPC64-NOFP: ld 31, -8(1)

define i32* @f1(i32 %n) nounwind {
	%tmp = alloca i32, i32 %n		; <i32*> [#uses=1]
	ret i32* %tmp
}
+156 −0
Original line number Diff line number Diff line
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC32-LINUX

; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX

; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefixes=PPC64,PPC64-LINUX

; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefixes=PPC64,PPC64-LINUX

; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX

; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX

; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefixes=PPC64,PPC64-AIX

; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefixes=PPC64,PPC64-AIX

define dso_local signext i32 @foo(i32 %n) {
entry:
  %ptr0 = alloca i32*
  %0 = alloca i32, i32 %n
  store i32* %0, i32** %ptr0
  %1 = alloca i32, i32 %n
  %2 = alloca i32, i32 %n
  %3 = alloca i32, i32 %n
  %4 = alloca i32, i32 %n
  %5 = alloca i32, i32 %n
  %6 = alloca i32, i32 %n
  %7 = alloca i32, i32 %n
  %8 = alloca i32, i32 %n
  %9 = load i32*, i32** %ptr0

  %call = call i32 @bar(i32* %1, i32* %2, i32* %3, i32* %4, i32* %5, i32* %6, i32* %7, i32* %8, i32* %9)
  ret i32 %call
}

declare i32 @bar(i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*)

; PPC32-LINUX-LABEL: foo
; PPC32-LINUX: mflr 0
; PPC32-LINUX: stw 0, 4(1)
; PPC32-LINUX: stwu 1, -32(1)
; PPC32-LINUX: stw 31, 28(1)
; PPC32-LINUX: mr 31, 1
; PPC32-LINUX: addi 3, 31, 32
; PPC32-LINUX: stwux 3, 1, 10

; Allocated area is referred by stack pointer.
; PPC32-LINUX: addi 11, 1, 16

; Local variable area is referred by frame pointer.
; PPC32-LINUX: stw 11, 24(31)

; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX-NOT: stuwux

; Parameter save area is referred by stack pointer.
; PPC32-LINUX: stw 11, 8(1)

; PPC32-LINUX: bl bar
; PPC32-LINUX: lwz 31, 0(1)
; PPC32-LINUX: lwz 0, -4(31)
; PPC32-LINUX: mr 1, 31
; PPC32-LINUX: mr 31, 0
; PPC32-LINUX: lwz 0, 4(1)
; PPC32-LINUX: mtlr 0
; PPC32-LINUX: blr

; PPC64-LABEL: foo
; PPC64: mflr 0
; PPC64: std 31, -8(1)
; PPC64: std 0, 16(1)
; PPC64: stdu 1, -160(1)
; PPC64: mr 31, 1
; PPC64: addi 3, 31, 160
; PPC64: stdux 3, 1, 10

; Allocated area is referred by stack pointer.
; PPC64: addi 11, 1, 128

; Local variable area is referred by frame pointer.
; PPC64: std 11, 144(31)

; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64-NOT: stdux

; Parameter save area is referred by stack pointer.
; PPC64: std 11, 112(1)

; PPC64-LINUX: bl bar
; PPC64-AIX: bl .bar
; PPC64: ld 1, 0(1)
; PPC64: ld 0, 16(1)
; PPC64-DAG: ld 31, -8(1)
; PPC64-DAG: mtlr 0
; PPC64: blr

; PPC32-AIX: mflr 0
; PPC32-AIX: stw 31, -4(1)
; PPC32-AIX: stw 0, 8(1)
; PPC32-AIX: stwu 1, -80(1)
; PPC32-AIX: mr 31, 1
; PPC32-AIX: addi 3, 31, 80
; PPC32-AIX: stwux 3, 1, 10

; Allocated area is referred by stack pointer.
; PPC32-AIX: addi 11, 1, 64

; Local variable area is referred by frame pointer.
; PPC32-AIX: stw 11, 72(31)

; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX-NOT: stwux

; Parameter save area is referred by stack pointer.
; PPC32-AIX: stw 11, 56(1)

; PPC32-AIX: bl .bar
; PPC32-AIX: nop
; PPC32-AIX: lwz 1, 0(1)
; PPC32-AIX: lwz 0, 8(1)
; PPC32-AIX-DAG: mtlr 0
; PPC32-AIX-DAG: lwz 31, -4(1)
; PPC32-AIX: blr
+101 −0
Original line number Diff line number Diff line
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=PPC64-LINUX
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC64-LINUX
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX

; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC32-AIX

; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX

; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC64-AIX

; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX

define i32* @f1(i32 %n) nounwind {
        %tmp = alloca i32, i32 %n               ; <i32*> [#uses=1]
        ret i32* %tmp
}

; PPC32-LINUX-LABEL: f1
; PPC32-LINUX:      stwu 1, -32(1)
; PPC32-LINUX-NEXT: slwi 3, 3, 2
; PPC32-LINUX-NEXT: addi 3, 3, 15
; PPC32-LINUX-NEXT: stw 31, 28(1)
; PPC32-LINUX-NEXT: mr 31, 1
; PPC32-LINUX-NEXT: rlwinm 3, 3, 0, 0, 27
; PPC32-LINUX-NEXT: neg 3, 3
; PPC32-LINUX-NEXT: addi 4, 31, 32
; PPC32-LINUX-NEXT: stwux 4, 1, 3
; PPC32-LINUX-NEXT: lwz 31, 0(1)
; PPC32-LINUX-NEXT: addi 3, 1, 16
; PPC32-LINUX-NEXT: lwz 0, -4(31)
; PPC32-LINUX-NEXT: mr 1, 31
; PPC32-LINUX-NEXT: mr 31, 0
; PPC32-LINUX-NEXT: blr

; PPC64-LINUX-LABEL: f1
; PPC64-LINUX:      std 31, -8(1)
; PPC64-LINUX-NEXT: stdu 1, -64(1)
; PPC64-LINUX-NEXT: lis 4, 32767
; PPC64-LINUX-NEXT: rldic 3, 3, 2, 30
; PPC64-LINUX-NEXT: ori 4, 4, 65535
; PPC64-LINUX-NEXT: addi 3, 3, 15
; PPC64-LINUX-NEXT: sldi 4, 4, 4
; PPC64-LINUX-NEXT: mr 31, 1
; PPC64-LINUX-NEXT: and 3, 3, 4
; PPC64-LINUX-NEXT: neg 3, 3
; PPC64-LINUX-NEXT: addi 4, 31, 64
; PPC64-LINUX-NEXT: stdux 4, 1, 3

; The linkage area is always put on the top of the stack.
; PPC64-LINUX-NEXT: addi 3, 1, 48

; PPC64-LINUX-NEXT: ld 1, 0(1)
; PPC64-LINUX-NEXT: ld 31, -8(1)
; PPC64-LINUX-NEXT: blr

; PPC32-AIX-LABEL: f1
; PPC32-AIX:      stw 31, -4(1)
; PPC32-AIX-NEXT: stwu 1, -48(1)
; PPC32-AIX-NEXT: slwi 3, 3, 2
; PPC32-AIX-NEXT: mr 31, 1
; PPC32-AIX-NEXT: addi 3, 3, 15
; PPC32-AIX-NEXT: addi 4, 31, 48
; PPC32-AIX-NEXT: rlwinm 3, 3, 0, 0, 27
; PPC32-AIX-NEXT: neg 3, 3
; PPC32-AIX-NEXT: stwux 4, 1, 3

; The linkage area is always put on the top of the stack.
; PPC32-AIX-NEXT: addi 3, 1, 32

; PPC32-AIX-NEXT: lwz 1, 0(1)
; PPC32-AIX-NEXT: lwz 31, -4(1)
; PPC32-AIX-NEXT: blr

; PPC64-AIX-LABEL: f1
; PPC64-AIX:      std 31, -8(1)
; PPC64-AIX-NEXT: stdu 1, -64(1)
; PPC64-AIX-NEXT: lis 4, 32767
; PPC64-AIX-NEXT: rldic 3, 3, 2, 30
; PPC64-AIX-NEXT: ori 4, 4, 65535
; PPC64-AIX-NEXT: addi 3, 3, 15
; PPC64-AIX-NEXT: sldi 4, 4, 4
; PPC64-AIX-NEXT: mr 31, 1
; PPC64-AIX-NEXT: and 3, 3, 4
; PPC64-AIX-NEXT: addi 4, 31, 64
; PPC64-AIX-NEXT: neg 3, 3
; PPC64-AIX-NEXT: stdux 4, 1, 3

; The linkage area is always put on the top of the stack.
; PPC64-AIX-NEXT: addi 3, 1, 48

; PPC64-AIX-NEXT: ld 1, 0(1)
; PPC64-AIX-NEXT: ld 31, -8(1)
; PPC64-AIX-NEXT: blr
Loading