Commit 231f7546 by Martin Jambor Committed by Martin Jambor

[PR 91831] Copy PARM_DECLs of artificial thunks

Hi,

I am quite surprised I did not catch this before but the new
ipa-param-manipulation does not copy PARM_DECLs when creating
artificial thinks (I think it originally did but then I somehow
removed during one cleanups).  Fixed by adding the capability at the
natural place.  It is triggered whenever context of the PARM_DECL that
is just taken from the original function does not match the target
fndecl rather than by some constructor parameter because in such
situation it is always the correct thing to do.

Bootstrapped and tested on x86_64-linux.  OK for trunk?

Thanks,

Martin

2019-09-24  Martin Jambor  <mjambor@suse.cz>

	PR ipa/91831
	* ipa-param-manipulation.c (carry_over_param): Make a method of
	ipa_param_body_adjustments, remove now unnecessary argument.  Also copy
	in case of a context mismatch.
	(ipa_param_body_adjustments::common_initialization): Adjust call to
	carry_over_param.
	* ipa-param-manipulation.h (class ipa_param_body_adjustments): Add
	private method carry_over_param.

	testsuite/
	* g++.dg/ipa/pr91831.C: New test.

From-SVN: r276094
parent 5a4d0da4
2019-09-24 Martin Jambor <mjambor@suse.cz> 2019-09-24 Martin Jambor <mjambor@suse.cz>
PR ipa/91831
* ipa-param-manipulation.c (carry_over_param): Make a method of
ipa_param_body_adjustments, remove now unnecessary argument. Also copy
in case of a context mismatch.
(ipa_param_body_adjustments::common_initialization): Adjust call to
carry_over_param.
* ipa-param-manipulation.h (class ipa_param_body_adjustments): Add
private method carry_over_param.
2019-09-24 Martin Jambor <mjambor@suse.cz>
PR ipa/91832 PR ipa/91832
* ipa-sra.c (scan_expr_access): Check that offset is non-negative. * ipa-sra.c (scan_expr_access): Check that offset is non-negative.
......
...@@ -906,18 +906,24 @@ ipa_param_body_adjustments::register_replacement (ipa_adjusted_param *apm, ...@@ -906,18 +906,24 @@ ipa_param_body_adjustments::register_replacement (ipa_adjusted_param *apm,
m_replacements.safe_push (psr); m_replacements.safe_push (psr);
} }
/* Copy or not, as appropriate given ID, a pre-existing PARM_DECL T so that /* Copy or not, as appropriate given m_id and decl context, a pre-existing
it can be included in the parameters of the modified function. */ PARM_DECL T so that it can be included in the parameters of the modified
function. */
static tree tree
carry_over_param (tree t, struct copy_body_data *id) ipa_param_body_adjustments::carry_over_param (tree t)
{ {
tree new_parm; tree new_parm;
if (id) if (m_id)
{ {
new_parm = remap_decl (t, id); new_parm = remap_decl (t, m_id);
if (TREE_CODE (new_parm) != PARM_DECL) if (TREE_CODE (new_parm) != PARM_DECL)
new_parm = id->copy_decl (t, id); new_parm = m_id->copy_decl (t, m_id);
}
else if (DECL_CONTEXT (t) != m_fndecl)
{
new_parm = copy_node (t);
DECL_CONTEXT (new_parm) = m_fndecl;
} }
else else
new_parm = t; new_parm = t;
...@@ -982,7 +988,7 @@ ipa_param_body_adjustments::common_initialization (tree old_fndecl, ...@@ -982,7 +988,7 @@ ipa_param_body_adjustments::common_initialization (tree old_fndecl,
|| apm->prev_clone_adjustment) || apm->prev_clone_adjustment)
{ {
kept[prev_index] = true; kept[prev_index] = true;
new_parm = carry_over_param (m_oparms[prev_index], m_id); new_parm = carry_over_param (m_oparms[prev_index]);
m_new_decls.quick_push (new_parm); m_new_decls.quick_push (new_parm);
} }
else if (apm->op == IPA_PARAM_OP_NEW else if (apm->op == IPA_PARAM_OP_NEW
......
...@@ -370,6 +370,7 @@ public: ...@@ -370,6 +370,7 @@ public:
private: private:
void common_initialization (tree old_fndecl, tree *vars, void common_initialization (tree old_fndecl, tree *vars,
vec<ipa_replace_map *, va_gc> *tree_map); vec<ipa_replace_map *, va_gc> *tree_map);
tree carry_over_param (tree t);
unsigned get_base_index (ipa_adjusted_param *apm); unsigned get_base_index (ipa_adjusted_param *apm);
ipa_param_body_replacement *lookup_replacement_1 (tree base, ipa_param_body_replacement *lookup_replacement_1 (tree base,
unsigned unit_offset); unsigned unit_offset);
......
2019-09-24 Martin Jambor <mjambor@suse.cz> 2019-09-24 Martin Jambor <mjambor@suse.cz>
PR ipa/91831
* g++.dg/ipa/pr91831.C: New test.
2019-09-24 Martin Jambor <mjambor@suse.cz>
PR ipa/91832 PR ipa/91832
* gcc.dg/ipa/pr91832.c: New test. * gcc.dg/ipa/pr91832.c: New test.
......
/* { dg-do compile } */
/* { dg-options "-O2 --param uninlined-thunk-insns=1000" } */
struct A {
virtual void m_fn1();
};
struct B {
virtual void *m_fn2(int, int) = 0;
};
struct C : A, B {
void *m_fn2(int, int) { return this; }
};
void *fn1(B &p1) { return p1.m_fn2(0, 0); }
int main() {
C c;
fn1(c);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment