diff --git a/gcc/config/aarch64/aarch64-ldp-fusion.cc b/gcc/config/aarch64/aarch64-ldp-fusion.cc index 689a8c884bd..19142153f41 100644 --- a/gcc/config/aarch64/aarch64-ldp-fusion.cc +++ b/gcc/config/aarch64/aarch64-ldp-fusion.cc @@ -2672,7 +2672,15 @@ try_promote_writeback (insn_info *insn) for (unsigned i = 0; i < ARRAY_SIZE (changes); i++) gcc_assert (rtl_ssa::restrict_movement_ignoring (*changes[i], is_changing)); - gcc_assert (rtl_ssa::recog_ignoring (attempt, pair_change, is_changing)); + if (!rtl_ssa::recog_ignoring (attempt, pair_change, is_changing)) + { + if (dump_file) + fprintf (dump_file, "i%d: recog failed on wb pair, bailing out\n", + insn->uid ()); + cancel_changes (0); + return; + } + gcc_assert (crtl->ssa->verify_insn_changes (changes)); confirm_change_group (); crtl->ssa->change_insns (changes); diff --git a/gcc/testsuite/gcc.c-torture/compile/pr113114.c b/gcc/testsuite/gcc.c-torture/compile/pr113114.c new file mode 100644 index 00000000000..978e594eb3d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr113114.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-funroll-loops" } */ +float val[128]; +float x; +void bar() { + int i = 55; + for (; i >= 0; --i) + x += val[i]; +} diff --git a/gcc/testsuite/gcc.target/aarch64/pr113114.c b/gcc/testsuite/gcc.target/aarch64/pr113114.c new file mode 100644 index 00000000000..5b0383c2435 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr113114.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-mabi=ilp32 -O -mearly-ldp-fusion -mlate-ldp-fusion" } */ +void foo_n(double *a) { + int i = 1; + for (; i < (int)foo_n; i++) + a[i] = a[i - 1] + a[i + 1] * a[i]; +}