Skip to content

[AArch64] Enable software pipelining for the Cortex-A320 - #206072

Draft
saturn691 wants to merge 2 commits into
llvm:mainfrom
saturn691:enable-swp
Draft

[AArch64] Enable software pipelining for the Cortex-A320#206072
saturn691 wants to merge 2 commits into
llvm:mainfrom
saturn691:enable-swp

Conversation

@saturn691

Copy link
Copy Markdown
Contributor

Software pipelining gives mostly positive performance improvements for the Cortex-A320. This enables MachinePipeliner for default for the Cortex-A320 and keeps the behaviour of -aarch64-enable-pipeliner for other CPUs.

Software pipelining gives mostly positive performance improvements
for the Cortex-A320. This enables MachinePipeliner for default for
the Cortex-A320 and keeps the behaviour of -aarch64-enable-pipeliner
for other CPUs.
MachinePipeliner has a cap of II=27 which is reasonable, but it rejects
a subset of profitable loops. These are vectorised loops, that have not
been interleaved by the Loop Vectorizer (i.e. loops written with
intrinsics).

However, this is still a draft, as we need to uncap the II limit in code.
Also this is codex code, so there may be a better way to do this.

Assisted-by: codex, reviewed and tested by me
@github-actions

Copy link
Copy Markdown

🐧 Linux x64 Test Results

  • 176194 tests passed
  • 3547 tests skipped
  • 3 tests failed

Failed Tests

(click on a test name to see its output)

LLVM

LLVM.CodeGen/AArch64/O3-pipeline.ll
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --debugify-and-strip-all-safe=0 -mtriple=arm64-- -O3 -debug-pass=Structure < /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/O3-pipeline.ll -o /dev/null 2>&1 |      grep -v "Verify generated machine code" | /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/O3-pipeline.ll
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --debugify-and-strip-all-safe=0 -mtriple=arm64-- -O3 -debug-pass=Structure -o /dev/null
# note: command had no output on stdout or stderr
# executed command: grep -v 'Verify generated machine code'
# note: command had no output on stdout or stderr
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/O3-pipeline.ll
# .---command stderr------------
# | /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/O3-pipeline.ll:176:15: error: CHECK-NEXT: is not on the line after the previous match
# | ; CHECK-NEXT: Detect Dead Lanes
# |               ^
# | <stdin>:177:2: note: 'next' match was here
# |  Detect Dead Lanes
# |  ^
# | <stdin>:170:35: note: previous match ended here
# |  AArch64 Dead register definitions
# |                                   ^
# | <stdin>:171:1: note: non-matching line after previous match is here
# |  MachineDominator Tree Construction
# | ^
# | 
# | Input file: <stdin>
# | Check file: /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/O3-pipeline.ll
# | 
# | -dump-input=help explains the following input dump.
# | 
# | Input was:
# | <<<<<<
# |             .
# |             .
# |             .
# |           165:  Machine Cycle Info Analysis 
# |           166:  Machine code sinking 
# |           167:  Peephole Optimizations 
# |           168:  Remove dead machine instructions 
# |           169:  AArch64 MI Peephole Optimization pass 
# |           170:  AArch64 Dead register definitions 
# | next:176'0                                      {   search range start (exclusive)
# |           171:  MachineDominator Tree Construction 
# |           172:  Slot index numbering 
# |           173:  Live Interval Analysis 
# |           174:  Lazy Machine Block Frequency Analysis 
# |           175:  Machine Optimization Remark Emitter 
# |           176:  Modulo Software Pipelining 
# |           177:  Detect Dead Lanes 
# | next:176'1      !~~~~~~~~~~~~~~~~   error: match on wrong line
# |           178:  Init Undef Pass 
# |           179:  Process Implicit Definitions 
# |           180:  Remove unreachable machine basic blocks 
# |           181:  Live Variable Analysis 
# |           182:  MachineDominator Tree Construction 
# |             .
# |             .
# |             .
# |           277:  Natural Loop Information 
# |           278:  Scalar Evolution Analysis 
# |           279:  Stack Safety Local Analysis 
# |           280: Pass Arguments: -domtree 
# |           281:  FunctionPass Manager 
# |           282:  Dominator Tree Construction 
# | next:176'2                                  } search range end (exclusive)
# | >>>>>>
# `-----------------------------
# error: command failed with exit status: 1

--

LLVM.CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 2
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --mtriple=aarch64 /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir -run-pass=pipeliner -pipeliner-mve-cg -o -| /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --mtriple=aarch64 /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir -run-pass=pipeliner -pipeliner-mve-cg -o -
# note: command had no output on stdout or stderr
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir
# .---command stderr------------
# | /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir:11:16: error: CHECK-NEXT: expected string not found in input
# |  ; CHECK-NEXT: successors: %bb.13(0x80000000)
# |                ^
# | <stdin>:88:7: note: scanning from here
# |  bb.0:
# |       ^
# | <stdin>:89:2: note: possible intended match here
# |  successors: %bb.1(0x80000000)
# |  ^
# | 
# | Input file: <stdin>
# | Check file: /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals-1.mir
# | 
# | -dump-input=help explains the following input dump.
# | 
# | Input was:
# | <<<<<<
# |            .
# |            .
# |            .
# |           83: callSites: [] 
# |           84: debugValueSubstitutions: [] 
# |           85: constants: [] 
# |           86: machineFunctionInfo: {} 
# |           87: body: | 
# |           88:  bb.0: 
# | next:11'0          {   search range start (exclusive)
# | next:11'1              error: no match found in search range
# |           89:  successors: %bb.1(0x80000000) 
# | next:11'2      ?                               possible intended match
# |           90:  liveins: $x0 
# |           91:   
# |           92:  %0:gpr64common = COPY $x0 
# |           93:  %1:gpr64sp = COPY $xzr 
# |           94:  %2:gpr64all = COPY %1 
# |            .
# |            .
# |            .
# |          139:  %13:fpr64 = nofpexcept FADDDrr %18, %20, implicit $fpcr 
# |          140:  %21:gpr64 = ADDSXri %16, 1, 0, implicit-def $nzcv 
# |          141:  %17:gpr64all = COPY %21 
# |          142:  Bcc 2, %bb.5, implicit $nzcv 
# |          143:  B %bb.6 
# |          144: ... 
# | next:11'3         } search range end (exclusive)
# | >>>>>>
# `-----------------------------
# error: command failed with exit status: 1

--

LLVM.CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 2
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --mtriple=aarch64 /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir -run-pass=pipeliner -o - | /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/llc --mtriple=aarch64 /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir -run-pass=pipeliner -o -
# note: command had no output on stdout or stderr
# executed command: /home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/FileCheck /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir
# .---command stderr------------
# | /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir:11:16: error: CHECK-NEXT: expected string not found in input
# |  ; CHECK-NEXT: successors: %bb.3(0x80000000)
# |                ^
# | <stdin>:78:7: note: scanning from here
# |  bb.0:
# |       ^
# | <stdin>:79:2: note: possible intended match here
# |  successors: %bb.1(0x80000000)
# |  ^
# | 
# | Input file: <stdin>
# | Check file: /home/gha/actions-runner/_work/llvm-project/llvm-project/llvm/test/CodeGen/AArch64/aarch64-swp-ws-live-intervals.mir
# | 
# | -dump-input=help explains the following input dump.
# | 
# | Input was:
# | <<<<<<
# |            .
# |            .
# |            .
# |           73: callSites: [] 
# |           74: debugValueSubstitutions: [] 
# |           75: constants: [] 
# |           76: machineFunctionInfo: {} 
# |           77: body: | 
# |           78:  bb.0: 
# | next:11'0          {   search range start (exclusive)
# | next:11'1              error: no match found in search range
# |           79:  successors: %bb.1(0x80000000) 
# | next:11'2      ?                               possible intended match
# |           80:  liveins: $x0 
# |           81:   
# |           82:  %0:gpr64common = COPY $x0 
# |           83:  %1:fpr64 = FMOVD0 
# |           84:  %2:gpr32 = MOVi32imm 1 
# |            .
# |            .
# |            .
# |           99:  Bcc 1, %bb.1, implicit $nzcv 
# |          100:  B %bb.2 
# |          101:   
# |          102:  bb.2: 
# |          103:  RET_ReallyLR 
# |          104: ... 
# | next:11'3         } search range end (exclusive)
# | >>>>>>
# `-----------------------------
# error: command failed with exit status: 1

--

If these failures are unrelated to your changes (for example tests are broken or flaky at HEAD), please open an issue at https://github.com/llvm/llvm-project/issues and add the infrastructure label.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant