[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