| # RUN: llc -mtriple=hexagon -run-pass pipeliner -debug-only=pipeliner %s -o /dev/null 2>&1 | FileCheck %s |
| # REQUIRES: asserts |
| |
| # Test boundary cases for loop carried dependence analysis |
| |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %10:intregs, 0, %0:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * 3, Len: 4 |
| #CHECK: OtherMI: dead %30:intregs = L2_loadri_io %10:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * 3, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %12:intregs, 0, %1:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * 4, Len: 4 |
| #CHECK: OtherMI: dead %31:intregs = L2_loadri_io %12:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * 4, Len: 4 |
| #CHECK: Result: No overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %14:intregs, 0, %2:intregs :: (store (s64)) |
| #CHECK: Base + 0 + I * 4, Len: 8 |
| #CHECK: OtherMI: dead %32:intregs = L2_loadri_io %14:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * 4, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %16:intregs, 0, %3:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * 4, Len: 4 |
| #CHECK: OtherMI: dead %33:intregs = L2_loadri_io %16:intregs, -1 :: (load (s32)) |
| #CHECK: Base + -1 + I * 4, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %18:intregs, 1, %4:intregs :: (store (s32)) |
| #CHECK: Base + 1 + I * 4, Len: 4 |
| #CHECK: OtherMI: dead %34:intregs = L2_loadri_io %18:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * 4, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %20:intregs, 0, %5:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * -3, Len: 4 |
| #CHECK: OtherMI: dead %35:intregs = L2_loadri_io %20:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * -3, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %22:intregs, 0, %6:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * -4, Len: 4 |
| #CHECK: OtherMI: dead %36:intregs = L2_loadri_io %22:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * -4, Len: 4 |
| #CHECK: Result: No overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %24:intregs, 0, %7:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * -4, Len: 4 |
| #CHECK: OtherMI: dead %37:intregs = L2_loadri_io %24:intregs, 0 :: (load (s64)) |
| #CHECK: Base + 0 + I * -4, Len: 8 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %26:intregs, 0, %8:intregs :: (store (s32)) |
| #CHECK: Base + 0 + I * -4, Len: 4 |
| #CHECK: OtherMI: dead %38:intregs = L2_loadri_io %26:intregs, 1 :: (load (s32)) |
| #CHECK: Base + 1 + I * -4, Len: 4 |
| #CHECK: Result: Overlap |
| #CHECK: Overlap check: |
| #CHECK: BaseMI: S2_storeri_io %28:intregs, -1, %9:intregs :: (store (s32)) |
| #CHECK: Base + -1 + I * -4, Len: 4 |
| #CHECK: OtherMI: dead %39:intregs = L2_loadri_io %28:intregs, 0 :: (load (s32)) |
| #CHECK: Base + 0 + I * -4, Len: 4 |
| #CHECK: Result: Overlap |
| |
| --- |
| name: test |
| tracksRegLiveness: true |
| |
| body: | |
| bb.0: |
| successors: %bb.1 |
| |
| %100:intregs = IMPLICIT_DEF |
| %200:intregs = IMPLICIT_DEF |
| %300:intregs = IMPLICIT_DEF |
| %400:intregs = IMPLICIT_DEF |
| %500:intregs = IMPLICIT_DEF |
| %600:intregs = IMPLICIT_DEF |
| %700:intregs = IMPLICIT_DEF |
| %800:intregs = IMPLICIT_DEF |
| %900:intregs = IMPLICIT_DEF |
| %1000:intregs = IMPLICIT_DEF |
| J2_loop0i %bb.1, 6, implicit-def $lc0, implicit-def $sa0, implicit-def $usr |
| |
| bb.1 (machine-block-address-taken): |
| successors: %bb.1, %bb.2 |
| |
| %0:intregs = PHI %100, %bb.0, %1, %bb.1 |
| %2:intregs = PHI %200, %bb.0, %3, %bb.1 |
| %4:intregs = PHI %300, %bb.0, %5, %bb.1 |
| %6:intregs = PHI %400, %bb.0, %7, %bb.1 |
| %8:intregs = PHI %500, %bb.0, %9, %bb.1 |
| %10:intregs = PHI %600, %bb.0, %11, %bb.1 |
| %12:intregs = PHI %700, %bb.0, %13, %bb.1 |
| %14:intregs = PHI %800, %bb.0, %15, %bb.1 |
| %16:intregs = PHI %900, %bb.0, %17, %bb.1 |
| %18:intregs = PHI %1000, %bb.0, %19, %bb.1 |
| |
| %1:intregs = A2_addi %0, 3 |
| %101:intregs = L2_loadri_io %0, 0 :: (load (s32)) |
| S2_storeri_io %0, 0, %100 :: (store (s32)) |
| |
| %3:intregs = A2_addi %2, 4 |
| %201:intregs = L2_loadri_io %2, 0 :: (load (s32)) |
| S2_storeri_io %2, 0, %200 :: (store (s32)) |
| |
| %5:intregs = A2_addi %4, 4 |
| %301:intregs = L2_loadri_io %4, 0 :: (load (s32)) |
| S2_storeri_io %4, 0, %300 :: (store (s64)) |
| |
| %7:intregs = A2_addi %6, 4 |
| %401:intregs = L2_loadri_io %6, -1 :: (load (s32)) |
| S2_storeri_io %6, 0, %400 :: (store (s32)) |
| |
| %9:intregs = A2_addi %8, 4 |
| %501:intregs = L2_loadri_io %8, 0 :: (load (s32)) |
| S2_storeri_io %8, 1, %500 :: (store (s32)) |
| |
| %11:intregs = A2_addi %10, -3 |
| %601:intregs = L2_loadri_io %10, 0 :: (load (s32)) |
| S2_storeri_io %10, 0, %600 :: (store (s32)) |
| |
| %13:intregs = A2_addi %12, -4 |
| %701:intregs = L2_loadri_io %12, 0 :: (load (s32)) |
| S2_storeri_io %12, 0, %700 :: (store (s32)) |
| |
| %15:intregs = A2_addi %14, -4 |
| %801:intregs = L2_loadri_io %14, 0 :: (load (s64)) |
| S2_storeri_io %14, 0, %800 :: (store (s32)) |
| |
| %17:intregs = A2_addi %16, -4 |
| %901:intregs = L2_loadri_io %16, 1 :: (load (s32)) |
| S2_storeri_io %16, 0, %900 :: (store (s32)) |
| |
| %19:intregs = A2_addi %18, -4 |
| %1001:intregs = L2_loadri_io %18, 0 :: (load (s32)) |
| S2_storeri_io %18, -1, %1000 :: (store (s32)) |
| |
| ENDLOOP0 %bb.1, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0 |
| J2_jump %bb.2, implicit-def dead $pc |
| |
| bb.2: |
| |
| ... |