From: Claudiu Zissulescu Date: Tue, 21 Nov 2017 11:37:42 +0000 (+0100) Subject: Don't split call from its call arg location. X-Git-Tag: basepoints/gcc-9~3170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13f5d5e0828e1c2ccba67f9a5f0f8d50f5b42a77;p=thirdparty%2Fgcc.git Don't split call from its call arg location. gcc/ 2017-11-21 Claudiu Zissulescu * cfgrtl.c (force_nonfallthru_and_redirect): Don't split a call and its corresponding call arg location note. testsuite/ 2017-11-21 Claudiu Zissulescu * gcc.target/arc/loop-5.cpp: New test. From-SVN: r254998 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fa85726ae76..bc504258ddea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-11-21 Claudiu Zissulescu + + * cfgrtl.c (force_nonfallthru_and_redirect): Don't split a call + and its corresponding call arg location note. + 2017-11-21 Claudiu Zissulescu Andrew Burgess diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index ae469088eecb..d6e5ac05475d 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1626,6 +1626,11 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label) else new_head = BB_END (e->src); new_head = NEXT_INSN (new_head); + /* Make sure we don't split a call and its corresponding + CALL_ARG_LOCATION note. */ + if (new_head && NOTE_P (new_head) + && NOTE_KIND (new_head) == NOTE_INSN_CALL_ARG_LOCATION) + new_head = NEXT_INSN (new_head); jump_block = create_basic_block (new_head, NULL, e->src); jump_block->count = count; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 70926dc1e2ea..8d64a22d5c1c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-11-21 Claudiu Zissulescu + + * gcc.target/arc/loop-5.cpp: New test. + 2017-11-21 Jakub Jelinek PR tree-optimization/83047 diff --git a/gcc/testsuite/gcc.target/arc/loop-5.cpp b/gcc/testsuite/gcc.target/arc/loop-5.cpp new file mode 100644 index 000000000000..b9b188da61d3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/loop-5.cpp @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -g" } */ + +/* Check if gcc splits a call from its CALL_ARG_LOCATION note. If so, + we get an ICE in dwarf2out_var_location. */ + +typedef void Trans_NS_std_new_handler(); +void *operator new(unsigned) +{ + void *p; + while (__builtin_expect(p == 0, false)) + { + Trans_NS_std_new_handler handler; + try { + handler(); + } catch (int) { + } + } + return (void*) 0xdead; +}