| # NOTE: This test verifies disable/enable instruction hoisting to hot blocks | |
| # based on non-profile data | |
| # RUN: llc -run-pass early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -verify-machineinstrs -disable-hoisting-to-hotter-blocks=all \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-NO-HOIST | |
| # RUN: llc -run-pass early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -verify-machineinstrs -disable-hoisting-to-hotter-blocks=all \ | |
| # RUN: -block-freq-ratio-threshold=100000000 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| # RUN: llc -run-pass early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -verify-machineinstrs -disable-hoisting-to-hotter-blocks=pgo \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| # RUN: llc -run-pass early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -verify-machineinstrs -disable-hoisting-to-hotter-blocks=none \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| # Tests for new pass manager | |
| # RUN: llc -passes early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -disable-hoisting-to-hotter-blocks=all \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-NO-HOIST | |
| # RUN: llc -passes early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -disable-hoisting-to-hotter-blocks=all \ | |
| # RUN: -block-freq-ratio-threshold=100000000 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| # RUN: llc -passes early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -disable-hoisting-to-hotter-blocks=pgo \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| # RUN: llc -passes early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \ | |
| # RUN: -disable-hoisting-to-hotter-blocks=none \ | |
| # RUN: -block-freq-ratio-threshold=100 %s -o - | FileCheck %s \ | |
| # RUN: --check-prefix=CHECK-HOIST | |
| --- | | |
| target datalayout = "e-m:e-i64:64-n32:64" | |
| define dso_local void @test(ptr nocapture %fp, i32 signext %Arg, i32 signext %Len, ptr nocapture %Ptr) { | |
| entry: | |
| tail call void asm sideeffect "#NOTHING", "~{r2}"() | |
| %cmp6 = icmp sgt i32 %Len, 0 | |
| br i1 %cmp6, label %for.body.lr.ph, label %for.cond.cleanup | |
| for.body.lr.ph: ; preds = %entry | |
| %cmp1 = icmp sgt i32 %Arg, 10 | |
| br label %for.body | |
| for.cond.cleanup: ; preds = %for.inc, %entry | |
| ret void | |
| for.body: ; preds = %for.inc, %for.body.lr.ph | |
| %i.07 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.inc ] | |
| %0 = load i32, ptr %Ptr, align 4 | |
| %1 = add i32 %i.07, %0 | |
| store i32 %1, ptr %Ptr, align 4 | |
| br i1 %cmp1, label %if.then, label %for.inc | |
| if.then: ; preds = %for.body | |
| tail call void asm sideeffect "#NOTHING", "~{r2}"() | |
| tail call void %fp(i32 signext %Arg) | |
| br label %for.inc | |
| for.inc: ; preds = %if.then, %for.body | |
| %inc = add nuw nsw i32 %i.07, 1 | |
| %exitcond = icmp eq i32 %Len, %inc | |
| br i1 %exitcond, label %for.cond.cleanup, label %for.body | |
| } | |
| ; Function Attrs: nounwind | |
| declare void @llvm.stackprotector(ptr, ptr) #0 | |
| attributes #0 = { nounwind } | |
| ... | |
| --- | |
| name: test | |
| alignment: 4 | |
| exposesReturnsTwice: false | |
| legalized: false | |
| regBankSelected: false | |
| selected: false | |
| failedISel: false | |
| tracksRegLiveness: true | |
| hasWinCFI: false | |
| registers: | |
| - { id: 0, class: crbitrc, preferred-register: '' } | |
| - { id: 1, class: gprc_and_gprc_nor0, preferred-register: '' } | |
| - { id: 2, class: gprc, preferred-register: '' } | |
| - { id: 3, class: g8rc, preferred-register: '' } | |
| - { id: 4, class: g8rc, preferred-register: '' } | |
| - { id: 5, class: g8rc, preferred-register: '' } | |
| - { id: 6, class: g8rc_and_g8rc_nox0, preferred-register: '' } | |
| - { id: 7, class: gprc, preferred-register: '' } | |
| - { id: 8, class: gprc, preferred-register: '' } | |
| - { id: 9, class: crrc, preferred-register: '' } | |
| - { id: 10, class: gprc, preferred-register: '' } | |
| - { id: 11, class: crrc, preferred-register: '' } | |
| - { id: 12, class: gprc, preferred-register: '' } | |
| - { id: 13, class: gprc, preferred-register: '' } | |
| - { id: 14, class: g8rc, preferred-register: '' } | |
| - { id: 15, class: g8rc, preferred-register: '' } | |
| - { id: 16, class: crrc, preferred-register: '' } | |
| liveins: | |
| - { reg: '$x3', virtual-reg: '%3' } | |
| - { reg: '$x4', virtual-reg: '%4' } | |
| - { reg: '$x5', virtual-reg: '%5' } | |
| - { reg: '$x6', virtual-reg: '%6' } | |
| frameInfo: | |
| isFrameAddressTaken: false | |
| isReturnAddressTaken: false | |
| hasStackMap: false | |
| hasPatchPoint: false | |
| stackSize: 0 | |
| offsetAdjustment: 0 | |
| maxAlignment: 0 | |
| adjustsStack: false | |
| hasCalls: true | |
| stackProtector: '' | |
| maxCallFrameSize: 4294967295 | |
| cvBytesOfCalleeSavedRegisters: 0 | |
| hasOpaqueSPAdjustment: false | |
| hasVAStart: false | |
| hasMustTailInVarArgFunc: false | |
| localFrameSize: 0 | |
| savePoint: [] | |
| restorePoint: [] | |
| fixedStack: [] | |
| stack: [] | |
| constants: [] | |
| machineFunctionInfo: {} | |
| body: | | |
| bb.0.entry: | |
| successors: %bb.1(0x7ecade30), %bb.2(0x013521d0) | |
| liveins: $x3, $x4, $x5, $x6 | |
| %6:g8rc_and_g8rc_nox0 = COPY $x6 | |
| %5:g8rc = COPY $x5 | |
| %4:g8rc = COPY $x4 | |
| %3:g8rc = COPY $x3 | |
| %7:gprc = COPY %4.sub_32 | |
| %8:gprc = COPY %5.sub_32 | |
| INLINEASM &"#NOTHING", 1, 12, implicit-def early-clobber $r2 | |
| %9:crrc = CMPWI %8, 1 | |
| BCC 12, killed %9, %bb.2 | |
| B %bb.1 | |
| bb.1.for.body.lr.ph: | |
| successors: %bb.3(0x80000000) | |
| INLINEASM &"#NOTHING", 1, 12, implicit-def early-clobber $r2 | |
| %11:crrc = CMPWI %7, 10 | |
| %0:crbitrc = COPY %11.sub_gt | |
| %10:gprc = LI 0 | |
| B %bb.3 | |
| bb.2.for.cond.cleanup: | |
| BLR8 implicit $lr8, implicit $rm | |
| bb.3.for.body: | |
| successors: %bb.4(0x00000002), %bb.5(0x7ffffffe) | |
| %1:gprc_and_gprc_nor0 = PHI %10, %bb.1, %2, %bb.5 | |
| %12:gprc = LWZ 0, %6 :: (load (s32) from %ir.Ptr) | |
| %13:gprc = ADD4 %1, killed %12 | |
| STW killed %13, 0, %6 :: (store (s32) into %ir.Ptr) | |
| BCn %0, %bb.5 | |
| B %bb.4 | |
| bb.4.if.then: | |
| successors: %bb.5(0x80000000) | |
| INLINEASM &"#NOTHING", 1, 12, implicit-def early-clobber $r2 | |
| ADJCALLSTACKDOWN 32, 0, implicit-def dead $r1, implicit $r1 | |
| %14:g8rc = COPY $x2 | |
| STD %14, 24, $x1 :: (store (s64) into stack + 24) | |
| %15:g8rc = EXTSW_32_64 %7 | |
| $x3 = COPY %15 | |
| $x12 = COPY %3 | |
| MTCTR8 %3, implicit-def $ctr8 | |
| BCTRL8_LDinto_toc 24, $x1, csr_ppc64_altivec, implicit-def dead $lr8, implicit-def dead $x2, implicit $ctr8, implicit $rm, implicit $x3, implicit $x12, implicit $x2, implicit-def $r1 | |
| ADJCALLSTACKUP 32, 0, implicit-def dead $r1, implicit $r1 | |
| bb.5.for.inc: | |
| successors: %bb.2(0x013521d0), %bb.3(0x7ecade30) | |
| %2:gprc = nuw nsw ADDI %1, 1 | |
| %16:crrc = CMPLW %8, %2 | |
| BCC 76, killed %16, %bb.2 | |
| B %bb.3 | |
| ... | |
| # CHECK for enabling instruction hoisting | |
| #CHECK-LABEL: test | |
| #CHECK-HOIST: bb.1.for.body.lr.ph: | |
| #CHECK-HOIST: %14:g8rc = COPY $x2 | |
| #CHECK-HOIST: STD %14, 24, $x1 :: (store (s64) into stack + 24) | |
| #CHECK-HOIST: %15:g8rc = EXTSW_32_64 %7 | |
| #CHECK-HOIST: B %bb.3 | |
| #CHECK-HOIST: bb.4.if.then: | |
| #CHECK-HOIST-NOT: %14:g8rc = COPY $x2 | |
| #CHECK-HOIST-NOT: STD %14, 24, $x1 :: (store (s64) into stack + 24) | |
| #CHECK-HOIST-NOT: %15:g8rc = EXTSW_32_64 %7 | |
| #CHECK-HOIST: bb.5.for.inc: | |
| # CHECK for disabling instruction hoisting due to block hotness | |
| #CHECK-LABEL: test | |
| #CHECK-NO-HOIST: bb.1.for.body.lr.ph: | |
| #CHECK-NO-HOIST-NOT: %14:g8rc = COPY $x2 | |
| #CHECK-NO-HOIST-NOT: STD %14, 24, $x1 :: (store (s64) into stack + 24) | |
| #CHECK-NO-HOIST-NOT: %15:g8rc = EXTSW_32_64 %7 | |
| #CHECK-NO-HOIST: B %bb.3 | |
| #CHECK-NO-HOIST: bb.4.if.then: | |
| #CHECK-NO-HOIST: %14:g8rc = COPY $x2 | |
| #CHECK-NO-HOIST: STD %14, 24, $x1 :: (store (s64) into stack + 24) | |
| #CHECK-NO-HOIST: %15:g8rc = EXTSW_32_64 %7 | |
| #CHECK-NO-HOIST: bb.5.for.inc: |