diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -3192,7 +3192,8 @@ unsigned PPCTargetLowering::getJumpTableEncoding() const { if (isJumpTableRelative()) return MachineJumpTableInfo::EK_LabelDifference32; - + if (UseAbsoluteJumpTables) + return MachineJumpTableInfo::EK_BlockAddress; return TargetLowering::getJumpTableEncoding(); } diff --git a/llvm/test/CodeGen/PowerPC/absol-jump-table-enabled.ll b/llvm/test/CodeGen/PowerPC/absol-jump-table-enabled.ll --- a/llvm/test/CodeGen/PowerPC/absol-jump-table-enabled.ll +++ b/llvm/test/CodeGen/PowerPC/absol-jump-table-enabled.ll @@ -7,6 +7,39 @@ ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - \ ; RUN: -ppc-use-absolute-jumptables -ppc-asm-full-reg-names \ ; RUN: -verify-machineinstrs %s | FileCheck %s -check-prefix=CHECK-BE +; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -o - \ +; RUN: -ppc-use-absolute-jumptables -ppc-asm-full-reg-names \ +; RUN: -verify-machineinstrs %s | FileCheck %s -check-prefix=CHECK-AIX +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=true --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-A-PIC-LE +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=false --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-R-PIC-LE +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=true --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-A-PIC-BE +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=false --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-R-PIC-BE +; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -o - \ +; RUN: -ppc-use-absolute-jumptables=true --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-A-PIC-AIX +; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -o - \ +; RUN: -ppc-use-absolute-jumptables=false --relocation-model=pic < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-R-PIC-AIX +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=true --relocation-model=static < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-A-STATIC-LE +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=false --relocation-model=static < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-R-STATIC-LE +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=true --relocation-model=static < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-A-STATIC-BE +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - \ +; RUN: -ppc-use-absolute-jumptables=false --relocation-model=static < %s | FileCheck %s \ +; RUN: -check-prefix=CHECK-R-STATIC-BE %struct.node = type { i8, ptr } @@ -22,11 +55,49 @@ ; ; CHECK-BE-LABEL: jumpTableTest: ; CHECK-BE: # %bb.0: # %entry -; CHECK-BE: rldic r[[REG:[0-9]+]], r[[REG]], 2, 30 -; CHECK-BE: lwax r[[REG]], r[[REG]], r[[REG1:[0-9]+]] +; CHECK-BE: rldic r[[REG:[0-9]+]], r[[REG]], 3, 29 +; CHECK-BE: ldx r[[REG]], r[[REG]], r[[REG1:[0-9]+]] ; CHECK-BE: mtctr r[[REG]] ; CHECK-BE: bctr ; CHECK-BE: blr +; +; CHECK-AIX-LABEL: jumpTableTest: +; CHECK-AIX: # %bb.0: # %entry +; CHECK-AIX: rldic r[[REG:[0-9]+]], r[[REG]], 3, 29 +; CHECK-AIX: ldx r[[REG]], r[[REG]], r[[REG1:[0-9]+]] +; CHECK-AIX: mtctr r[[REG]] +; CHECK-AIX: bctr +; CHECK-AIX: blr +; +; CHECK-A-PIC-LE-LABEL: .LJTI0_0: +; CHECK-A-PIC-LE: .quad .LBB0_6 +; +; CHECK-R-PIC-LE-LABEL: .LJTI0_0: +; CHECK-R-PIC-LE: .long .LBB0_6-.LJTI0_0 +; +; CHECK-A-PIC-BE-LABEL: .LJTI0_0: +; CHECK-A-PIC-BE: .quad .LBB0_9 +; +; CHECK-R-PIC-BE-LABEL: .LJTI0_0: +; CHECK-R-PIC-BE: .long .LBB0_9-.LJTI0_0 +; +; CHECK-A-PIC-AIX-LABEL: L..JTI0_0: +; CHECK-A-PIC-AIX: .vbyte 8, L..BB0_9 +; +; CHECK-R-PIC-AIX-LABEL: L..JTI0_0: +; CHECK-R-PIC-AIX: .vbyte 4, L..BB0_9-L..JTI0_0 +; +; CHECK-A-STATIC-LE-LABEL: .LJTI0_0: +; CHECK-A-STATIC-LE: .quad .LBB0_6 +; +; CHECK-R-STATIC-LE-LABEL: .LJTI0_0: +; CHECK-R-STATIC-LE: .long .LBB0_6-.LJTI0_0 +; +; CHECK-A-STATIC-BE-LABEL: .LJTI0_0: +; CHECK-A-STATIC-BE: .quad .LBB0_9 +; +; CHECK-R-STATIC-BE-LABEL: .LJTI0_0: +; CHECK-R-STATIC-BE: .long .LBB0_9-.LJTI0_0 entry: %cmp36 = icmp eq ptr %list, null br i1 %cmp36, label %while.end, label %while.body diff --git a/llvm/test/CodeGen/PowerPC/pcrel-jump-table.ll b/llvm/test/CodeGen/PowerPC/pcrel-jump-table.ll --- a/llvm/test/CodeGen/PowerPC/pcrel-jump-table.ll +++ b/llvm/test/CodeGen/PowerPC/pcrel-jump-table.ll @@ -35,13 +35,12 @@ ; CHECK-A-LE-NEXT: bctr ; CHECK-A-BE-LABEL: jumptable: ; CHECK-A-BE: # %bb.1: # %entry -; CHECK-A-BE-NEXT: paddi r5, 0, .LJTI0_0@PCREL, 1 ; CHECK-A-BE-NEXT: rldic r4, r4 -; CHECK-A-BE-NEXT: lwax r4, r4, r5 +; CHECK-A-BE-NEXT: paddi r5, 0, .LJTI0_0@PCREL, 1 +; CHECK-A-BE-NEXT: ldx r4, r4, r5 ; CHECK-A-BE-NEXT: mtctr r4 ; CHECK-A-BE-NEXT: bctr - entry: switch i32 %param, label %sw.default [ i32 1, label %return