From 7a76df7f955128bb5c70d67bf428b8996ad48d42 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 27 Feb 2014 12:28:40 -0700 Subject: [PATCH] re PR rtl-optimization/52714 (ICE in fixup_reorder_chain, at cfglayout.c:880) PR rtl-optimization/52714 * combine.c (try_combine): When splitting an unrecognized PARALLEL into two independent simple sets, if I3 is a jump, ensure the pattern we place into I3 is a (set (pc) ...) PR rtl-optimization/52714 * gcc.c-torture/compile/pr52714.c: New test. From-SVN: r208204 --- gcc/ChangeLog | 7 +++++++ gcc/combine.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr52714.c | 25 +++++++++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr52714.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a20cee3..16c499b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-02-27 Jeff Law + + PR rtl-optimization/52714 + * combine.c (try_combine): When splitting an unrecognized PARALLEL + into two independent simple sets, if I3 is a jump, ensure the + pattern we place into I3 is a (set (pc) ...) + 2014-02-27 Mikael Pettersson Jeff Law diff --git a/gcc/combine.c b/gcc/combine.c index 1b598b4..fc473b6 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3712,6 +3712,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, #ifdef HAVE_cc0 && !reg_referenced_p (cc0_rtx, set0) #endif + /* If I3 is a jump, ensure that set0 is a jump so that + we do not create invalid RTL. */ + && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx) ) { newi2pat = set1; @@ -3726,6 +3729,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, #ifdef HAVE_cc0 && !reg_referenced_p (cc0_rtx, set1) #endif + /* If I3 is a jump, ensure that set1 is a jump so that + we do not create invalid RTL. */ + && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx) ) { newi2pat = set0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be4cb12..b95bcfd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-27 Jeff Law + + PR rtl-optimization/52714 + * gcc.c-torture/compile/pr52714.c: New test. + 2014-02-27 Mikael Pettersson Jeff Law diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52714.c b/gcc/testsuite/gcc.c-torture/compile/pr52714.c new file mode 100644 index 0000000..03d4990 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr52714.c @@ -0,0 +1,25 @@ + +int __re_compile_fastmap(unsigned char *p) +{ + unsigned char **stack; + unsigned size; + unsigned avail; + + stack = __builtin_alloca(5 * sizeof(unsigned char*)); + if (stack == 0) + return -2; + size = 5; + avail = 0; + + for (;;) { + switch (*p++) { + case 0: + if (avail == size) + return -2; + stack[avail++] = p; + } + } + + return 0; +} + -- 2.7.4