The riscv_fusion_pairs enum and the fusible_ops tune field use
unsigned int, leaving only 18 bits for new fusion types. Widen
them to unsigned HOST_WIDE_INT so that future CPUs can define
more than 32 fusion pairs without overflow.
gcc/ChangeLog:
* config/riscv/riscv-protos.h (enum riscv_fusion_pairs): Use
HOST_WIDE_INT_1U for bit masks.
(riscv_get_fusible_ops): Return unsigned HOST_WIDE_INT.
* config/riscv/riscv.cc (struct riscv_tune_param): Change
fusible_ops to unsigned HOST_WIDE_INT.
(riscv_get_fusible_ops): Likewise.
---
gcc/config/riscv/riscv-protos.h | 30 +++++++++++++++---------------
gcc/config/riscv/riscv.cc | 4 ++--
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index 3843110ab6c..f23aeacf895 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -853,25 +853,25 @@ extern bool riscv_expand_strlen (rtx, rtx, rtx, rtx);
enum riscv_fusion_pairs
{
RISCV_FUSE_NOTHING = 0,
- RISCV_FUSE_ZEXTW = (1 << 0),
- RISCV_FUSE_ZEXTH = (1 << 1),
- RISCV_FUSE_ZEXTWS = (1 << 2),
- RISCV_FUSE_LDINDEXED = (1 << 3),
- RISCV_FUSE_LUI_ADDI = (1 << 4),
- RISCV_FUSE_AUIPC_ADDI = (1 << 5),
- RISCV_FUSE_LUI_LD = (1 << 6),
- RISCV_FUSE_AUIPC_LD = (1 << 7),
- RISCV_FUSE_LDPREINCREMENT = (1 << 8),
- RISCV_FUSE_ALIGNED_STD = (1 << 9),
- RISCV_FUSE_CACHE_ALIGNED_STD = (1 << 10),
- RISCV_FUSE_BFEXT = (1 << 11),
- RISCV_FUSE_EXPANDED_LD = (1 << 12),
- RISCV_FUSE_B_ALUI = (1 << 13),
+ RISCV_FUSE_ZEXTW = HOST_WIDE_INT_1U << 0,
+ RISCV_FUSE_ZEXTH = HOST_WIDE_INT_1U << 1,
+ RISCV_FUSE_ZEXTWS = HOST_WIDE_INT_1U << 2,
+ RISCV_FUSE_LDINDEXED = HOST_WIDE_INT_1U << 3,
+ RISCV_FUSE_LUI_ADDI = HOST_WIDE_INT_1U << 4,
+ RISCV_FUSE_AUIPC_ADDI = HOST_WIDE_INT_1U << 5,
+ RISCV_FUSE_LUI_LD = HOST_WIDE_INT_1U << 6,
+ 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,
};
extern bool riscv_macro_fusion_p (void);
extern bool riscv_macro_fusion_pair_p (rtx_insn *, rtx_insn *);
-extern unsigned int riscv_get_fusible_ops (void);
+extern unsigned HOST_WIDE_INT riscv_get_fusible_ops (void);
/* Routines implemented in thead.cc. */
extern bool extract_base_offset_in_addr (rtx, rtx *, rtx *);
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 57e798556d0..8f18a60b7c7 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -294,7 +294,7 @@ struct riscv_tune_param
bool overlap_op_by_pieces;
bool use_zero_stride_load;
bool speculative_sched_vsetvl;
- unsigned int fusible_ops;
+ unsigned HOST_WIDE_INT fusible_ops;
const struct cpu_vector_cost *vec_costs;
const char *function_align;
const char *jump_align;
@@ -11590,7 +11590,7 @@ riscv_sched_reorder (FILE *, int, rtx_insn **ready, int
*nreadyp, int)
/* Return the set of fusible operations for the current tune. */
-unsigned int
+unsigned HOST_WIDE_INT
riscv_get_fusible_ops (void)
{
return tune_param->fusible_ops;
--
2.52.0