[gcc r11-9582] middle-end/100786 - constant folding from incompatible alias

Richard Biener rguenth@gcc.gnu.org
Thu Feb 17 09:06:32 GMT 2022


https://gcc.gnu.org/g:6525b9fb23ec442f32b1809a2b44c415c0910387

commit r11-9582-g6525b9fb23ec442f32b1809a2b44c415c0910387
Author: Richard Biener <rguenther@suse.de>
Date:   Thu Jan 20 14:25:51 2022 +0100

    middle-end/100786 - constant folding from incompatible alias
    
    The following avoids us ICEing doing constant folding from variables
    with aliases of different types.  The issue appears both in
    folding and CCP and FRE can do more fancy stuff to still constant
    fold cases where the load is smaller than the initializer so
    defer it to there.
    
    2022-01-20  Richard Biener  <rguenther@suse.de>
    
            PR middle-end/100786
            * gimple-fold.c (get_symbol_constant_value): Only return
            values of compatible type to the symbol.
    
            * gcc.dg/torture/pr100786.c: New testcase.
    
    (cherry picked from commit 5c12507f5d0bc080e4f346af99824e039236e61c)

Diff:
---
 gcc/gimple-fold.c                       | 4 +++-
 gcc/testsuite/gcc.dg/torture/pr100786.c | 9 +++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 0581338ea5f..0308f098e18 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -285,7 +285,9 @@ get_symbol_constant_value (tree sym)
       if (val)
 	{
 	  val = canonicalize_constructor_val (unshare_expr (val), sym);
-	  if (val && is_gimple_min_invariant (val))
+	  if (val
+	      && is_gimple_min_invariant (val)
+	      && useless_type_conversion_p (TREE_TYPE (sym), TREE_TYPE (val)))
 	    return val;
 	  else
 	    return NULL_TREE;
diff --git a/gcc/testsuite/gcc.dg/torture/pr100786.c b/gcc/testsuite/gcc.dg/torture/pr100786.c
new file mode 100644
index 00000000000..42f4e485593
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr100786.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+const double a = 0;
+extern int b __attribute__((alias("a")));
+void inc() { b++; }
+
+const int a2 = 0;
+extern double b2 __attribute__((alias("a2")));
+void inc2() { b2+=1; }


More information about the Gcc-cvs mailing list