public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/guojiufu/heads/guojiufu-branch)] expr: Fix fallout from optimize store_expr from STRING_CST [PR95052]
@ 2020-06-10  3:18 Jiu Fu Guo
  0 siblings, 0 replies; only message in thread
From: Jiu Fu Guo @ 2020-06-10  3:18 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:dc8c02ca1cd18f8c22d70cf17b47125fc25ab243

commit dc8c02ca1cd18f8c22d70cf17b47125fc25ab243
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Sun May 31 10:45:21 2020 +0200

    expr: Fix fallout from optimize store_expr from STRING_CST [PR95052]
    
    > Can't hurt, and debugging the assert tripping is likely a hell of a lot easier
    > than debugging the resultant incorrect code.   So if it passes, then I'd say go
    > for it.
    
    Testing passed, so I've committed it with those asserts (and thankfully I've
    added them!) but it apparently broke Linux kernel build on arm.
    
    The problem is that if the STRING_CST is very short, while the full object
    has BLKmode, the short string could very well have
    QImode/HImode/SImode/DImode and in that case it wouldn't take the path that
    copies the string and then clears the remaining space, but different paths
    in which it will ICE because of those asserts and without those it would
    just emit wrong-code.
    
    The following patch fixes it by enforcing BLKmode for the string MEM, even
    if it is short, so that we copy it and memset the rest.
    
    2020-05-31  Jakub Jelinek  <jakub@redhat.com>
    
            PR middle-end/95052
            * expr.c (store_expr): For shortedned_string_cst, ensure temp has
            BLKmode.
    
            * gcc.dg/pr95052.c: New test.

Diff:
---
 gcc/expr.c                     |  5 +++++
 gcc/testsuite/gcc.dg/pr95052.c | 12 ++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/gcc/expr.c b/gcc/expr.c
index 049d3edf3ad..6b75028e7f1 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -5779,6 +5779,11 @@ store_expr (tree exp, rtx target, int call_param_p,
 			       (call_param_p
 				? EXPAND_STACK_PARM : EXPAND_NORMAL),
 			       &alt_rtl, false);
+      if (shortened_string_cst)
+	{
+	  gcc_assert (MEM_P (temp));
+	  temp = change_address (temp, BLKmode, NULL_RTX);
+	}
     }
 
   /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
diff --git a/gcc/testsuite/gcc.dg/pr95052.c b/gcc/testsuite/gcc.dg/pr95052.c
new file mode 100644
index 00000000000..2ed1a037bce
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95052.c
@@ -0,0 +1,12 @@
+/* PR middle-end/95052 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fconserve-stack" } */
+
+void bar (char *);
+
+void
+foo (void)
+{
+  char buf[70] = "";
+  bar (buf);
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-10  3:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-10  3:18 [gcc(refs/users/guojiufu/heads/guojiufu-branch)] expr: Fix fallout from optimize store_expr from STRING_CST [PR95052] Jiu Fu Guo

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).