Skip to content

[PPC] Replace PPCMergeStringPool with GlobalMerge for Linux #114850

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions llvm/lib/CodeGen/GlobalMerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
Expand Down Expand Up @@ -713,6 +714,24 @@ bool GlobalMergeImpl::run(Module &M) {
// Ignore all "required" globals:
if (isMustKeepGlobalVariable(&GV))
continue;
auto checkUsers = [] (const GlobalVariable *GV) {
for (const User *CurrentUser : GV->users()) {
if (auto *I = dyn_cast<Instruction>(CurrentUser)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit:
Maybe we can flatten this if statement.

auto *I = dyn_cast<Instruction>(CurrentUser);
if (!I)
  continue;
  <rest of code...>

// Do not merge globals in exception pads.
if (I->isEHPad())
return false;
if (auto *II = dyn_cast<IntrinsicInst>(I)) {
// Some intrinsics require a plain global.
if (II->getIntrinsicID() == Intrinsic::eh_typeid_for)
return false;
}
}
}
return true;
};

if (!checkUsers(&GV))
continue;

// Don't merge tagged globals, as each global should have its own unique
// memory tag at runtime. TODO(hctim): This can be relaxed: constant globals
Expand Down
9 changes: 1 addition & 8 deletions llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,17 +503,10 @@ bool PPCPassConfig::addPreISel() {
// Specifying the command line option overrides the AIX default.
if ((EnableGlobalMerge.getNumOccurrences() > 0)
? EnableGlobalMerge
: (TM->getTargetTriple().isOSAIX() &&
getOptLevel() != CodeGenOptLevel::None))
: getOptLevel() != CodeGenOptLevel::None)
addPass(createGlobalMergePass(TM, GlobalMergeMaxOffset, false, false, true,
true));

if ((MergeStringPool.getNumOccurrences() > 0)
? MergeStringPool
: (TM->getTargetTriple().isOSLinux() &&
getOptLevel() != CodeGenOptLevel::None))
addPass(createPPCMergeStringPoolPass());

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we don't use this pass anymore you can probably just delete the pass source code as well. You can do it in this patch or in another patch if you prefer that.

if (!DisableInstrFormPrep && getOptLevel() != CodeGenOptLevel::None)
addPass(createPPCLoopInstrFormPrepPass(getPPCTargetMachine()));

Expand Down
1 change: 1 addition & 0 deletions llvm/test/CodeGen/PowerPC/O3-pipeline.ll
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
; CHECK-NEXT: CodeGen Prepare
; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Exception handling preparation
; CHECK-NEXT: Merge internal globals
; CHECK-NEXT: Natural Loop Information
; CHECK-NEXT: Scalar Evolution Analysis
; CHECK-NEXT: Prepare loop for ppc preferred instruction forms
Expand Down
32 changes: 16 additions & 16 deletions llvm/test/CodeGen/PowerPC/PR35812-neg-cmpxchg.ll
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,21 @@ define signext i32 @main() nounwind {
; CHECK-NEXT: cmplwi 3, 234
; CHECK-NEXT: bne 0, .LBB0_7
; CHECK-NEXT: # %bb.5: # %L.B0001
; CHECK-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-NEXT: bl puts
; CHECK-NEXT: nop
; CHECK-NEXT: li 3, 0
; CHECK-NEXT: b .LBB0_9
; CHECK-NEXT: .LBB0_6: # %L.B0003
; CHECK-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-NEXT: addi 3, 3, 7
; CHECK-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-NEXT: addi 3, 3, 16
; CHECK-NEXT: b .LBB0_8
; CHECK-NEXT: .LBB0_7: # %L.B0005
; CHECK-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-NEXT: addi 3, 3, 53
; CHECK-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-NEXT: addi 3, 3, 64
; CHECK-NEXT: .LBB0_8: # %L.B0003
; CHECK-NEXT: bl puts
; CHECK-NEXT: nop
Expand Down Expand Up @@ -107,21 +107,21 @@ define signext i32 @main() nounwind {
; CHECK-P7-NEXT: cmplwi 3, 234
; CHECK-P7-NEXT: bne 0, .LBB0_7
; CHECK-P7-NEXT: # %bb.5: # %L.B0001
; CHECK-P7-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-P7-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-P7-NEXT: bl puts
; CHECK-P7-NEXT: nop
; CHECK-P7-NEXT: li 3, 0
; CHECK-P7-NEXT: b .LBB0_9
; CHECK-P7-NEXT: .LBB0_6: # %L.B0003
; CHECK-P7-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-P7-NEXT: addi 3, 3, 7
; CHECK-P7-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-P7-NEXT: addi 3, 3, 16
; CHECK-P7-NEXT: b .LBB0_8
; CHECK-P7-NEXT: .LBB0_7: # %L.B0005
; CHECK-P7-NEXT: addis 3, 2, .L__ModuleStringPool@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L__ModuleStringPool@toc@l
; CHECK-P7-NEXT: addi 3, 3, 53
; CHECK-P7-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; CHECK-P7-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; CHECK-P7-NEXT: addi 3, 3, 64
; CHECK-P7-NEXT: .LBB0_8: # %L.B0003
; CHECK-P7-NEXT: bl puts
; CHECK-P7-NEXT: nop
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/PowerPC/aix-xcoff-used-with-stringpool.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
;; in llvm.used or in llvm.compiler.used.

; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple powerpc-ibm-aix-xcoff \
; RUN: -ppc-merge-string-pool=true -global-merge-all-const=false -data-sections=false < %s | \
; RUN: -data-sections=false < %s | \
; RUN: FileCheck %s

; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple powerpc64-ibm-aix-xcoff \
; RUN: -ppc-merge-string-pool=true -global-merge-all-const=false -data-sections=false < %s | \
; RUN: -data-sections=false < %s | \
; RUN: FileCheck %s

@keep_this = internal constant [5 x i8] c"keep1", align 1
Expand Down Expand Up @@ -53,7 +53,7 @@ entry:
; CHECK: keep_this:
; CHECK: .lglobl keep_this2
; CHECK: keep_this2:
; CHECK: L..__ModuleStringPool:
; CHECK: L.._MergedGlobals:
; CHECK: .string "str1_STRING"
; CHECK: .string "str2_STRING"
; CHECK: .string "str3_STRING"
74 changes: 29 additions & 45 deletions llvm/test/CodeGen/PowerPC/ctrloop-fp128.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,17 @@
define void @fmul_ctrloop_fp128() nounwind {
; PWR9-LABEL: fmul_ctrloop_fp128:
; PWR9: # %bb.0: # %entry
; PWR9-NEXT: addis 3, 2, a@toc@ha
; PWR9-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; PWR9-NEXT: li 4, 4
; PWR9-NEXT: addi 3, 3, a@toc@l
; PWR9-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; PWR9-NEXT: lxv 34, 0(3)
; PWR9-NEXT: addis 3, 2, y@toc@ha
; PWR9-NEXT: mtctr 4
; PWR9-NEXT: addis 4, 2, x@toc@ha
; PWR9-NEXT: addi 3, 3, y@toc@l
; PWR9-NEXT: addi 4, 4, x@toc@l
; PWR9-NEXT: addi 3, 3, -16
; PWR9-NEXT: addi 4, 4, -16
; PWR9-NEXT: .p2align 5
; PWR9-NEXT: .LBB0_1: # %for.body
; PWR9-NEXT: #
; PWR9-NEXT: lxv 35, 16(4)
; PWR9-NEXT: addi 4, 4, 16
; PWR9-NEXT: lxv 35, 16(3)
; PWR9-NEXT: xsmulqp 3, 2, 3
; PWR9-NEXT: stxv 35, 16(3)
; PWR9-NEXT: stxv 35, 80(3)
; PWR9-NEXT: addi 3, 3, 16
; PWR9-NEXT: bdnz .LBB0_1
; PWR9-NEXT: # %bb.2: # %for.end
Expand All @@ -38,40 +31,33 @@ define void @fmul_ctrloop_fp128() nounwind {
; PWR8-NEXT: stdu 1, -112(1)
; PWR8-NEXT: li 3, 48
; PWR8-NEXT: std 0, 128(1)
; PWR8-NEXT: std 30, 96(1) # 8-byte Folded Spill
; PWR8-NEXT: std 27, 72(1) # 8-byte Folded Spill
; PWR8-NEXT: std 28, 80(1) # 8-byte Folded Spill
; PWR8-NEXT: li 28, 16
; PWR8-NEXT: li 27, 80
; PWR8-NEXT: std 29, 88(1) # 8-byte Folded Spill
; PWR8-NEXT: std 30, 96(1) # 8-byte Folded Spill
; PWR8-NEXT: li 30, 4
; PWR8-NEXT: li 29, 16
; PWR8-NEXT: std 26, 64(1) # 8-byte Folded Spill
; PWR8-NEXT: stxvd2x 63, 1, 3 # 16-byte Folded Spill
; PWR8-NEXT: addis 3, 2, a@toc@ha
; PWR8-NEXT: addi 3, 3, a@toc@l
; PWR8-NEXT: std 27, 72(1) # 8-byte Folded Spill
; PWR8-NEXT: lxvd2x 0, 0, 3
; PWR8-NEXT: addis 3, 2, y@toc@ha
; PWR8-NEXT: addi 3, 3, y@toc@l
; PWR8-NEXT: addi 28, 3, -16
; PWR8-NEXT: addis 3, 2, x@toc@ha
; PWR8-NEXT: addi 3, 3, x@toc@l
; PWR8-NEXT: addi 3, 3, -16
; PWR8-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; PWR8-NEXT: li 29, 4
; PWR8-NEXT: addi 30, 3, .L_MergedGlobals@toc@l
; PWR8-NEXT: std 26, 64(1) # 8-byte Folded Spill
; PWR8-NEXT: lxvd2x 0, 0, 30
; PWR8-NEXT: xxswapd 63, 0
; PWR8-NEXT: .p2align 4
; PWR8-NEXT: .LBB0_1: # %for.body
; PWR8-NEXT: #
; PWR8-NEXT: lxvd2x 0, 3, 29
; PWR8-NEXT: lxvd2x 0, 30, 28
; PWR8-NEXT: vmr 2, 31
; PWR8-NEXT: addi 27, 28, 16
; PWR8-NEXT: addi 26, 3, 16
; PWR8-NEXT: addi 26, 30, 16
; PWR8-NEXT: xxswapd 35, 0
; PWR8-NEXT: bl __mulkf3
; PWR8-NEXT: nop
; PWR8-NEXT: addi 30, 30, -1
; PWR8-NEXT: addi 29, 29, -1
; PWR8-NEXT: xxswapd 0, 34
; PWR8-NEXT: mr 3, 26
; PWR8-NEXT: cmpldi 30, 0
; PWR8-NEXT: stxvd2x 0, 28, 29
; PWR8-NEXT: mr 28, 27
; PWR8-NEXT: cmpldi 29, 0
; PWR8-NEXT: stxvd2x 0, 30, 27
; PWR8-NEXT: mr 30, 26
; PWR8-NEXT: bc 12, 1, .LBB0_1
; PWR8-NEXT: # %bb.2: # %for.end
; PWR8-NEXT: li 3, 48
Expand Down Expand Up @@ -110,9 +96,9 @@ define void @fpext_ctrloop_fp128(ptr %a) nounwind {
; PWR9-NEXT: li 4, 4
; PWR9-NEXT: addi 3, 3, -8
; PWR9-NEXT: mtctr 4
; PWR9-NEXT: addis 4, 2, y@toc@ha
; PWR9-NEXT: addi 4, 4, y@toc@l
; PWR9-NEXT: addi 4, 4, -16
; PWR9-NEXT: addis 4, 2, .L_MergedGlobals@toc@ha
; PWR9-NEXT: addi 4, 4, .L_MergedGlobals@toc@l
; PWR9-NEXT: addi 4, 4, 64
; PWR9-NEXT: .p2align 5
; PWR9-NEXT: .LBB1_1: # %for.body
; PWR9-NEXT: #
Expand All @@ -133,11 +119,11 @@ define void @fpext_ctrloop_fp128(ptr %a) nounwind {
; PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; PWR8-NEXT: stdu 1, -64(1)
; PWR8-NEXT: addi 30, 3, -8
; PWR8-NEXT: addis 3, 2, y@toc@ha
; PWR8-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; PWR8-NEXT: li 29, 4
; PWR8-NEXT: std 0, 80(1)
; PWR8-NEXT: addi 3, 3, y@toc@l
; PWR8-NEXT: addi 28, 3, -16
; PWR8-NEXT: addi 3, 3, .L_MergedGlobals@toc@l
; PWR8-NEXT: addi 28, 3, 64
; PWR8-NEXT: .p2align 4
; PWR8-NEXT: .LBB1_1: # %for.body
; PWR8-NEXT: #
Expand Down Expand Up @@ -182,9 +168,8 @@ define void @fptrunc_ctrloop_fp128(ptr %a) nounwind {
; PWR9-NEXT: li 4, 4
; PWR9-NEXT: addi 3, 3, -8
; PWR9-NEXT: mtctr 4
; PWR9-NEXT: addis 4, 2, x@toc@ha
; PWR9-NEXT: addi 4, 4, x@toc@l
; PWR9-NEXT: addi 4, 4, -16
; PWR9-NEXT: addis 4, 2, .L_MergedGlobals@toc@ha
; PWR9-NEXT: addi 4, 4, .L_MergedGlobals@toc@l
; PWR9-NEXT: .p2align 5
; PWR9-NEXT: .LBB2_1: # %for.body
; PWR9-NEXT: #
Expand All @@ -205,11 +190,10 @@ define void @fptrunc_ctrloop_fp128(ptr %a) nounwind {
; PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill
; PWR8-NEXT: stdu 1, -64(1)
; PWR8-NEXT: addi 30, 3, -8
; PWR8-NEXT: addis 3, 2, x@toc@ha
; PWR8-NEXT: addis 3, 2, .L_MergedGlobals@toc@ha
; PWR8-NEXT: li 29, 4
; PWR8-NEXT: std 0, 80(1)
; PWR8-NEXT: addi 3, 3, x@toc@l
; PWR8-NEXT: addi 28, 3, -16
; PWR8-NEXT: addi 28, 3, .L_MergedGlobals@toc@l
; PWR8-NEXT: .p2align 4
; PWR8-NEXT: .LBB2_1: # %for.body
; PWR8-NEXT: #
Expand Down
18 changes: 10 additions & 8 deletions llvm/test/CodeGen/PowerPC/expand-contiguous-isel.ll
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,12 @@ define i64 @_Z3fn1N4llvm9StringRefE([2 x i64] %Str.coerce) {
; CHECK-GEN-ISEL-TRUE-NEXT: mtlr r0
; CHECK-GEN-ISEL-TRUE-NEXT: blr
; CHECK-GEN-ISEL-TRUE-NEXT: .LBB0_15: # %cond.false.i
; CHECK-GEN-ISEL-TRUE-NEXT: addis r3, r2, .L__ModuleStringPool@toc@ha
; CHECK-GEN-ISEL-TRUE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha
; CHECK-GEN-ISEL-TRUE-NEXT: addi r5, r3, .L_MergedGlobals@toc@l
; CHECK-GEN-ISEL-TRUE-NEXT: addi r3, r5, 3
; CHECK-GEN-ISEL-TRUE-NEXT: addi r4, r5, 134
; CHECK-GEN-ISEL-TRUE-NEXT: addi r6, r5, 38
; CHECK-GEN-ISEL-TRUE-NEXT: li r5, 225
; CHECK-GEN-ISEL-TRUE-NEXT: addi r4, r3, .L__ModuleStringPool@toc@l
; CHECK-GEN-ISEL-TRUE-NEXT: addi r3, r4, 53
; CHECK-GEN-ISEL-TRUE-NEXT: addi r6, r4, 88
; CHECK-GEN-ISEL-TRUE-NEXT: bl __assert_fail
; CHECK-GEN-ISEL-TRUE-NEXT: nop
; CHECK-GEN-ISEL-TRUE-NEXT: .LBB0_16: # %if.then9
Expand Down Expand Up @@ -226,11 +227,12 @@ define i64 @_Z3fn1N4llvm9StringRefE([2 x i64] %Str.coerce) {
; CHECK-NEXT: mtlr r0
; CHECK-NEXT: blr
; CHECK-NEXT: .LBB0_20: # %cond.false.i
; CHECK-NEXT: addis r3, r2, .L__ModuleStringPool@toc@ha
; CHECK-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha
; CHECK-NEXT: addi r5, r3, .L_MergedGlobals@toc@l
; CHECK-NEXT: addi r3, r5, 3
; CHECK-NEXT: addi r4, r5, 134
; CHECK-NEXT: addi r6, r5, 38
; CHECK-NEXT: li r5, 225
; CHECK-NEXT: addi r4, r3, .L__ModuleStringPool@toc@l
; CHECK-NEXT: addi r3, r4, 53
; CHECK-NEXT: addi r6, r4, 88
; CHECK-NEXT: bl __assert_fail
; CHECK-NEXT: nop
; CHECK-NEXT: .LBB0_21: # %if.then9
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/PowerPC/licm-remat.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture reado
define linkonce_odr void @ZN6snappyDecompressor_(ptr %this, ptr %writer) {
; CHECK-LABEL: ZN6snappyDecompressor_:
; CHECK: # %bb.0: # %entry
; CHECK: addis 4, 2, .L__ModuleStringPool@toc@ha
; CHECK: addi 26, 4, .L__ModuleStringPool@toc@l
; CHECK: addis 4, 2, .L_MergedGlobals@toc@ha
; CHECK: addi 26, 4, .L_MergedGlobals@toc@l
; CHECK: .LBB0_2: # %for.cond
; CHECK-NOT: addis {{[0-9]+}}, 2, .L__ModuleStringPool@toc@ha
; CHECK-NOT: addis {{[0-9]+}}, 2, .L_MergedGlobals@toc@ha
; CHECK: bctrl
entry:
%ip_limit_ = getelementptr inbounds %"class.snappy::SnappyDecompressor", ptr %this, i64 0, i32 2
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/PowerPC/merge-private.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN: --check-prefix=AIX32
; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux -mcpu=pwr8 \
; RUN: -ppc-asm-full-reg-names -ppc-global-merge=true < %s | FileCheck %s \
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN: --check-prefix=LINUX64LE
; RUN: llc -verify-machineinstrs -mtriple powerpc64-unknown-linux -mcpu=pwr8 \
; RUN: -ppc-asm-full-reg-names -ppc-global-merge=true < %s | FileCheck %s \
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN: --check-prefix=LINUX64BE
; The below run line is added to ensure that the assembly corresponding to
; the following check-prefix is generated by default on AIX (without any
Expand Down
Loading
Loading