When putting a constant into the constant pool, we make a copy of the
tree in build_constant_desc. This caused me some problems with the ptx
backend, which has a pass to modify the address spaces of all variables
and constants to match the requirements of the backend. It would be nice
for it to be able to find them all by walking the varpool and the gimple
of all functions, and I ran into some testcases where these copies can
slip through.
After a while it occurred to me that the copy is probably a relic of old
obstack times and not necessary anymore. And indeed, in 2.7.2.3 the only
call to it looked like this:
push_obstacks_nochange ();
suspend_momentary ();
p->exp = copy_constant (exp);
pop_obstacks ();
It seems unlikely that anything in the compiler would want to modify a
constant after it has been put into the constant pool, and even if so,
it should have the responsibility of making the copy itself. So, as an
experiment I've bootstrapped and tested the following patch
(x86_64-linux), and that seemed to work. Ok to apply along with removal
of the now unused copy_constant?
Bernd
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 6781096..3469384 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -3205,7 +3205,7 @@ build_constant_desc (tree exp)
tree decl;
desc = ggc_alloc<constant_descriptor_tree> ();
- desc->value = copy_constant (exp);
+ desc->value = exp;
/* Create a string containing the label name, in LABEL. */
labelno = const_labelno++;