public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-326] ipa/109652 - ICE in modification phase of IPA SRA
@ 2023-04-28 11:36 Richard Biener
0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-04-28 11:36 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:a94dcac59ee4c99b523ae593cb1c0ad43d4a110b
commit r14-326-ga94dcac59ee4c99b523ae593cb1c0ad43d4a110b
Author: Richard Biener <rguenther@suse.de>
Date: Fri Apr 28 08:40:07 2023 +0200
ipa/109652 - ICE in modification phase of IPA SRA
There's another questionable IL transform by IPA SRA, replacing
foo (p_1(D)->x) with foo (VIEW_CONVERT <union type> (ISRA.PARM.1))
where ISRA.PARM.1 is a register. Conversion of a register to
an aggregate type is questionable but not entirely unreasonable
and not within the set of IL I am rejecting when fixing PR109644.
The following lets this slip through in IPA SRA transform by
restricting re-gimplification to the case of register type
results. To not break the previous testcase again we need to
optimize the BIT_FIELD_REF <VIEW_CONVERT <...>, ...> case
to elide the conversion.
PR ipa/109652
* ipa-param-manipulation.cc
(ipa_param_body_adjustments::modify_expression): Allow
conversion of a register to a non-register type. Elide
conversions inside BIT_FIELD_REFs.
* gcc.dg/torture/pr109652.c: New testcase.
Diff:
---
gcc/ipa-param-manipulation.cc | 7 ++++--
gcc/testsuite/gcc.dg/torture/pr109652.c | 40 +++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/gcc/ipa-param-manipulation.cc b/gcc/ipa-param-manipulation.cc
index 33dcab9c33c..a286af7f5d9 100644
--- a/gcc/ipa-param-manipulation.cc
+++ b/gcc/ipa-param-manipulation.cc
@@ -1836,9 +1836,11 @@ ipa_param_body_adjustments::modify_expression (tree *expr_p, bool convert,
|| TREE_CODE (expr) == IMAGPART_EXPR
|| TREE_CODE (expr) == REALPART_EXPR)
{
+ /* For a BIT_FIELD_REF do not bother to VIEW_CONVERT the base,
+ instead reference the replacement directly. */
+ convert = TREE_CODE (expr) != BIT_FIELD_REF;
expr_p = &TREE_OPERAND (expr, 0);
expr = *expr_p;
- convert = true;
}
ipa_param_body_replacement *pbr = get_expr_replacement (expr, false);
@@ -1861,7 +1863,8 @@ ipa_param_body_adjustments::modify_expression (tree *expr_p, bool convert,
gcc_checking_assert (tree_to_shwi (TYPE_SIZE (TREE_TYPE (expr)))
== tree_to_shwi (TYPE_SIZE (TREE_TYPE (repl))));
tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (expr), repl);
- if (is_gimple_reg (repl))
+ if (is_gimple_reg (repl)
+ && is_gimple_reg_type (TREE_TYPE (expr)))
{
gcc_assert (extra_stmts);
vce = force_gimple_operand (vce, extra_stmts, true, NULL_TREE);
diff --git a/gcc/testsuite/gcc.dg/torture/pr109652.c b/gcc/testsuite/gcc.dg/torture/pr109652.c
new file mode 100644
index 00000000000..8a6524d2212
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr109652.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+
+typedef int UInt;
+UInt skeletal_RI5_instr;
+__attribute__((__noreturn__)) void vex_assert_fail();
+typedef struct {
+ union {
+ struct {
+ UInt imm5;
+ } I5;
+ } ARMri5;
+} ARMRI5;
+typedef enum { ARMin_Alu, ARMin_Shift } ARMInstrTag;
+void iregEnc();
+static UInt skeletal_RI5(ARMRI5 *ri) {
+ UInt imm5 = ri->ARMri5.I5.imm5;
+ __builtin_expect(imm5, 1) ?: vex_assert_fail();
+ iregEnc(ri->ARMri5);
+ return skeletal_RI5_instr;
+}
+ARMInstrTag emit_ARMInstr_i_0;
+void *emit_ARMInstr_disp_cp_chain_me_to_slowEP() {
+ switch (emit_ARMInstr_i_0) {
+ case ARMin_Alu:
+ UInt instr, subopc;
+ UInt rD, rN;
+ goto bad;
+ instr |= subopc | rN;
+ case ARMin_Shift:
+ rD = 0;
+ UInt rM = 0;
+ ARMRI5 argR;
+ instr = skeletal_RI5(&argR);
+ instr |= rD | rM;
+ goto done;
+ }
+bad:
+done:
+ return 0;
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-04-28 11:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-28 11:36 [gcc r14-326] ipa/109652 - ICE in modification phase of IPA SRA Richard Biener
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).