* [PR rtl-optimization/91173] Backport to GCC 8 and 9
@ 2019-07-23 14:06 Matthew Beliveau
0 siblings, 0 replies; only message in thread
From: Matthew Beliveau @ 2019-07-23 14:06 UTC (permalink / raw)
To: gcc-patches, Marek Polacek, Jason Merrill
[-- Attachment #1: Type: text/plain, Size: 23 bytes --]
Tested on GCC 8 and 9.
[-- Attachment #2: pr91173-backport.patch --]
[-- Type: text/x-patch, Size: 2360 bytes --]
Bootstrapped/regtested on x86_64-linux, ok for trunk?
2019-07-23 Matthew Beliveau <mbelivea@redhat.com>
Backported from mainline
2019-07-16 Jeff Law <law@redhat.com>
PR rtl-optimization/91173
* tree-ssa-address.c (addr_for_mem_ref): If the base is an
SSA_NAME with a constant value, fold its value into the offset
and clear the base before calling gen_addr_rtx.
* g++.dg/pr91173.C: New test.
diff --git gcc/testsuite/g++.dg/pr91173.C gcc/testsuite/g++.dg/pr91173.C
new file mode 100644
index 00000000000..b8fb41ba0cd
--- /dev/null
+++ gcc/testsuite/g++.dg/pr91173.C
@@ -0,0 +1,45 @@
+class a {
+ int b;
+ void *c;
+
+public:
+ bool aa();
+ int &ab() {
+ if (aa()) {
+ void *d(c);
+ return static_cast<int *>(d)[b];
+ }
+ return *(int *)0;
+ }
+};
+typedef enum {E} e;
+class f : public a {
+ int g;
+
+public:
+ int ac() {
+ if (g)
+ return 1;
+ return ac();
+ }
+};
+int *ad;
+struct h {
+ static int ae(e, int *m) {
+ f ag;
+ int *ah;
+ while (!0) {
+ ad = &ag.ab();
+ ah = ad + ag.ac();
+ while (ad < ah)
+ *m = *ad++;
+ }
+ }
+};
+template <class, class>
+void i(int *, int *, int, int *, e n, int *o) {
+ h::ae(n, o);
+}
+int aq, ar, as, at, au;
+void aw() { i<int, bool>(&aq, &ar, as, &at, (e)0, &au); }
+
diff --git gcc/tree-ssa-address.c gcc/tree-ssa-address.c
index 1c17e935914..2e5d87734d6 100644
--- gcc/tree-ssa-address.c
+++ gcc/tree-ssa-address.c
@@ -259,6 +259,20 @@ addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
? expand_expr (addr->index, NULL_RTX, pointer_mode, EXPAND_NORMAL)
: NULL_RTX);
+ /* addr->base could be an SSA_NAME that was set to a constant value. The
+ call to expand_expr may expose that constant. If so, fold the value
+ into OFF and clear BSE. Otherwise we may later try to pull a mode from
+ BSE to generate a REG, which won't work with constants because they
+ are modeless. */
+ if (bse && GET_CODE (bse) == CONST_INT)
+ {
+ if (off)
+ off = simplify_gen_binary (PLUS, pointer_mode, bse, off);
+ else
+ off = bse;
+ gcc_assert (GET_CODE (off) == CONST_INT);
+ bse = NULL_RTX;
+ }
gen_addr_rtx (pointer_mode, sym, bse, idx, st, off, &address, NULL, NULL);
if (pointer_mode != address_mode)
address = convert_memory_address (address_mode, address);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-07-23 14:03 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-23 14:06 [PR rtl-optimization/91173] Backport to GCC 8 and 9 Matthew Beliveau
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).