From: Jakub Jelinek Date: Tue, 30 May 2017 08:20:03 +0000 (+0200) Subject: backport: re PR rtl-optimization/80112 (ICE in doloop_condition_get at loop-doloop... X-Git-Tag: releases/gcc-5.5.0~249 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df974487f892203325685b9e4d566f97db99a322;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/80112 (ICE in doloop_condition_get at loop-doloop.c:158) Backported from mainline 2017-03-24 Jakub Jelinek PR rtl-optimization/80112 * loop-doloop.c (doloop_condition_get): Don't check condition if cmp isn't SET with IF_THEN_ELSE src. * gcc.dg/pr80112.c: New test. From-SVN: r248664 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ec64f66e44d..106c41c05014 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2017-03-24 Jakub Jelinek + + PR rtl-optimization/80112 + * loop-doloop.c (doloop_condition_get): Don't check condition + if cmp isn't SET with IF_THEN_ELSE src. + 2017-03-22 Jakub Jelinek PR c++/80129 diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c index 0b6447adedeb..221939a840ba 100644 --- a/gcc/loop-doloop.c +++ b/gcc/loop-doloop.c @@ -179,10 +179,13 @@ doloop_condition_get (rtx doloop_pat) } else inc = PATTERN (prev_insn); - /* We expect the condition to be of the form (reg != 0) */ - cond = XEXP (SET_SRC (cmp), 0); - if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) - return 0; + if (GET_CODE (cmp) == SET && GET_CODE (SET_SRC (cmp)) == IF_THEN_ELSE) + { + /* We expect the condition to be of the form (reg != 0) */ + cond = XEXP (SET_SRC (cmp), 0); + if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) + return 0; + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d1080804767c..44a06cdd1f9b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2017-03-24 Jakub Jelinek + + PR rtl-optimization/80112 + * gcc.dg/pr80112.c: New test. + 2017-03-22 Jakub Jelinek PR c++/80141 diff --git a/gcc/testsuite/gcc.dg/pr80112.c b/gcc/testsuite/gcc.dg/pr80112.c new file mode 100644 index 000000000000..7c78aaedd981 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr80112.c @@ -0,0 +1,21 @@ +/* PR rtl-optimization/80112 */ +/* { dg-do compile } */ +/* { dg-options "-Os -fmodulo-sched" } */ + +void **a; + +void +foo (int c) +{ + void *d[] = {&&e, &&f}; + a = d; + switch (c) + { + f: + c = 9; + /* FALLTHRU */ + case 9: + goto *a++; + e:; + } +}