CACHE_ALIGNED_STD modeled a Veyron V1 store-commit optimization. That
design will not reach silicon and no upstream tune enables the fusion.
Remove the specialized recognizer and its unused flag.
gcc/ChangeLog:
* config/riscv/riscv-fusion.cc (riscv_fuse_cache_aligned_std):
Remove.
(riscv_fusion_table): Remove its entry.
* config/riscv/riscv-protos.h (enum riscv_fusion_pairs): Remove
RISCV_FUSE_CACHE_ALIGNED_STD.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/fusion-cache-aligned-std.c: Remove.
Signed-off-by: Jin Ma <[email protected]>
---
gcc/config/riscv/riscv-fusion.cc | 65 -------------------
gcc/config/riscv/riscv-protos.h | 7 +-
.../riscv/fusion-cache-aligned-std.c | 21 ------
3 files changed, 3 insertions(+), 90 deletions(-)
delete mode 100644 gcc/testsuite/gcc.target/riscv/fusion-cache-aligned-std.c
diff --git a/gcc/config/riscv/riscv-fusion.cc b/gcc/config/riscv/riscv-fusion.cc
index ca4de9dfc9e..2ce9b965974 100644
--- a/gcc/config/riscv/riscv-fusion.cc
+++ b/gcc/config/riscv/riscv-fusion.cc
@@ -561,69 +561,6 @@ riscv_fuse_auipc_ld (rtx_insn *prev, rtx_insn *curr)
return false;
}
-/* Check for RISCV_FUSE_CACHE_ALIGNED_STD fusion.
- prev (sd) == (set (mem:DI (rs1, offset1)) (reg:DI rs2))
- curr (sd) == (set (mem:DI (rs1, offset2)) (reg:DI rs3))
-
- Constraints:
- rs1 has at least 128-bit pointer alignment
- min (offset1, offset2) is 16-byte aligned
- abs (offset1 - offset2) == 8. */
-
-static bool
-riscv_fuse_cache_aligned_std (rtx_insn *prev, rtx_insn *curr)
-{
- rtx prev_set = single_set (prev);
- rtx curr_set = single_set (curr);
- if (!prev_set || !curr_set || any_condjump_p (curr))
- return false;
-
- if (MEM_P (SET_DEST (prev_set))
- && MEM_P (SET_DEST (curr_set))
- && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
- /* We can probably relax this condition. The documentation is a bit
- unclear about sub-word cases. So we just model DImode for now. */
- && GET_MODE (SET_DEST (curr_set)) == DImode
- && GET_MODE (SET_DEST (prev_set)) == DImode)
- {
- rtx base_prev, base_curr, offset_prev, offset_curr;
-
- extract_base_offset_in_addr (SET_DEST (prev_set),
- &base_prev, &offset_prev);
- extract_base_offset_in_addr (SET_DEST (curr_set),
- &base_curr, &offset_curr);
-
- /* Proceed only if we find both bases, both bases are register and
- bases are the same register. */
- if (base_prev != NULL_RTX && base_curr != NULL_RTX
- && REG_P (base_prev) && REG_P (base_curr)
- && REGNO (base_prev) == REGNO (base_curr)
- /* The alignment of the base pointer is more useful than the
- alignment of the memory reference for determining if we're
- on opposite sides of a cache line. */
- && REGNO_POINTER_ALIGN (ORIGINAL_REGNO (base_prev)) >= 128)
- {
- /* The two stores must be contained within opposite halves of
- the same 16 byte aligned block of memory. We know the
- pointer has suitable alignment, so we just need to check
- the offsets of the two stores for suitable alignment. */
-
- /* Get the smaller offset into OFFSET_PREV. */
- if (INTVAL (offset_prev) > INTVAL (offset_curr))
- std::swap (offset_prev, offset_curr);
-
- /* We have a match if the smaller offset (OFFSET_PREV) is 16
- byte aligned and the higher offset is 8 bytes more than
- the lower offset. */
- if ((INTVAL (offset_prev) % 16) == 0
- && (INTVAL (offset_prev) + 8 == INTVAL (offset_curr)))
- return true;
- }
- }
-
- return false;
-}
-
/* Check for RISCV_FUSE_ALIGNED_STD fusion.
prev (store) == (set (mem (rs1, offset1)) (reg rs2))
curr (store) == (set (mem (rs1, offset2)) (reg rs3))
@@ -850,8 +787,6 @@ static const struct riscv_fusion_entry riscv_fusion_table[]
=
riscv_fuse_lui_ld, "RISCV_FUSE_LUI_LD" },
{ RISCV_FUSE_AUIPC_LD,
riscv_fuse_auipc_ld, "RISCV_FUSE_AUIPC_LD" },
- { RISCV_FUSE_CACHE_ALIGNED_STD,
- riscv_fuse_cache_aligned_std, "RISCV_FUSE_CACHE_ALIGNED_STD" },
{ RISCV_FUSE_ALIGNED_STD,
riscv_fuse_aligned_std, "RISCV_FUSE_ALIGNED_STD" },
{ RISCV_FUSE_BFEXT,
diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index f23aeacf895..e9612cca1a1 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -863,10 +863,9 @@ enum riscv_fusion_pairs
RISCV_FUSE_AUIPC_LD = HOST_WIDE_INT_1U << 7,
RISCV_FUSE_LDPREINCREMENT = HOST_WIDE_INT_1U << 8,
RISCV_FUSE_ALIGNED_STD = HOST_WIDE_INT_1U << 9,
- RISCV_FUSE_CACHE_ALIGNED_STD = HOST_WIDE_INT_1U << 10,
- RISCV_FUSE_BFEXT = HOST_WIDE_INT_1U << 11,
- RISCV_FUSE_EXPANDED_LD = HOST_WIDE_INT_1U << 12,
- RISCV_FUSE_B_ALUI = HOST_WIDE_INT_1U << 13,
+ RISCV_FUSE_BFEXT = HOST_WIDE_INT_1U << 10,
+ RISCV_FUSE_EXPANDED_LD = HOST_WIDE_INT_1U << 11,
+ RISCV_FUSE_B_ALUI = HOST_WIDE_INT_1U << 12,
};
extern bool riscv_macro_fusion_p (void);
diff --git a/gcc/testsuite/gcc.target/riscv/fusion-cache-aligned-std.c
b/gcc/testsuite/gcc.target/riscv/fusion-cache-aligned-std.c
deleted file mode 100644
index 5484e0c0575..00000000000
--- a/gcc/testsuite/gcc.target/riscv/fusion-cache-aligned-std.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Verify RISCV_FUSE_CACHE_ALIGNED_STD correctly matches consecutive
- stores to the same cache line. This exercises the fix for base
- register comparison (changed from != to ==). */
-/* { dg-do compile } */
-/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" "-flto" } } */
-/* { dg-options "-march=rv64gc -mabi=lp64d -mtune=sifive-p600-series
-fdump-rtl-sched1" } */
-/* No upstream mtune currently enables RISCV_FUSE_CACHE_ALIGNED_STD. */
-/* { dg-final { scan-rtl-dump "RISCV_FUSE_CACHE_ALIGNED_STD" "sched1" { xfail
*-*-* } } } */
-
-struct pair
-{
- long a;
- long b;
-} __attribute__ ((aligned (16)));
-
-void
-store_pair (struct pair *p, long x, long y)
-{
- p->a = x;
- p->b = y;
-}
--
2.52.0