Files
clang-p2996/llvm/test/CodeGen/PowerPC/machine-cse-rm-pre.mir
John Brawn 88ac25b357 [MachineCSE] Allow PRE of instructions that read physical registers
Currently MachineCSE forbids PRE when the instruction reads a physical
register. Relax this so that it's allowed when the value being read is
the same as what would be read in the place the instruction would be
hoisted to.

This is being done in preparation for adding FPCR handling to the
AArch64 backend, in order to prevent it to from worsening the
generated code, but for targets that already have a similar register
it should improve things.

This patch affects code generation in several tests. The new code
looks better except for in Thumb2/LowOverheadLoops/memcall.ll where
we perform PRE but the LowOverheadLoops transformation then undoes
it. Also in AMDGPU/selectcc-opt.ll the CHECK makes things look worse,
but actually the function as a whole is better (as a MOV is PRE'd).

Differential Revision: https://reviews.llvm.org/D136675
2022-11-02 13:53:12 +00:00

174 lines
4.8 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc %s -o - -mtriple=powerpc-unknown-unknown -run-pass=machine-cse -verify-machineinstrs | FileCheck %s
--- |
define void @can_pre() {
entry:
br label %for.body
for.body:
br i1 undef, label %if.then, label %if.else
if.then:
br label %if.end
if.else:
br label %if.end
if.end:
br label %for.body
}
define void @cannot_pre() {
entry:
br label %for.body
for.body:
br i1 undef, label %if.then, label %if.else
if.then:
br label %if.end
if.else:
br label %if.end
if.end:
br label %for.body
}
...
---
name: can_pre
registers:
- { id: 0, class: f8rc, preferred-register: '' }
- { id: 1, class: f8rc, preferred-register: '' }
- { id: 2, class: gprc, preferred-register: '' }
- { id: 3, class: gprc, preferred-register: '' }
- { id: 4, class: f8rc, preferred-register: '' }
- { id: 5, class: f8rc, preferred-register: '' }
liveins:
- { reg: '$r1', virtual-reg: '%2' }
- { reg: '$r2', virtual-reg: '%3' }
- { reg: '$f1', virtual-reg: '%4' }
- { reg: '$f2', virtual-reg: '%5' }
body: |
; CHECK-LABEL: name: can_pre
; CHECK: bb.0.for.body:
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
; CHECK-NEXT: liveins: $r1, $r2, $f1, $f2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:f8rc = COPY $f2
; CHECK-NEXT: [[COPY1:%[0-9]+]]:f8rc = COPY $f1
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY $r2
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gprc = COPY $r1
; CHECK-NEXT: $cr0 = CMPLWI [[COPY3]], 0
; CHECK-NEXT: %6:f8rc = nofpexcept FDIV [[COPY1]], [[COPY]], implicit $rm
; CHECK-NEXT: BCC 44, $cr0, %bb.1
; CHECK-NEXT: B %bb.2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1.if.then:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: B %bb.3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2.if.else:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.3.if.end:
; CHECK-NEXT: BLR implicit $lr, implicit $rm
bb.0.for.body:
successors: %bb.1(0x40000000), %bb.2(0x40000000)
liveins: $r1, $r2, $f1, $f2
%5:f8rc = COPY $f2
%4:f8rc = COPY $f1
%3:gprc = COPY $r2
%2:gprc = COPY $r1
$cr0 = CMPLWI %2, 0
BCC 44, $cr0, %bb.1
B %bb.2
bb.1.if.then:
successors: %bb.3(0x80000000)
%0:f8rc = nofpexcept FDIV %4, %5, implicit $rm
B %bb.3
bb.2.if.else:
successors: %bb.3(0x80000000)
%1:f8rc = nofpexcept FDIV %4, %5, implicit $rm
bb.3.if.end:
BLR implicit $lr, implicit $rm
...
---
name: cannot_pre
registers:
- { id: 0, class: f8rc, preferred-register: '' }
- { id: 1, class: f8rc, preferred-register: '' }
- { id: 2, class: gprc, preferred-register: '' }
- { id: 3, class: gprc, preferred-register: '' }
- { id: 4, class: f8rc, preferred-register: '' }
- { id: 5, class: f8rc, preferred-register: '' }
- { id: 6, class: f8rc, preferred-register: '' }
liveins:
- { reg: '$r1', virtual-reg: '%2' }
- { reg: '$r2', virtual-reg: '%3' }
- { reg: '$f1', virtual-reg: '%4' }
- { reg: '$f2', virtual-reg: '%5' }
body: |
; CHECK-LABEL: name: cannot_pre
; CHECK: bb.0.for.body:
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
; CHECK-NEXT: liveins: $r1, $r2, $f1, $f2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:f8rc = COPY $f2
; CHECK-NEXT: [[COPY1:%[0-9]+]]:f8rc = COPY $f1
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY $r2
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gprc = COPY $r1
; CHECK-NEXT: $cr0 = CMPLWI [[COPY3]], 0
; CHECK-NEXT: BCC 44, $cr0, %bb.1
; CHECK-NEXT: B %bb.2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1.if.then:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[SETRND:%[0-9]+]]:f8rc = SETRND [[COPY2]], implicit-def $rm, implicit $rm
; CHECK-NEXT: %0:f8rc = nofpexcept FDIV [[COPY1]], [[COPY]], implicit $rm
; CHECK-NEXT: B %bb.3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2.if.else:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %1:f8rc = nofpexcept FDIV [[COPY1]], [[COPY]], implicit $rm
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.3.if.end:
; CHECK-NEXT: BLR implicit $lr, implicit $rm
bb.0.for.body:
successors: %bb.1(0x40000000), %bb.2(0x40000000)
liveins: $r1, $r2, $f1, $f2
%5:f8rc = COPY $f2
%4:f8rc = COPY $f1
%3:gprc = COPY $r2
%2:gprc = COPY $r1
$cr0 = CMPLWI %2, 0
BCC 44, $cr0, %bb.1
B %bb.2
bb.1.if.then:
successors: %bb.3(0x80000000)
%6:f8rc = SETRND %3, implicit-def $rm, implicit $rm
%0:f8rc = nofpexcept FDIV %4, %5, implicit $rm
B %bb.3
bb.2.if.else:
successors: %bb.3(0x80000000)
%1:f8rc = nofpexcept FDIV %4, %5, implicit $rm
bb.3.if.end:
BLR implicit $lr, implicit $rm
...