middle-end/95690 - avoid MEM_EXPRs for constants
authorRichard Biener <rguenther@suse.de>
Tue, 16 Jun 2020 07:36:09 +0000 (09:36 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 16 Jun 2020 11:56:55 +0000 (13:56 +0200)
The following avoids calling set_mem_attributes on the
DECL_INITIAL of a CONST_DECL which seems pointless since there
cannot be a sensible MEM_EXPR derived from that.  We're overwriting
both other possibly useful info, alias-set and alignment immediately
so the following patch simply removes the call instead of making
the function deal with even more (unexpected) trees that are not
memory accesses.

2020-06-16  Richard Biener  <rguenther@suse.de>

PR middle-end/95690
* varasm.c (build_constant_desc): Remove set_mem_attributes call.

* gfortran.dg/pr95690.f90: New testcase.

gcc/testsuite/gfortran.dg/pr95690.f90 [new file with mode: 0644]
gcc/varasm.c

diff --git a/gcc/testsuite/gfortran.dg/pr95690.f90 b/gcc/testsuite/gfortran.dg/pr95690.f90
new file mode 100644 (file)
index 0000000..2da0891
--- /dev/null
@@ -0,0 +1,9 @@
+! { dg-do compile }
+module m
+contains
+   subroutine s
+      print *, (erfc) ! { dg-error "not a floating constant" }
+   end
+   function erfc()
+   end
+end
index f062e48071fefb82e0603a2f74b7fc89cbe96350..4070f9c17e848c18854b8867750dd441494c2f7f 100644 (file)
@@ -3399,7 +3399,6 @@ build_constant_desc (tree exp)
   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
 
   rtl = gen_const_mem (TYPE_MODE (TREE_TYPE (exp)), symbol);
-  set_mem_attributes (rtl, exp, 1);
   set_mem_alias_set (rtl, 0);
 
   /* Putting EXP into the literal pool might have imposed a different