Commit 167ff528 authored by Christudasan Devadasan's avatar Christudasan Devadasan
Browse files

[GlobalOpt] Do not shrink global to bool for an unfavorable AS

Do not call `TryToShrinkGlobalToBoolean` for address spaces
that don't allow initializers. It inserts an initializer value
while shrinking to bool. Used the target hook introduced with
D109337 to skip this call for the restricted address spaces.

Reviewed By: tra

Differential Revision: https://reviews.llvm.org/D109823
parent e9e1d475
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -1612,6 +1612,9 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS,

    Function &StoreFn =
        const_cast<Function &>(*GS.StoredOnceStore->getFunction());
    bool CanHaveNonUndefGlobalInitializer =
        GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
            GV->getType()->getAddressSpace());
    // If the initial value for the global was an undef value, and if only
    // one other value was stored into it, we can just change the
    // initializer to be the stored value, then delete all stores to the
@@ -1621,8 +1624,7 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS,
    // shared memory (AS 3).
    if (SOVConstant && SOVConstant->getType() == GV->getValueType() &&
        isa<UndefValue>(GV->getInitializer()) &&
        GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
            GV->getType()->getAddressSpace())) {
        CanHaveNonUndefGlobalInitializer) {
      // Change the initial value here.
      GV->setInitializer(SOVConstant);

@@ -1645,8 +1647,10 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS,
      return true;

    // Otherwise, if the global was not a boolean, we can shrink it to be a
    // boolean.
    if (SOVConstant && GS.Ordering == AtomicOrdering::NotAtomic) {
    // boolean. Skip this optimization for AS that doesn't allow an initializer.
    if (SOVConstant && GS.Ordering == AtomicOrdering::NotAtomic &&
        (!isa<UndefValue>(GV->getInitializer()) ||
         CanHaveNonUndefGlobalInitializer)) {
      if (TryToShrinkGlobalToBoolean(GV, SOVConstant)) {
        ++NumShrunkToBool;
        return true;
+39 −0
Original line number Diff line number Diff line
; RUN: opt -passes=globalopt --mtriple=amdgcn-amd-amdhsa < %s -S | FileCheck %s
; REQUIRES: amdgpu-registered-target

@gvar = internal unnamed_addr global i32 undef
@lvar = internal unnamed_addr addrspace(3) global i32 undef

; Should optimize @gvar.
; CHECK-NOT: @gvar

; Negative test for AS(3). Skip shrink global to bool optimization.
; CHECK: @lvar = internal unnamed_addr addrspace(3) global i32 undef

define void @test_global_var() {
; CHECK-LABEL: @test_global_var(
; CHECK:    store volatile i32 10, i32* undef, align 4
;
entry:
  store i32 10, i32* @gvar
  br label %exit
exit:
  %ld = load i32, i32* @gvar
  store volatile i32 %ld, i32* undef
  ret void
}

define void @test_lds_var() {
; CHECK-LABEL: @test_lds_var(
; CHECK:    store i32 10, i32 addrspace(3)* @lvar, align 4
; CHECK:    [[LD:%.*]] = load i32, i32 addrspace(3)* @lvar, align 4
; CHECK:    store volatile i32 [[LD]], i32* undef, align 4
;
entry:
  store i32 10, i32 addrspace(3)* @lvar
  br label %exit
exit:
  %ld = load i32, i32 addrspace(3)* @lvar
  store volatile i32 %ld, i32* undef
  ret void
}