From 13f5d5e0828e1c2ccba67f9a5f0f8d50f5b42a77 Mon Sep 17 00:00:00 2001 From: Claudiu Zissulescu Date: Tue, 21 Nov 2017 12:37:42 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/cfgrtl.c | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/arc/loop-5.cpp | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/gcc.target/arc/loop-5.cpp diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fa85726ae7..bc504258dde 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 ae469088eec..d6e5ac05475 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 70926dc1e2e..8d64a22d5c1 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 00000000000..b9b188da61d --- /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; +} -- 2.30.2