public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] simplify-rtx: Add missing capability constant handling
@ 2022-11-22 22:18 Alex Coplan
0 siblings, 0 replies; only message in thread
From: Alex Coplan @ 2022-11-22 22:18 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:848b7db3d863416fdc787bc60631c5c80ede7ab4
commit 848b7db3d863416fdc787bc60631c5c80ede7ab4
Author: Alex Coplan <alex.coplan@arm.com>
Date: Sun Nov 20 11:22:13 2022 +0000
simplify-rtx: Add missing capability constant handling
A recent change to allow uses of INTCAP_TYPE C++ non-volatile const variable
declarations in constexpr context revealed a latent problem in the form of an
ICE in aarch64_asm_output_capability, triggered by the testcase
g++.dg/cpp0x/pr88410.C.
Here we ICE on the following rtx:
(replace_address_value:CADI
(const:CADI
(pointer_plus:CADI
(const_null:CADI) (const_int 36)))
(plus:DI
(subreg:DI
(const:CADI
(pointer_plus:CADI
(const_null:CADI) (const_int 36))) 0)
(const_int -32)))
This shows that we are missing two RTL simplifications. Firstly, the subreg
should be folded away: it should simplify to just (const_int 36).
This would allow us to simplify the plus rtx to (const_int 4). The second
missing simplification is that the replace_address_value should fold away to
just:
(replace_address_value:CADI (const_null:CADI) (const_int 4))
which then gets canonicalized to:
(const:CADI
(pointer_plus:CADI
(const_null:CADI) (const_int 4)))
We note that simplify_subreg already handles taking the
noncapability-mode lowpart subreg of CONST_NULL rtxes, but doesn't have
any handling for taking such a subreg of non-zero capability constants.
We add this handling to simplify_subreg.
For the replace_address_value case, it looks like we already implement
the appropriate simplification rule, namely:
(replace_address_value:CM (X:M B CV1) CV2)
--> (replace_address_value:CM B CV2)
for any capability code X, provided CV1 is free of side effects. So this
already works for e.g.:
(replace_address_value:CADI
(pointer_plus:CADI
(const_null:CADI) (const_int 36))
(const_int 4))
but we don't currently handle the possibility of a CONST rtx wrapping
the pointer_plus node, as generated by (e.g.) plus_constant. Thus, we
teach simplify_binary_operation_1 to look through CONST rtxes in the
implementation of the above rule.
We further extend the simplify-rtx selftests to check we now correctly
handle these cases.
Diff:
---
gcc/simplify-rtx.c | 64 +++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 47 insertions(+), 17 deletions(-)
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 0417149a42a..18f259e73b7 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -4450,13 +4450,18 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
if (GET_CODE (op0) == CONST_NULL)
return simplify_gen_binary (POINTER_PLUS, mode, op0, op1);
- else if (GET_CODE (op0) == REPLACE_ADDRESS_VALUE
- || GET_CODE (op0) == POINTER_PLUS
- || GET_CODE (op0) == ALIGN_ADDRESS_DOWN)
+
+ rtx x = op0;
+ if (GET_CODE (x) == CONST)
+ x = XEXP (x, 0);
+
+ if (GET_CODE (x) == REPLACE_ADDRESS_VALUE
+ || GET_CODE (x) == POINTER_PLUS
+ || GET_CODE (x) == ALIGN_ADDRESS_DOWN)
{
- if (!side_effects_p (XEXP (op0, 1)))
+ if (!side_effects_p (XEXP (x, 1)))
return simplify_gen_binary (REPLACE_ADDRESS_VALUE, mode,
- XEXP (op0, 0), op1);
+ XEXP (x, 0), op1);
}
if (GET_CODE (op1) == AND
@@ -7120,13 +7125,23 @@ simplify_subreg (machine_mode outermode, rtx op,
if (GET_CODE (op) == CONST_VECTOR)
byte = simplify_const_vector_byte_offset (op, byte);
- if (CONST_NULL_P (op))
+ unsigned HOST_WIDE_INT cbyte;
+ if (byte.is_constant (&cbyte)
+ && known_eq (cbyte, subreg_lowpart_offset (outermode, innermode))
+ && noncapability_mode (innermode) == outermode)
{
- unsigned HOST_WIDE_INT cbyte;
- if (byte.is_constant (&cbyte)
- && known_eq (cbyte, subreg_lowpart_offset (outermode, innermode))
- && noncapability_mode (innermode) == outermode)
+ if (CONST_NULL_P (op))
return gen_int_mode (0, outermode);
+
+ rtx x = op;
+ if (GET_CODE (x) == CONST)
+ x = XEXP (x, 0);
+
+ /* For a capability mode C and its non-capability mode NC:
+ (subreg:NC (pointer_plus:C (const_null:C) (X:NC)))
+ --> (X:NC). */
+ if (POINTER_PLUS_P (x) && XEXP (x, 0) == CONST0_RTX (innermode))
+ return XEXP (x, 1);
}
if (multiple_p (byte, GET_MODE_UNIT_SIZE (innermode)))
@@ -8388,13 +8403,28 @@ test_align_address_down_simplifications ()
}
static void
-test_const_null_subreg ()
+test_cap_const_simplifications ()
{
- rtx inner = CONST0_RTX (CADImode);
- rtx di_zero = CONST0_RTX (DImode);
- ASSERT_EQ (simplify_subreg (DImode, inner, CADImode,
- subreg_lowpart_offset (DImode, CADImode)),
- di_zero);}
+ machine_mode cm = CADImode;
+ machine_mode om = DImode;
+
+ rtx const_null = CONST0_RTX (cm);
+ rtx di_zero = CONST0_RTX (om);
+ ASSERT_EQ (simplify_subreg (DImode, const_null, cm,
+ subreg_lowpart_offset (om, cm)),
+ di_zero);
+
+ rtx int42 = gen_int_mode (42, om);
+ rtx cap42 = plus_constant (cm, const_null, 42);
+ ASSERT_RTX_EQ (simplify_subreg (DImode, cap42, cm,
+ subreg_lowpart_offset (om, cm)),
+ int42);
+
+ rtx replaced = simplify_gen_binary (REPLACE_ADDRESS_VALUE, cm,
+ plus_constant (cm, const_null, 4),
+ int42);
+ ASSERT_RTX_EQ (replaced, cap42);
+}
static void
test_capability_simplifications ()
@@ -8403,7 +8433,7 @@ test_capability_simplifications ()
test_pointer_plus_simplifications ();
test_replace_address_value_simplifications ();
test_align_address_down_simplifications ();
- test_const_null_subreg ();
+ test_cap_const_simplifications ();
}
/* Run all of the selftests within this file. */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-11-22 22:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-22 22:18 [gcc(refs/vendors/ARM/heads/morello)] simplify-rtx: Add missing capability constant handling Alex Coplan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).