On 26/09/14 09:36, Richard Biener wrote:
On Fri, Sep 26, 2014 at 12:49 AM, Jiong Wang
<wong.kwongyuan.to...@gmail.com> wrote:
2014-09-25 14:07 GMT+01:00 Jiong Wang <jiong.w...@arm.com>:
On 25/09/14 12:25, Christophe Lyon wrote:
I have observed regressions in the g++ testsuite: pr49847 now FAILs
after this patch.
no.
even without my patch, the regression still happen.
or you could specify -fno-shrink-wrap, gcc still crash.
so, this regression should caused by other commits which haven't exposed on
x86 regression test.
sorry, confirmed, there is regression.
my code was git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215590.
there also be gcc crash on aarch64, with the following info,
pr49847.C:5:21: internal compiler error: Segmentation fault
try { return g >= 0; }
^
0xdc249e crash_signal
../../gcc/gcc/toplev.c:340
0xdbfeff default_get_reg_raw_mode(int)
so I was thinking it's caused by other commits instead of this, and after I sync
code to git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215599 I could
reproduce this bug.
error: missing REG_EH_REGION note at the end of bb 2
the reson is:
* before this patch, we only sink simple "set reg, reg" instruction which
the corresponding instruction will not produce exception, thus no
REG_EH_REGION attached.
* after this patch, we will sink instruction like the following for
aarch64 or arm or other RISC.
(insn 7 3 30 2 (set (reg:CCFPE 66 cc)
(compare:CCFPE (reg:SF 32 v0 [ g ])
(const_double:SF 0.0 [0x0.0p+0]))) pr49847.C:5 330 {*cmpesf}
(expr_list:REG_DEAD (reg:SF 32 v0 [ g ])
(expr_list:REG_EH_REGION (const_int 1 [0x1])
(nil))))
"compare" is actually a operator which may cause trap and we need to prevent
any instruction which may causing trap be sink, because that may
break exception handling logic
so something like the following should be added to the iterator check
if (may_trap_p (x))
don't sink this instruction.
any comments?
Should be checking if x may throw internally instead.
Richard, thanks for the suggestion, have used insn_could_throw_p to do the
check,
which will only do the check when flag_exception and flag_non_call_exception be
true,
so those instruction could still be sink for normal c/c++ program.
Jeff,
below is the fix for pr49847.C regression on aarch64. I re-run full test on
aarch64-none-elf bare metal, no regression.
bootstrap ok on x86, no regression on check-gcc/g++.
ok for trunk?
-- Jiong
Richard.
I will try to send a fix tomorrow.
thanks.
-- Jiong
-- Jiong
Here is what I have in my logs:
/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/gcc/testsuite/g++/../../xg++
-B/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/gcc/testsuite/g++/../../
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/g++.dg/pr49847.C
-fno-diagnostics-show-caret -fdiagnostics-color=never -nostdinc++
-I/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/arm-none-linux-gnueabihf/libstdc++-v3/include/arm-none-linux-gnueabihf
-I/aci-gcc-fsf/builds/gcc-fsf-gccsrc/obj-arm-none-linux-gnueabihf/gcc3/arm-none-linux-gnueabihf/libstdc++-v3/include
-I/aci-gcc-fsf/sources/gcc-fsf/gccsrc/libstdc++-v3/libsupc++
-I/aci-gcc-fsf/sources/gcc-fsf/gccsrc/libstdc++-v3/include/backward
-I/aci-gcc-fsf/sources/gcc-fsf/gccsrc/libstdc++-v3/testsuite/util
-fmessage-length=0 -std=gnu++98 -O -fnon-call-exceptions -S -o
pr49847.s (timeout = 800)
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/g++.dg/pr49847.C: In
function 'int f(float)':
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/g++.dg/pr49847.C:7:1:
error: missing REG_EH_REGION note at the end of bb 2
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/g++.dg/pr49847.C:7:1:
internal compiler error: verify_flow_info failed
0x82f8ba verify_flow_info()
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfghooks.c:260
0x840cd3 commit_edge_insertions()
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfgrtl.c:2068
0x9bf243 thread_prologue_and_epilogue_insns
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/function.c:5852
0x9bfa52 rest_of_handle_thread_prologue_and_epilogue
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/function.c:6245
0x9bfa52 execute
/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/function.c:6283
As per
http://cbuild.validation.linaro.org/build/cross-validation/gcc/trunk/215563/report-build-info.html
I've noticed this on targets:
arm-none-linux-gnueabihf
armeb-none-linux-gnueabihf
aarch64-none-elf
aarch64_be-none-elf
aarch64-none-linux-gnu
but NOT on
arm-none-eabi
arm-none-linux-gnueabi
Christophe.
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
index bd4813c..2e2f0a6 100644
--- a/gcc/shrink-wrap.c
+++ b/gcc/shrink-wrap.c
@@ -189,6 +189,9 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
unsigned int nonconstobj_num = 0;
rtx src_inner = NULL_RTX;
+ if (insn_could_throw_p (insn))
+ return false;
+
subrtx_var_iterator::array_type array;
FOR_EACH_SUBRTX_VAR (iter, array, src, ALL)
{