Skip to content

[CodeGen] Port MachineUniformityAnalysis to new pass manager #137578

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
Apr 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
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
22 changes: 22 additions & 0 deletions llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "llvm/ADT/GenericUniformityInfo.h"
#include "llvm/CodeGen/MachineCycleAnalysis.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/MachineSSAContext.h"

namespace llvm {
Expand Down Expand Up @@ -51,6 +52,27 @@ class MachineUniformityAnalysisPass : public MachineFunctionPass {
// TODO: verify analysis
};

class MachineUniformityAnalysis
: public AnalysisInfoMixin<MachineUniformityAnalysis> {
friend AnalysisInfoMixin<MachineUniformityAnalysis>;
static AnalysisKey Key;

public:
using Result = MachineUniformityInfo;
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
};

class MachineUniformityPrinterPass
: public PassInfoMixin<MachineUniformityAnalysis> {
raw_ostream &OS;

public:
explicit MachineUniformityPrinterPass(raw_ostream &OS) : OS(OS) {}
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
static bool isRequired() { return true; }
};

} // namespace llvm

#endif // LLVM_CODEGEN_MACHINEUNIFORMITYANALYSIS_H
5 changes: 3 additions & 2 deletions llvm/include/llvm/Passes/MachinePassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter",
MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
MachinePostDominatorTreeAnalysis())
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
MACHINE_FUNCTION_ANALYSIS("machine-uniformity", MachineUniformityAnalysis())
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
MACHINE_FUNCTION_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis())
MACHINE_FUNCTION_ANALYSIS("regalloc-priority", RegAllocPriorityAdvisorAnalysis())
Expand Down Expand Up @@ -178,6 +179,8 @@ MACHINE_FUNCTION_PASS("print<machine-dom-tree>",
MACHINE_FUNCTION_PASS("print<machine-loops>", MachineLoopPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>",
MachinePostDominatorTreePrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<machine-uniformity>",
MachineUniformityPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<slot-indexes>", SlotIndexesPrinterPass(errs()))
MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(errs()))
MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass())
Expand Down Expand Up @@ -302,11 +305,9 @@ DUMMY_MACHINE_FUNCTION_PASS("lrshrink", LiveRangeShrinkPass)
DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass)
DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter)
DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass)
DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass)
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)
DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass)
DUMMY_MACHINE_FUNCTION_PASS("print-machine-uniformity", MachineUniformityInfoPrinterPass)
DUMMY_MACHINE_FUNCTION_PASS("processimpdefs", ProcessImplicitDefsPass)
DUMMY_MACHINE_FUNCTION_PASS("prologepilog", PrologEpilogInserterPass)
DUMMY_MACHINE_FUNCTION_PASS("prologepilog-code", PrologEpilogCodeInserterPass)
Expand Down
32 changes: 30 additions & 2 deletions llvm/lib/CodeGen/MachineUniformityAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "llvm/CodeGen/MachineUniformityAnalysis.h"
#include "llvm/ADT/GenericUniformityImpl.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/MachineCycleAnalysis.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
Expand Down Expand Up @@ -177,6 +178,32 @@ class MachineUniformityInfoPrinterPass : public MachineFunctionPass {

} // namespace

AnalysisKey MachineUniformityAnalysis::Key;

MachineUniformityAnalysis::Result
MachineUniformityAnalysis::run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM) {
auto &DomTree = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
auto &CI = MFAM.getResult<MachineCycleAnalysis>(MF);
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
.getManager();
auto &F = MF.getFunction();
auto &TTI = FAM.getResult<TargetIRAnalysis>(F);
return computeMachineUniformityInfo(MF, CI, DomTree,
TTI.hasBranchDivergence(&F));
}

PreservedAnalyses
MachineUniformityPrinterPass::run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM) {
auto &MUI = MFAM.getResult<MachineUniformityAnalysis>(MF);
OS << "MachineUniformityInfo for function: ";
MF.getFunction().printAsOperand(OS, /*PrintType=*/false);
OS << '\n';
MUI.print(OS);
return PreservedAnalyses::all();
}

char MachineUniformityAnalysisPass::ID = 0;

MachineUniformityAnalysisPass::MachineUniformityAnalysisPass()
Expand Down Expand Up @@ -209,8 +236,9 @@ bool MachineUniformityAnalysisPass::runOnMachineFunction(MachineFunction &MF) {

void MachineUniformityAnalysisPass::print(raw_ostream &OS,
const Module *) const {
OS << "MachineUniformityInfo for function: " << UI.getFunction().getName()
<< "\n";
OS << "MachineUniformityInfo for function: ";
UI.getFunction().getFunction().printAsOperand(OS, /*PrintType=*/false);
OS << '\n';
UI.print(OS);
}

Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
#include "llvm/CodeGen/MachineScheduler.h"
#include "llvm/CodeGen/MachineSink.h"
#include "llvm/CodeGen/MachineTraceMetrics.h"
#include "llvm/CodeGen/MachineUniformityAnalysis.h"
#include "llvm/CodeGen/MachineVerifier.h"
#include "llvm/CodeGen/OptimizePHIs.h"
#include "llvm/CodeGen/PHIElimination.h"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# NOTE: This file is Generic MIR translation of test/Analysis/UniformityAnalysis/AMDGPU/always_uniform.ll test file
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
---
name: readfirstlane
body: |
bb.1:
; CHECK-LABEL: MachineUniformityInfo for function: readfirstlane
; CHECK-LABEL: MachineUniformityInfo for function: @readfirstlane
; CHECK: DIVERGENT: %{{[0-9]+}}
; CHECK-SAME:llvm.amdgcn.workitem.id.x
; CHECK-NOT: DIVERGENT: {{.*}}llvm.amdgcn.readfirstlane
Expand All @@ -19,7 +20,7 @@ name: icmp
body: |
bb.1:
liveins: $sgpr4_sgpr5
; CHECK-LABEL: MachineUniformityInfo for function: icmp
; CHECK-LABEL: MachineUniformityInfo for function: @icmp
; CHECK-NEXT: ALL VALUES UNIFORM

%3:_(p4) = COPY $sgpr4_sgpr5
Expand All @@ -39,7 +40,7 @@ name: fcmp
body: |
bb.1:
liveins: $sgpr4_sgpr5
; CHECK-LABEL: MachineUniformityInfo for function: fcmp
; CHECK-LABEL: MachineUniformityInfo for function: @fcmp
; CHECK-NEXT: ALL VALUES UNIFORM

%3:_(p4) = COPY $sgpr4_sgpr5
Expand All @@ -62,7 +63,7 @@ name: ballot
body: |
bb.1:
liveins: $sgpr4_sgpr5
; CHECK-LABEL: MachineUniformityInfo for function: ballot
; CHECK-LABEL: MachineUniformityInfo for function: @ballot
; CHECK-NEXT: ALL VALUES UNIFORM

%2:_(p4) = COPY $sgpr4_sgpr5
Expand All @@ -85,7 +86,7 @@ registers:
body: |
bb.0:
liveins: $vgpr0
; CHECK-LABEL: MachineUniformityInfo for function: asm_sgpr
; CHECK-LABEL: MachineUniformityInfo for function: @asm_sgpr
; CHECK-NOT: DIVERGENT: %1

%0:_(s32) = COPY $vgpr0
Expand All @@ -112,7 +113,7 @@ frameInfo:
body: |
bb.0:
liveins: $vgpr0
; CHECK-LABEL: MachineUniformityInfo for function: asm_mixed_sgpr_vgpr
; CHECK-LABEL: MachineUniformityInfo for function: @asm_mixed_sgpr_vgpr
; CHECK: DIVERGENT: %0:
; CHECK: DIVERGENT: %3:
; CHECK-NOT: DIVERGENT: %1:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

# readlane, readfirstlane is always uniform

Expand All @@ -8,7 +9,7 @@ machineFunctionInfo:
isEntryFunction: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: readlane
; CHECK-LABEL: MachineUniformityInfo for function: @readlane
; CHECK-NEXT: ALL VALUES UNIFORM
%0:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
Expand All @@ -26,7 +27,7 @@ machineFunctionInfo:
isEntryFunction: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: readlane2
; CHECK-LABEL: MachineUniformityInfo for function: @readlane2
; CHECK-NEXT: ALL VALUES UNIFORM
%0:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
Expand All @@ -47,7 +48,7 @@ machineFunctionInfo:
isEntryFunction: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: sgprcopy
; CHECK-LABEL: MachineUniformityInfo for function: @sgprcopy
; CHECK-NEXT: ALL VALUES UNIFORM
liveins: $sgpr0,$sgpr1,$vgpr0
%0:sgpr_32 = COPY $sgpr0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

---
name: test1
Expand Down
13 changes: 7 additions & 6 deletions llvm/test/Analysis/UniformityAnalysis/AMDGPU/MIR/atomics.mir
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

---
name: test1
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: test1
; CHECK-LABEL: MachineUniformityInfo for function: @test1
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
%0:vgpr_32 = IMPLICIT_DEF
Expand All @@ -25,7 +26,7 @@ name: test2
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: test2
; CHECK-LABEL: MachineUniformityInfo for function: @test2
%3:vgpr_32 = IMPLICIT_DEF
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
Expand All @@ -48,7 +49,7 @@ name: atomic_inc
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: atomic_inc
; CHECK-LABEL: MachineUniformityInfo for function: @atomic_inc
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
%0:vgpr_32 = IMPLICIT_DEF
Expand All @@ -65,7 +66,7 @@ name: atomic_inc_64
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: atomic_inc_64
; CHECK-LABEL: MachineUniformityInfo for function: @atomic_inc_64
%3:vgpr_32 = IMPLICIT_DEF
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
Expand All @@ -88,7 +89,7 @@ name: atomic_dec
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: atomic_dec
; CHECK-LABEL: MachineUniformityInfo for function: @atomic_dec
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
%0:vgpr_32 = IMPLICIT_DEF
Expand All @@ -106,7 +107,7 @@ name: atomic_dec_64
tracksRegLiveness: true
body: |
bb.0:
; CHECK-LABEL: MachineUniformityInfo for function: atomic_dec_64
; CHECK-LABEL: MachineUniformityInfo for function: @atomic_dec_64
%3:vgpr_32 = IMPLICIT_DEF
%2:vgpr_32 = IMPLICIT_DEF
%1:vgpr_32 = IMPLICIT_DEF
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

---
name: f1
body: |
; CHECK-LABEL: MachineUniformityInfo for function: f1
; CHECK-LABEL: MachineUniformityInfo for function: @f1
bb.0:
successors: %bb.1, %bb.2

Expand All @@ -23,7 +24,7 @@ body: |
---
name: f2
body: |
; CHECK-LABEL: MachineUniformityInfo for function: f2
; CHECK-LABEL: MachineUniformityInfo for function: @f2
bb.0:
successors: %bb.1, %bb.2

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: hidden_diverge
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: @hidden_diverge
# CHECK-LABEL: BLOCK bb.0
# CHECK: DIVERGENT: %{{[0-9]*}}: %{{[0-9]*}}:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.workitem.id.x)
# CHECK: DIVERGENT: %{{[0-9]*}}: %{{[0-9]*}}:_(s1) = G_ICMP intpred(slt)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: hidden_loop_diverge
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: @hidden_loop_diverge

# CHECK-LABEL: BLOCK bb.0
# CHECK-NOT: DIVERGENT: %{{[0-9]*}}: %{{[0-9]*}}:_(s1) = G_ICMP intpred(slt), %{{[0-9]*}}:_(s32), %{{[0-9]*}}:_
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

# CHECK-LABEL: MachineUniformityInfo for function: basic
# CHECK-LABEL: MachineUniformityInfo for function: @basic
# CHECK-NEXT: CYCLES ASSSUMED DIVERGENT:
# CHECK-NEXT: depth=1: entries(bb.1 bb.3) bb.2
# CHECK-LABEL: BLOCK bb.1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: divergent_cycle_1
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: @divergent_cycle_1
# CHECK-NEXT: CYCLES ASSSUMED DIVERGENT:
# CHECK-NEXT: depth=1: entries(bb.3 bb.1) bb.4 bb.2
# CHECK-NEXT: CYCLES WITH DIVERGENT EXIT:
Expand Down Expand Up @@ -60,7 +61,7 @@ body: |
S_ENDPGM 0
...

# CHECK-LABEL: MachineUniformityInfo for function: uniform_cycle_1
# CHECK-LABEL: MachineUniformityInfo for function: @uniform_cycle_1
---
name: uniform_cycle_1
tracksRegLiveness: true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: basic
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: @basic
# CHECK-NOT: CYCLES ASSSUMED DIVERGENT:
# CHECK: CYCLES WITH DIVERGENT EXIT:
# CHECK: depth=1: entries(bb.1 bb.3) bb.2
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

# bb0(div)
# / \
# bb1 <-> bb2
# |
# bb3
# CHECK-LABEL: MachineUniformityInfo for function: cycle_diverge_enter
# CHECK-LABEL: MachineUniformityInfo for function: @cycle_diverge_enter
# CHECK-NEXT: CYCLES ASSSUMED DIVERGENT:
# CHECK-NEXT: depth=1: entries(bb.2 bb.1)
# CHECK-NEXT: CYCLES WITH DIVERGENT EXIT:
Expand Down Expand Up @@ -46,7 +47,7 @@ body: |
...


# CHECK-LABEL: MachineUniformityInfo for function: cycle_diverge_exit
# CHECK-LABEL: MachineUniformityInfo for function: @cycle_diverge_exit
# CHECK: DIVERGENT: %{{[0-9]*}}: %{{[0-9]*}}:_(s32), %{{[0-9]*}}:_(s1) = G_UADDO %8:_, %{{[0-9]*}}:_
# bb0
# / \
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: test
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s
# CHECK-LABEL: MachineUniformityInfo for function: @test

# CHECK-LABEL: BLOCK bb.0
# CHECK: DIVERGENT: %{{[0-9]*}}: %{{[0-9]*}}:_(s1) = G_ICMP intpred(eq), %{{[0-9]*}}:_(s32), %{{[0-9]*}}:_
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# RUN: llc -mtriple=amdgcn-- -run-pass=print-machine-uniformity -o - %s 2>&1 | FileCheck %s
# RUN: llc -mtriple=amdgcn-- -passes='print<machine-uniformity>' -filetype=null %s 2>&1 | FileCheck %s

---
name: loads
Expand Down
Loading