Commit b7aa4a3a by Jan Hubicka Committed by Jan Hubicka

re PR ipa/65236 (IPA ICF causes miscompilation in Chromium built with -Os)


	PR ipa/65236
	* g++.dg/ipa/ipa-icf-6.C: New testcase.
	* cgraphunit.c (cgraph_node::expand_thunk): Enable return slot
	opt.

From-SVN: r221077
parent f083b434
2015-02-28 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65236
* cgraphunit.c (cgraph_node::expand_thunk): Enable return slot
opt.
2015-02-28 Xingxing Pan <xxingpan@marvell.com> 2015-02-28 Xingxing Pan <xxingpan@marvell.com>
* config/aarch64/aarch64.md: (mov<mode>_aarch64): Change type * config/aarch64/aarch64.md: (mov<mode>_aarch64): Change type
......
...@@ -1680,6 +1680,14 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk) ...@@ -1680,6 +1680,14 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
callees->call_stmt = call; callees->call_stmt = call;
gimple_call_set_from_thunk (call, true); gimple_call_set_from_thunk (call, true);
gimple_call_set_with_bounds (call, instrumentation_clone); gimple_call_set_with_bounds (call, instrumentation_clone);
/* Return slot optimization is always possible and in fact requred to
return values with DECL_BY_REFERENCE. */
if (aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl))
&& (!is_gimple_reg_type (TREE_TYPE (resdecl))
|| DECL_BY_REFERENCE (resdecl)))
gimple_call_set_return_slot_opt (call, true);
if (restmp && !alias_is_noreturn) if (restmp && !alias_is_noreturn)
{ {
gimple_call_set_lhs (call, restmp); gimple_call_set_lhs (call, restmp);
......
2015-02-28 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65236
* g++.dg/ipa/ipa-icf-6.C: New testcase.
2015-02-27 Pat Haugen <pthaugen@us.ibm.com> 2015-02-27 Pat Haugen <pthaugen@us.ibm.com>
* gcc.dg/vect/pr59354.c: Move vector producing code to separate function. * gcc.dg/vect/pr59354.c: Move vector producing code to separate function.
......
/* { dg-do run } */
/* { dg-options "-O3 -fdump-ipa-icf" } */
struct A {
A() {ptr=&b;}
A(const A &a) {ptr = &b;}
void test() { if (ptr != &b) __builtin_abort ();}
int b;
int *ptr;
};
A test1(A a)
{
a.test();
return a;
}
A test2(A a)
{
a.test();
return a;
}
__attribute__ ((noinline))
static void
test_me (A (*t)(A))
{
struct A a, b=t(a);
b.test ();
}
int
main()
{
test_me (test1);
test_me (test2);
return 0;
}
/* { dg-final { scan-ipa-dump-times "Unified; Wrapper has been created" 1 "icf" } } */
/* { dg-final { cleanup-ipa-dump "icf" } } */
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