826 lines
30 KiB
YAML
826 lines
30 KiB
YAML
# RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 %s -o - \
|
|
# RUN: -run-pass=ppc-mi-peepholes -verify-machineinstrs | FileCheck %s
|
|
|
|
# Test the peephole replacing unprimed accumulator PHI nodes by primed
|
|
# accumulator PHI nodes. We have a test for the simple case (PHI nodes with COPY
|
|
# operands), a test for PHI nodes with IMPLICIT_DEF operands, a test for PHI
|
|
# nodes with operands being other PHI nodes on unprimed accumulators and a test
|
|
# with an unprimed accumulator PHI node cycle.
|
|
|
|
--- |
|
|
define dso_local void @phiCopy(i32 signext %i, <16 x i8> %vc, <512 x i1>* nocapture %ptr) {
|
|
entry:
|
|
%0 = tail call <512 x i1> @llvm.ppc.mma.xxsetaccz()
|
|
%tobool.not = icmp eq i32 %i, 0
|
|
br i1 %tobool.not, label %if.end, label %if.then
|
|
|
|
if.then:
|
|
%1 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %0, <16 x i8> %vc, <16 x i8> %vc)
|
|
br label %if.end
|
|
|
|
if.end:
|
|
%vq.0 = phi <512 x i1> [ %1, %if.then ], [ %0, %entry ]
|
|
store <512 x i1> %vq.0, <512 x i1>* %ptr, align 64
|
|
ret void
|
|
}
|
|
|
|
declare <512 x i1> @llvm.ppc.mma.xxsetaccz()
|
|
|
|
declare <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1>, <16 x i8>, <16 x i8>)
|
|
|
|
define dso_local void @phiCopyUndef(i32 signext %i, <16 x i8> %vc, <512 x i1>* nocapture %ptr) {
|
|
entry:
|
|
%tobool.not = icmp eq i32 %i, 0
|
|
br i1 %tobool.not, label %if.end, label %if.then
|
|
|
|
if.then:
|
|
%0 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> undef, <16 x i8> %vc, <16 x i8> %vc)
|
|
br label %if.end
|
|
|
|
if.end:
|
|
%vq.0 = phi <512 x i1> [ %0, %if.then ], [ undef, %entry ]
|
|
store <512 x i1> %vq.0, <512 x i1>* %ptr, align 64
|
|
ret void
|
|
}
|
|
|
|
define dso_local void @phiPhis(i32 signext %i, <16 x i8> %vc, <512 x i1>* nocapture %ptr) {
|
|
entry:
|
|
%cmp6 = icmp sgt i32 %i, 0
|
|
br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup
|
|
|
|
for.body.preheader:
|
|
%0 = add i32 %i, -1
|
|
%xtraiter = and i32 %i, 7
|
|
%1 = icmp ult i32 %0, 7
|
|
br i1 %1, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new
|
|
|
|
for.body.preheader.new:
|
|
%unroll_iter = and i32 %i, -8
|
|
%2 = add i32 %unroll_iter, -8
|
|
%3 = zext i32 %2 to i64
|
|
%4 = lshr i64 %3, 3
|
|
%5 = add nuw nsw i64 %4, 1
|
|
call void @llvm.set.loop.iterations.i64(i64 %5)
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit.unr-lcssa:
|
|
%vq.07.unr = phi <512 x i1> [ undef, %for.body.preheader ], [ %18, %for.body ]
|
|
%lcmp.mod.not = icmp eq i32 %xtraiter, 0
|
|
br i1 %lcmp.mod.not, label %for.cond.cleanup, label %for.body.epil.preheader
|
|
|
|
for.body.epil.preheader:
|
|
%6 = add nsw i32 %xtraiter, -1
|
|
%7 = zext i32 %6 to i64
|
|
%8 = add nuw nsw i64 %7, 1
|
|
call void @llvm.set.loop.iterations.i64(i64 %8)
|
|
br label %for.body.epil
|
|
|
|
for.body.epil:
|
|
%vq.07.epil = phi <512 x i1> [ %9, %for.body.epil ], [ %vq.07.unr, %for.body.epil.preheader ]
|
|
%9 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %vq.07.epil, <16 x i8> %vc, <16 x i8> %vc)
|
|
%10 = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
br i1 %10, label %for.body.epil, label %for.cond.cleanup
|
|
|
|
for.cond.cleanup:
|
|
%vq.0.lcssa = phi <512 x i1> [ undef, %entry ], [ %vq.07.unr, %for.cond.cleanup.loopexit.unr-lcssa ], [ %9, %for.body.epil ]
|
|
%add.ptr = getelementptr inbounds <512 x i1>, <512 x i1>* %ptr, i64 1
|
|
store <512 x i1> %vq.0.lcssa, <512 x i1>* %add.ptr, align 64
|
|
ret void
|
|
|
|
for.body:
|
|
%vq.07 = phi <512 x i1> [ undef, %for.body.preheader.new ], [ %18, %for.body ]
|
|
%11 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %vq.07, <16 x i8> %vc, <16 x i8> %vc)
|
|
%12 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %11, <16 x i8> %vc, <16 x i8> %vc)
|
|
%13 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %12, <16 x i8> %vc, <16 x i8> %vc)
|
|
%14 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %13, <16 x i8> %vc, <16 x i8> %vc)
|
|
%15 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %14, <16 x i8> %vc, <16 x i8> %vc)
|
|
%16 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %15, <16 x i8> %vc, <16 x i8> %vc)
|
|
%17 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %16, <16 x i8> %vc, <16 x i8> %vc)
|
|
%18 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %17, <16 x i8> %vc, <16 x i8> %vc)
|
|
%19 = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
br i1 %19, label %for.body, label %for.cond.cleanup.loopexit.unr-lcssa
|
|
}
|
|
|
|
define dso_local void @phiCycle(i32 signext %i, <16 x i8> %vc, <512 x i1>* nocapture %ptr) {
|
|
entry:
|
|
%cmp6 = icmp sgt i32 %i, 0
|
|
br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup
|
|
|
|
for.body.preheader:
|
|
%0 = add i32 %i, -1
|
|
%xtraiter = and i32 %i, 7
|
|
%1 = icmp ult i32 %0, 7
|
|
br i1 %1, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new
|
|
|
|
for.body.preheader.new:
|
|
%unroll_iter = and i32 %i, -8
|
|
%2 = add i32 %unroll_iter, -8
|
|
%3 = zext i32 %2 to i64
|
|
%4 = lshr i64 %3, 3
|
|
%5 = add nuw nsw i64 %4, 1
|
|
call void @llvm.set.loop.iterations.i64(i64 %5)
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit.unr-lcssa:
|
|
%vq.07.unr = phi <512 x i1> [ undef, %for.body.preheader ], [ %18, %for.body ], [ %vq.07.epil, %for.body.epil ]
|
|
%lcmp.mod.not = icmp eq i32 %xtraiter, 0
|
|
br i1 %lcmp.mod.not, label %for.cond.cleanup, label %for.body.epil.preheader
|
|
|
|
for.body.epil.preheader:
|
|
%6 = add nsw i32 %xtraiter, -1
|
|
%7 = zext i32 %6 to i64
|
|
%8 = add nuw nsw i64 %7, 1
|
|
call void @llvm.set.loop.iterations.i64(i64 %8)
|
|
br label %for.body.epil
|
|
|
|
for.body.epil:
|
|
%vq.07.epil = phi <512 x i1> [ %9, %for.body.epil ], [ %vq.07.unr, %for.body.epil.preheader ]
|
|
%9 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %vq.07.epil, <16 x i8> %vc, <16 x i8> %vc)
|
|
%10 = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
%test = icmp ult i32 %0, 7
|
|
br i1 %test, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.epil
|
|
;br i1 %10, label %for.body.epil, label %for.cond.cleanup
|
|
|
|
for.cond.cleanup:
|
|
%vq.0.lcssa = phi <512 x i1> [ undef, %entry ], [ %vq.07.unr, %for.cond.cleanup.loopexit.unr-lcssa ]
|
|
%add.ptr = getelementptr inbounds <512 x i1>, <512 x i1>* %ptr, i64 1
|
|
store <512 x i1> %vq.0.lcssa, <512 x i1>* %add.ptr, align 64
|
|
ret void
|
|
|
|
for.body:
|
|
%vq.07 = phi <512 x i1> [ undef, %for.body.preheader.new ], [ %18, %for.body ]
|
|
%11 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %vq.07, <16 x i8> %vc, <16 x i8> %vc)
|
|
%12 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %11, <16 x i8> %vc, <16 x i8> %vc)
|
|
%13 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %12, <16 x i8> %vc, <16 x i8> %vc)
|
|
%14 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %13, <16 x i8> %vc, <16 x i8> %vc)
|
|
%15 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %14, <16 x i8> %vc, <16 x i8> %vc)
|
|
%16 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %15, <16 x i8> %vc, <16 x i8> %vc)
|
|
%17 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %16, <16 x i8> %vc, <16 x i8> %vc)
|
|
%18 = tail call <512 x i1> @llvm.ppc.mma.xvf32gerpp(<512 x i1> %17, <16 x i8> %vc, <16 x i8> %vc)
|
|
%19 = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
br i1 %19, label %for.body, label %for.cond.cleanup.loopexit.unr-lcssa
|
|
}
|
|
|
|
declare void @llvm.set.loop.iterations.i64(i64)
|
|
|
|
declare i1 @llvm.loop.decrement.i64(i64)
|
|
|
|
...
|
|
---
|
|
name: phiCopy
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers:
|
|
- { id: 0, class: uaccrc, preferred-register: '' }
|
|
- { id: 1, class: uaccrc, preferred-register: '' }
|
|
- { id: 2, class: uaccrc, preferred-register: '' }
|
|
- { id: 3, class: g8rc, preferred-register: '' }
|
|
- { id: 4, class: vrrc, preferred-register: '' }
|
|
- { id: 5, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 6, class: gprc, preferred-register: '' }
|
|
- { id: 7, class: accrc, preferred-register: '' }
|
|
- { id: 8, class: crrc, preferred-register: '' }
|
|
- { id: 9, class: vsrc, preferred-register: '' }
|
|
- { id: 10, class: accrc, preferred-register: '' }
|
|
- { id: 11, class: accrc, preferred-register: '' }
|
|
- { id: 12, class: accrc, preferred-register: '' }
|
|
- { id: 13, class: accrc, preferred-register: '' }
|
|
- { id: 14, class: vsrc, preferred-register: '' }
|
|
- { id: 15, class: vsrprc, preferred-register: '' }
|
|
- { id: 16, class: vsrprc, preferred-register: '' }
|
|
- { id: 17, class: vsrc, preferred-register: '' }
|
|
- { id: 18, class: vsrprc, preferred-register: '' }
|
|
- { id: 19, class: vsrprc, preferred-register: '' }
|
|
- { id: 20, class: vsrc, preferred-register: '' }
|
|
- { id: 21, class: vsrprc, preferred-register: '' }
|
|
- { id: 22, class: vsrprc, preferred-register: '' }
|
|
- { id: 23, class: vsrc, preferred-register: '' }
|
|
- { id: 24, class: vsrprc, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$x3', virtual-reg: '%3' }
|
|
- { reg: '$v2', virtual-reg: '%4' }
|
|
- { reg: '$x7', virtual-reg: '%5' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack: []
|
|
stack: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.2(0x30000000), %bb.1(0x50000000)
|
|
liveins: $x3, $v2, $x7
|
|
|
|
%5:g8rc_and_g8rc_nox0 = COPY $x7
|
|
%4:vrrc = COPY $v2
|
|
%3:g8rc = COPY $x3
|
|
%6:gprc = COPY %3.sub_32
|
|
%7:accrc = XXSETACCZ
|
|
%0:uaccrc = COPY %7
|
|
%8:crrc = CMPLWI killed %6, 0
|
|
BCC 76, killed %8, %bb.2
|
|
B %bb.1
|
|
|
|
bb.1.if.then:
|
|
successors: %bb.2(0x80000000)
|
|
|
|
%9:vsrc = COPY %4
|
|
%11:accrc = COPY %7
|
|
%10:accrc = XVF32GERPP %11, %9, %9
|
|
%1:uaccrc = COPY %10
|
|
|
|
bb.2.if.end:
|
|
; We check that the PHI node on primed accumulator is inserted after
|
|
; the label.
|
|
; CHECK-LABEL: name: phiCopy
|
|
; CHECK-LABEL: bb.{{[0-9]}}.if.end:
|
|
; CHECK-NEXT: :accrc = PHI %7, %bb.0, %10, %bb.1
|
|
; CHECK-NEXT: %2:uaccrc = PHI
|
|
%2:uaccrc = PHI %0, %bb.0, %1, %bb.1
|
|
%13:accrc = COPY %2
|
|
%12:accrc = XXMFACC %13
|
|
%14:vsrc = COPY %12.sub_vsx1
|
|
%16:vsrprc = IMPLICIT_DEF
|
|
%15:vsrprc = INSERT_SUBREG %16, killed %14, %subreg.sub_vsx1
|
|
%17:vsrc = COPY %12.sub_vsx0
|
|
%18:vsrprc = INSERT_SUBREG %15, killed %17, %subreg.sub_vsx0
|
|
STXVP killed %18, 32, %5 :: (store 32 into %ir.ptr + 32)
|
|
%19:vsrprc = COPY %12.sub_pair1
|
|
%20:vsrc = COPY %19.sub_vsx1
|
|
%22:vsrprc = IMPLICIT_DEF
|
|
%21:vsrprc = INSERT_SUBREG %22, killed %20, %subreg.sub_vsx1
|
|
%23:vsrc = COPY %19.sub_vsx0
|
|
%24:vsrprc = INSERT_SUBREG %21, killed %23, %subreg.sub_vsx0
|
|
STXVP killed %24, 0, %5 :: (store 32 into %ir.ptr, align 64)
|
|
BLR8 implicit $lr8, implicit $rm
|
|
|
|
...
|
|
---
|
|
name: phiCopyUndef
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers:
|
|
- { id: 0, class: uaccrc, preferred-register: '' }
|
|
- { id: 1, class: uaccrc, preferred-register: '' }
|
|
- { id: 2, class: g8rc, preferred-register: '' }
|
|
- { id: 3, class: vrrc, preferred-register: '' }
|
|
- { id: 4, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 5, class: uaccrc, preferred-register: '' }
|
|
- { id: 6, class: gprc, preferred-register: '' }
|
|
- { id: 7, class: crrc, preferred-register: '' }
|
|
- { id: 8, class: vsrc, preferred-register: '' }
|
|
- { id: 9, class: accrc, preferred-register: '' }
|
|
- { id: 10, class: uaccrc, preferred-register: '' }
|
|
- { id: 11, class: accrc, preferred-register: '' }
|
|
- { id: 12, class: accrc, preferred-register: '' }
|
|
- { id: 13, class: accrc, preferred-register: '' }
|
|
- { id: 14, class: vsrc, preferred-register: '' }
|
|
- { id: 15, class: vsrprc, preferred-register: '' }
|
|
- { id: 16, class: vsrprc, preferred-register: '' }
|
|
- { id: 17, class: vsrc, preferred-register: '' }
|
|
- { id: 18, class: vsrprc, preferred-register: '' }
|
|
- { id: 19, class: vsrprc, preferred-register: '' }
|
|
- { id: 20, class: vsrc, preferred-register: '' }
|
|
- { id: 21, class: vsrprc, preferred-register: '' }
|
|
- { id: 22, class: vsrprc, preferred-register: '' }
|
|
- { id: 23, class: vsrc, preferred-register: '' }
|
|
- { id: 24, class: vsrprc, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$x3', virtual-reg: '%2' }
|
|
- { reg: '$v2', virtual-reg: '%3' }
|
|
- { reg: '$x7', virtual-reg: '%4' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack: []
|
|
stack: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.3(0x30000000), %bb.1(0x50000000)
|
|
liveins: $x3, $v2, $x7
|
|
|
|
%4:g8rc_and_g8rc_nox0 = COPY $x7
|
|
%3:vrrc = COPY $v2
|
|
%2:g8rc = COPY $x3
|
|
%6:gprc = COPY %2.sub_32
|
|
%7:crrc = CMPLWI killed %6, 0
|
|
BCC 68, killed %7, %bb.1
|
|
|
|
bb.3:
|
|
successors: %bb.2(0x80000000)
|
|
|
|
%5:uaccrc = IMPLICIT_DEF
|
|
B %bb.2
|
|
|
|
bb.1.if.then:
|
|
successors: %bb.2(0x80000000)
|
|
|
|
%8:vsrc = COPY %3
|
|
%10:uaccrc = IMPLICIT_DEF
|
|
%11:accrc = COPY %10
|
|
%9:accrc = XVF32GERPP %11, %8, %8
|
|
%0:uaccrc = COPY %9
|
|
|
|
bb.2.if.end:
|
|
; We check that the PHI node on primed accumulator is inserted after
|
|
; the label.
|
|
; CHECK-LABEL: name: phiCopyUndef
|
|
; CHECK-LABEL: bb.{{[0-9]}}.if.end:
|
|
; CHECK-NEXT: :accrc = PHI
|
|
; CHECK-NEXT: %1:uaccrc = PHI
|
|
%1:uaccrc = PHI %5, %bb.3, %0, %bb.1
|
|
%13:accrc = COPY %1
|
|
%12:accrc = XXMFACC %13
|
|
%14:vsrc = COPY %12.sub_vsx1
|
|
%16:vsrprc = IMPLICIT_DEF
|
|
%15:vsrprc = INSERT_SUBREG %16, killed %14, %subreg.sub_vsx1
|
|
%17:vsrc = COPY %12.sub_vsx0
|
|
%18:vsrprc = INSERT_SUBREG %15, killed %17, %subreg.sub_vsx0
|
|
STXVP killed %18, 32, %4 :: (store 32 into %ir.ptr + 32)
|
|
%19:vsrprc = COPY %12.sub_pair1
|
|
%20:vsrc = COPY %19.sub_vsx1
|
|
%22:vsrprc = IMPLICIT_DEF
|
|
%21:vsrprc = INSERT_SUBREG %22, killed %20, %subreg.sub_vsx1
|
|
%23:vsrc = COPY %19.sub_vsx0
|
|
%24:vsrprc = INSERT_SUBREG %21, killed %23, %subreg.sub_vsx0
|
|
STXVP killed %24, 0, %4 :: (store 32 into %ir.ptr, align 64)
|
|
BLR8 implicit $lr8, implicit $rm
|
|
|
|
...
|
|
---
|
|
name: phiPhis
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers:
|
|
- { id: 0, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 1, class: uaccrc, preferred-register: '' }
|
|
- { id: 2, class: uaccrc, preferred-register: '' }
|
|
- { id: 3, class: uaccrc, preferred-register: '' }
|
|
- { id: 4, class: uaccrc, preferred-register: '' }
|
|
- { id: 5, class: uaccrc, preferred-register: '' }
|
|
- { id: 6, class: uaccrc, preferred-register: '' }
|
|
- { id: 7, class: g8rc, preferred-register: '' }
|
|
- { id: 8, class: vrrc, preferred-register: '' }
|
|
- { id: 9, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 10, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 11, class: uaccrc, preferred-register: '' }
|
|
- { id: 12, class: crrc, preferred-register: '' }
|
|
- { id: 13, class: uaccrc, preferred-register: '' }
|
|
- { id: 14, class: gprc, preferred-register: '' }
|
|
- { id: 15, class: crrc, preferred-register: '' }
|
|
- { id: 16, class: uaccrc, preferred-register: '' }
|
|
- { id: 17, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 18, class: gprc, preferred-register: '' }
|
|
- { id: 19, class: g8rc, preferred-register: '' }
|
|
- { id: 20, class: g8rc, preferred-register: '' }
|
|
- { id: 21, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 22, class: g8rc, preferred-register: '' }
|
|
- { id: 23, class: vsrc, preferred-register: '' }
|
|
- { id: 24, class: accrc, preferred-register: '' }
|
|
- { id: 25, class: accrc, preferred-register: '' }
|
|
- { id: 26, class: accrc, preferred-register: '' }
|
|
- { id: 27, class: accrc, preferred-register: '' }
|
|
- { id: 28, class: accrc, preferred-register: '' }
|
|
- { id: 29, class: accrc, preferred-register: '' }
|
|
- { id: 30, class: accrc, preferred-register: '' }
|
|
- { id: 31, class: accrc, preferred-register: '' }
|
|
- { id: 32, class: accrc, preferred-register: '' }
|
|
- { id: 33, class: crrc, preferred-register: '' }
|
|
- { id: 34, class: gprc, preferred-register: '' }
|
|
- { id: 35, class: g8rc, preferred-register: '' }
|
|
- { id: 36, class: g8rc, preferred-register: '' }
|
|
- { id: 37, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 38, class: g8rc, preferred-register: '' }
|
|
- { id: 39, class: vsrc, preferred-register: '' }
|
|
- { id: 40, class: accrc, preferred-register: '' }
|
|
- { id: 41, class: accrc, preferred-register: '' }
|
|
- { id: 42, class: accrc, preferred-register: '' }
|
|
- { id: 43, class: accrc, preferred-register: '' }
|
|
- { id: 44, class: vsrc, preferred-register: '' }
|
|
- { id: 45, class: vsrprc, preferred-register: '' }
|
|
- { id: 46, class: vsrprc, preferred-register: '' }
|
|
- { id: 47, class: vsrc, preferred-register: '' }
|
|
- { id: 48, class: vsrprc, preferred-register: '' }
|
|
- { id: 49, class: vsrprc, preferred-register: '' }
|
|
- { id: 50, class: vsrc, preferred-register: '' }
|
|
- { id: 51, class: vsrprc, preferred-register: '' }
|
|
- { id: 52, class: vsrprc, preferred-register: '' }
|
|
- { id: 53, class: vsrc, preferred-register: '' }
|
|
- { id: 54, class: vsrprc, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$x3', virtual-reg: '%7' }
|
|
- { reg: '$v2', virtual-reg: '%8' }
|
|
- { reg: '$x7', virtual-reg: '%9' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack: []
|
|
stack: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.1(0x50000000), %bb.8(0x30000000)
|
|
liveins: $x3, $v2, $x7
|
|
|
|
%9:g8rc_and_g8rc_nox0 = COPY $x7
|
|
%8:vrrc = COPY $v2
|
|
%7:g8rc = COPY $x3
|
|
%10:gprc_and_gprc_nor0 = COPY %7.sub_32
|
|
%12:crrc = CMPWI %10, 1
|
|
BCC 4, killed %12, %bb.1
|
|
|
|
bb.8:
|
|
successors: %bb.6(0x80000000)
|
|
|
|
%11:uaccrc = IMPLICIT_DEF
|
|
B %bb.6
|
|
|
|
bb.1.for.body.preheader:
|
|
successors: %bb.3(0x40000000), %bb.2(0x40000000)
|
|
|
|
%14:gprc = ADDI %10, -1
|
|
%0:gprc_and_gprc_nor0 = RLWINM %10, 0, 29, 31
|
|
%13:uaccrc = IMPLICIT_DEF
|
|
%15:crrc = CMPLWI killed %14, 7
|
|
BCC 12, killed %15, %bb.3
|
|
B %bb.2
|
|
|
|
bb.2.for.body.preheader.new:
|
|
successors: %bb.7(0x80000000)
|
|
|
|
%17:gprc_and_gprc_nor0 = RLWINM %10, 0, 0, 28
|
|
%18:gprc = ADDI killed %17, -8
|
|
%20:g8rc = IMPLICIT_DEF
|
|
%19:g8rc = INSERT_SUBREG %20, killed %18, %subreg.sub_32
|
|
%21:g8rc_and_g8rc_nox0 = RLWINM8 %19, 29, 3, 31
|
|
%22:g8rc = nuw nsw ADDI8 killed %21, 1
|
|
MTCTR8loop killed %22, implicit-def dead $ctr8
|
|
%16:uaccrc = IMPLICIT_DEF
|
|
B %bb.7
|
|
|
|
bb.3.for.cond.cleanup.loopexit.unr-lcssa:
|
|
successors: %bb.6(0x30000000), %bb.4(0x50000000)
|
|
|
|
%1:uaccrc = PHI %13, %bb.1, %6, %bb.7
|
|
%33:crrc = CMPLWI %0, 0
|
|
BCC 76, killed %33, %bb.6
|
|
B %bb.4
|
|
|
|
bb.4.for.body.epil.preheader:
|
|
successors: %bb.5(0x80000000)
|
|
|
|
%34:gprc = nsw ADDI %0, -1
|
|
%36:g8rc = IMPLICIT_DEF
|
|
%35:g8rc = INSERT_SUBREG %36, killed %34, %subreg.sub_32
|
|
%37:g8rc_and_g8rc_nox0 = RLDICL killed %35, 0, 32
|
|
%38:g8rc = nuw nsw ADDI8 killed %37, 1
|
|
MTCTR8loop killed %38, implicit-def dead $ctr8
|
|
|
|
bb.5.for.body.epil:
|
|
successors: %bb.5(0x7c000000), %bb.6(0x04000000)
|
|
; We check that the PHI node on primed accumulator is inserted after
|
|
; the label.
|
|
; CHECK-LABEL: name: phiPhis
|
|
; CHECK-LABEL: bb.{{[0-9]}}.for.body.epil:
|
|
; CHECK-NEXT: successors: %bb.{{[0-9]}}(0x{{[0-9a-f]+}}), %bb.{{[0-9]}}(0x{{[0-9a-f]+}})
|
|
; CHECK-NEXT: {{ }}
|
|
; CHECK-NEXT: :accrc = PHI
|
|
; CHECK-NEXT: %2:uaccrc = PHI
|
|
%2:uaccrc = PHI %1, %bb.4, %3, %bb.5
|
|
%39:vsrc = COPY %8
|
|
%41:accrc = COPY %2
|
|
%40:accrc = XVF32GERPP %41, %39, %39
|
|
%3:uaccrc = COPY %40
|
|
BDNZ8 %bb.5, implicit-def dead $ctr8, implicit $ctr8
|
|
B %bb.6
|
|
|
|
bb.6.for.cond.cleanup:
|
|
%4:uaccrc = PHI %11, %bb.8, %1, %bb.3, %3, %bb.5
|
|
%43:accrc = COPY %4
|
|
%42:accrc = XXMFACC %43
|
|
%44:vsrc = COPY %42.sub_vsx1
|
|
%46:vsrprc = IMPLICIT_DEF
|
|
%45:vsrprc = INSERT_SUBREG %46, killed %44, %subreg.sub_vsx1
|
|
%47:vsrc = COPY %42.sub_vsx0
|
|
%48:vsrprc = INSERT_SUBREG %45, killed %47, %subreg.sub_vsx0
|
|
STXVP killed %48, 96, %9 :: (store 32 into %ir.add.ptr + 32)
|
|
%49:vsrprc = COPY %42.sub_pair1
|
|
%50:vsrc = COPY %49.sub_vsx1
|
|
%52:vsrprc = IMPLICIT_DEF
|
|
%51:vsrprc = INSERT_SUBREG %52, killed %50, %subreg.sub_vsx1
|
|
%53:vsrc = COPY %49.sub_vsx0
|
|
%54:vsrprc = INSERT_SUBREG %51, killed %53, %subreg.sub_vsx0
|
|
STXVP killed %54, 64, %9 :: (store 32 into %ir.add.ptr, align 64)
|
|
BLR8 implicit $lr8, implicit $rm
|
|
|
|
bb.7.for.body:
|
|
successors: %bb.7(0x7c000000), %bb.3(0x04000000)
|
|
|
|
%5:uaccrc = PHI %16, %bb.2, %6, %bb.7
|
|
%23:vsrc = COPY %8
|
|
%25:accrc = COPY %5
|
|
%24:accrc = XVF32GERPP %25, %23, %23
|
|
%26:accrc = XVF32GERPP %24, %23, %23
|
|
%27:accrc = XVF32GERPP %26, %23, %23
|
|
%28:accrc = XVF32GERPP %27, %23, %23
|
|
%29:accrc = XVF32GERPP %28, %23, %23
|
|
%30:accrc = XVF32GERPP %29, %23, %23
|
|
%31:accrc = XVF32GERPP %30, %23, %23
|
|
%32:accrc = XVF32GERPP %31, %23, %23
|
|
%6:uaccrc = COPY %32
|
|
BDNZ8 %bb.7, implicit-def dead $ctr8, implicit $ctr8
|
|
B %bb.3
|
|
|
|
...
|
|
---
|
|
name: phiCycle
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers:
|
|
- { id: 0, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 1, class: uaccrc, preferred-register: '' }
|
|
- { id: 2, class: uaccrc, preferred-register: '' }
|
|
- { id: 3, class: uaccrc, preferred-register: '' }
|
|
- { id: 4, class: uaccrc, preferred-register: '' }
|
|
- { id: 5, class: uaccrc, preferred-register: '' }
|
|
- { id: 6, class: uaccrc, preferred-register: '' }
|
|
- { id: 7, class: g8rc, preferred-register: '' }
|
|
- { id: 8, class: vrrc, preferred-register: '' }
|
|
- { id: 9, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 10, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 11, class: uaccrc, preferred-register: '' }
|
|
- { id: 12, class: crrc, preferred-register: '' }
|
|
- { id: 13, class: uaccrc, preferred-register: '' }
|
|
- { id: 14, class: gprc, preferred-register: '' }
|
|
- { id: 15, class: crrc, preferred-register: '' }
|
|
- { id: 16, class: uaccrc, preferred-register: '' }
|
|
- { id: 17, class: gprc_and_gprc_nor0, preferred-register: '' }
|
|
- { id: 18, class: gprc, preferred-register: '' }
|
|
- { id: 19, class: g8rc, preferred-register: '' }
|
|
- { id: 20, class: g8rc, preferred-register: '' }
|
|
- { id: 21, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 22, class: g8rc, preferred-register: '' }
|
|
- { id: 23, class: vsrc, preferred-register: '' }
|
|
- { id: 24, class: accrc, preferred-register: '' }
|
|
- { id: 25, class: accrc, preferred-register: '' }
|
|
- { id: 26, class: accrc, preferred-register: '' }
|
|
- { id: 27, class: accrc, preferred-register: '' }
|
|
- { id: 28, class: accrc, preferred-register: '' }
|
|
- { id: 29, class: accrc, preferred-register: '' }
|
|
- { id: 30, class: accrc, preferred-register: '' }
|
|
- { id: 31, class: accrc, preferred-register: '' }
|
|
- { id: 32, class: accrc, preferred-register: '' }
|
|
- { id: 33, class: crrc, preferred-register: '' }
|
|
- { id: 34, class: gprc, preferred-register: '' }
|
|
- { id: 35, class: g8rc, preferred-register: '' }
|
|
- { id: 36, class: g8rc, preferred-register: '' }
|
|
- { id: 37, class: g8rc_and_g8rc_nox0, preferred-register: '' }
|
|
- { id: 38, class: g8rc, preferred-register: '' }
|
|
- { id: 39, class: vsrc, preferred-register: '' }
|
|
- { id: 40, class: accrc, preferred-register: '' }
|
|
- { id: 41, class: accrc, preferred-register: '' }
|
|
- { id: 42, class: accrc, preferred-register: '' }
|
|
- { id: 43, class: accrc, preferred-register: '' }
|
|
- { id: 44, class: vsrc, preferred-register: '' }
|
|
- { id: 45, class: vsrprc, preferred-register: '' }
|
|
- { id: 46, class: vsrprc, preferred-register: '' }
|
|
- { id: 47, class: vsrc, preferred-register: '' }
|
|
- { id: 48, class: vsrprc, preferred-register: '' }
|
|
- { id: 49, class: vsrprc, preferred-register: '' }
|
|
- { id: 50, class: vsrc, preferred-register: '' }
|
|
- { id: 51, class: vsrprc, preferred-register: '' }
|
|
- { id: 52, class: vsrprc, preferred-register: '' }
|
|
- { id: 53, class: vsrc, preferred-register: '' }
|
|
- { id: 54, class: vsrprc, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$x3', virtual-reg: '%7' }
|
|
- { reg: '$v2', virtual-reg: '%8' }
|
|
- { reg: '$x7', virtual-reg: '%9' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack: []
|
|
stack: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.1(0x50000000), %bb.8(0x30000000)
|
|
liveins: $x3, $v2, $x7
|
|
|
|
%9:g8rc_and_g8rc_nox0 = COPY $x7
|
|
%8:vrrc = COPY $v2
|
|
%7:g8rc = COPY $x3
|
|
%10:gprc_and_gprc_nor0 = COPY %7.sub_32
|
|
%12:crrc = CMPWI %10, 1
|
|
BCC 4, killed %12, %bb.1
|
|
|
|
bb.8:
|
|
successors: %bb.6(0x80000000)
|
|
|
|
%11:uaccrc = IMPLICIT_DEF
|
|
B %bb.6
|
|
|
|
bb.1.for.body.preheader:
|
|
successors: %bb.3(0x40000000), %bb.2(0x40000000)
|
|
|
|
%14:gprc = ADDI %10, -1
|
|
%0:gprc_and_gprc_nor0 = RLWINM %10, 0, 29, 31
|
|
%13:uaccrc = IMPLICIT_DEF
|
|
%15:crrc = CMPLWI %14, 7
|
|
BCC 12, killed %15, %bb.3
|
|
B %bb.2
|
|
|
|
bb.2.for.body.preheader.new:
|
|
successors: %bb.7(0x80000000)
|
|
|
|
%17:gprc_and_gprc_nor0 = RLWINM %10, 0, 0, 28
|
|
%18:gprc = ADDI killed %17, -8
|
|
%20:g8rc = IMPLICIT_DEF
|
|
%19:g8rc = INSERT_SUBREG %20, killed %18, %subreg.sub_32
|
|
%21:g8rc_and_g8rc_nox0 = RLWINM8 %19, 29, 3, 31
|
|
%22:g8rc = nuw nsw ADDI8 killed %21, 1
|
|
MTCTR8loop killed %22, implicit-def dead $ctr8
|
|
%16:uaccrc = IMPLICIT_DEF
|
|
B %bb.7
|
|
|
|
bb.3.for.cond.cleanup.loopexit.unr-lcssa:
|
|
successors: %bb.6(0x30000000), %bb.4(0x50000000)
|
|
; We check that no phi node is inserted in the block.
|
|
; CHECK-LABEL: name: phiCycle
|
|
; CHECK-LABEL: bb.{{[0-9]}}.for.cond.cleanup.loopexit.unr-lcssa:
|
|
; CHECK-NEXT: successors: %bb.{{[0-9]}}(0x{{[0-9a-f]+}}), %bb.{{[0-9]}}(0x{{[0-9a-f]+}})
|
|
; CHECK-NEXT: {{ }}
|
|
; CHECK-NEXT: %1:uaccrc = PHI
|
|
; CHECK-NEXT: %33:crrc
|
|
%1:uaccrc = PHI %13, %bb.1, %6, %bb.7, %2, %bb.5
|
|
%33:crrc = CMPLWI %0, 0
|
|
BCC 76, killed %33, %bb.6
|
|
B %bb.4
|
|
|
|
bb.4.for.body.epil.preheader:
|
|
successors: %bb.5(0x80000000)
|
|
|
|
%34:gprc = nsw ADDI %0, -1
|
|
%36:g8rc = IMPLICIT_DEF
|
|
%35:g8rc = INSERT_SUBREG %36, killed %34, %subreg.sub_32
|
|
%37:g8rc_and_g8rc_nox0 = RLDICL killed %35, 0, 32
|
|
%38:g8rc = nuw nsw ADDI8 killed %37, 1
|
|
MTCTR8loop killed %38, implicit-def dead $ctr8
|
|
|
|
bb.5.for.body.epil:
|
|
successors: %bb.3(0x40000000), %bb.5(0x7c000000)
|
|
; We check that no phi node is inserted in the block.
|
|
; CHECK-LABEL: bb.{{[0-9]}}.for.body.epil:
|
|
; CHECK-NEXT: successors: %bb.{{[0-9]}}(0x{{[0-9a-f]+}}), %bb.{{[0-9]}}(0x{{[0-9a-f]+}})
|
|
; CHECK-NEXT: {{ }}
|
|
; CHECK-NEXT: %2:uaccrc = PHI
|
|
; CHECK-NEXT: %39:vsrc
|
|
%2:uaccrc = PHI %1, %bb.4, %3, %bb.5
|
|
%39:vsrc = COPY %8
|
|
%41:accrc = COPY %2
|
|
%40:accrc = XVF32GERPP %41, %39, %39
|
|
%3:uaccrc = COPY %40
|
|
%15:crrc = CMPLWI %14, 7
|
|
BCC 12, killed %15, %bb.5
|
|
B %bb.3
|
|
|
|
bb.6.for.cond.cleanup:
|
|
%4:uaccrc = PHI %11, %bb.8, %1, %bb.3
|
|
%43:accrc = COPY %4
|
|
%42:accrc = XXMFACC %43
|
|
%44:vsrc = COPY %42.sub_vsx1
|
|
%46:vsrprc = IMPLICIT_DEF
|
|
%45:vsrprc = INSERT_SUBREG %46, killed %44, %subreg.sub_vsx1
|
|
%47:vsrc = COPY %42.sub_vsx0
|
|
%48:vsrprc = INSERT_SUBREG %45, killed %47, %subreg.sub_vsx0
|
|
STXVP killed %48, 96, %9 :: (store 32 into %ir.add.ptr + 32)
|
|
%49:vsrprc = COPY %42.sub_pair1
|
|
%50:vsrc = COPY %49.sub_vsx1
|
|
%52:vsrprc = IMPLICIT_DEF
|
|
%51:vsrprc = INSERT_SUBREG %52, killed %50, %subreg.sub_vsx1
|
|
%53:vsrc = COPY %49.sub_vsx0
|
|
%54:vsrprc = INSERT_SUBREG %51, killed %53, %subreg.sub_vsx0
|
|
STXVP killed %54, 64, %9 :: (store 32 into %ir.add.ptr, align 64)
|
|
BLR8 implicit $lr8, implicit $rm
|
|
|
|
bb.7.for.body:
|
|
successors: %bb.7(0x7c000000), %bb.3(0x04000000)
|
|
|
|
%5:uaccrc = PHI %16, %bb.2, %6, %bb.7
|
|
%23:vsrc = COPY %8
|
|
%25:accrc = COPY %5
|
|
%24:accrc = XVF32GERPP %25, %23, %23
|
|
%26:accrc = XVF32GERPP %24, %23, %23
|
|
%27:accrc = XVF32GERPP %26, %23, %23
|
|
%28:accrc = XVF32GERPP %27, %23, %23
|
|
%29:accrc = XVF32GERPP %28, %23, %23
|
|
%30:accrc = XVF32GERPP %29, %23, %23
|
|
%31:accrc = XVF32GERPP %30, %23, %23
|
|
%32:accrc = XVF32GERPP %31, %23, %23
|
|
%6:uaccrc = COPY %32
|
|
BDNZ8 %bb.7, implicit-def dead $ctr8, implicit $ctr8
|
|
B %bb.3
|
|
|
|
...
|