| # 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 |
| |
| ... |