diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 113328cc828..814b7845f6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-02-13 Jakub Jelinek + + PR rtl-optimization/79388 + PR rtl-optimization/79450 + * combine.c (distribute_notes): When removing TEM_INSN for which + corresponding dest has last value recorded, invalidate that last + value. + 2016-02-13 Kyrylo Tkachov * config/arm/arm.c (arm_print_tune_info): Use ASM_COMMENT_START instead diff --git a/gcc/combine.c b/gcc/combine.c index 727299bdf50..b5c0c184a62 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -14288,6 +14288,11 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2, NULL_RTX, NULL_RTX, NULL_RTX); distribute_links (LOG_LINKS (tem_insn)); + unsigned int regno = REGNO (XEXP (note, 0)); + reg_stat_type *rsp = ®_stat[regno]; + if (rsp->last_set == tem_insn) + record_value_for_reg (XEXP (note, 0), NULL, NULL_RTX); + SET_INSN_DELETED (tem_insn); if (tem_insn == i2) i2 = NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 429fe944fe3..f4497d5b412 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,14 @@ +2017-02-13 Jakub Jelinek + + PR rtl-optimization/79388 + PR rtl-optimization/79450 + * gcc.c-torture/execute/pr79388.c: New test. + * gcc.c-torture/execute/pr79450.c: New test. + 2017-02-12 Thomas Koenig PR fortran/65542 - * gfortran.dg/spread_init_expr_2.f90: New test case. + * gfortran.dg/spread_init_expr_2.f90: New test case. 2017-02-11 Jakub Jelinek @@ -812,7 +819,8 @@ * gcc.dg/vect/vect-24.c: Remove xfail on ARM targets. 2017-01-25 Carl Love - * gcc.target/powerpc/builtins-3-p8.c: Add missing tests for the + + * gcc.target/powerpc/builtins-3-p8.c: Add missing tests for the vec_packs built-ins 2017-01-25 Christophe Lyon @@ -1012,7 +1020,7 @@ 2017-01-23 Thomas Koenig - * gfortran.dg/integer_exponentiation_7.f90: New test. + * gfortran.dg/integer_exponentiation_7.f90: New test. 2017-01-23 Bernd Schmidt diff --git a/gcc/testsuite/gcc.c-torture/execute/pr79388.c b/gcc/testsuite/gcc.c-torture/execute/pr79388.c new file mode 100644 index 00000000000..07a75c9ae7d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr79388.c @@ -0,0 +1,23 @@ +/* PR rtl-optimization/79388 */ +/* { dg-additional-options "-fno-tree-coalesce-vars" } */ + +unsigned int a, c; + +__attribute__ ((noinline, noclone)) unsigned int +foo (unsigned int p) +{ + p |= 1; + p &= 0xfffe; + p %= 0xffff; + c = p; + return a + p; +} + +int +main (void) +{ + int x = foo (6); + if (x != 6) + __builtin_abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr79450.c b/gcc/testsuite/gcc.c-torture/execute/pr79450.c new file mode 100644 index 00000000000..5ba710166f2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr79450.c @@ -0,0 +1,22 @@ +/* PR rtl-optimization/79450 */ + +unsigned int +foo (unsigned char x, unsigned long long y) +{ + do + { + x &= !y; + x %= 24; + } + while (x < y); + return x + y; +} + +int +main (void) +{ + unsigned int x = foo (1, 0); + if (x != 1) + __builtin_abort (); + return 0; +}