From: Jakub Jelinek Date: Fri, 30 Aug 2019 12:19:33 +0000 (+0200) Subject: backport: re PR rtl-optimization/89679 (wrong code with -Og -frerun-cse-after-loop... X-Git-Tag: releases/gcc-7.5.0~231 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa03ad48fe352340b987a80d72576c504c462af7;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/89679 (wrong code with -Og -frerun-cse-after-loop -fno-tree-fre) Backported from mainline 2019-03-14 Jakub Jelinek PR rtl-optimization/89679 * expmed.c (expand_mult_const): Don't add a REG_EQUAL note if it would contain a paradoxical SUBREG. * gcc.dg/pr89679.c: New test. From-SVN: r275132 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1be99eebeef2..37e1a9fe8efc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2019-03-14 Jakub Jelinek + PR rtl-optimization/89679 + * expmed.c (expand_mult_const): Don't add a REG_EQUAL note if it + would contain a paradoxical SUBREG. + PR tree-optimization/89703 * tree-ssa-strlen.c (valid_builtin_call): Punt if stmt call types aren't compatible also with builtin_decl_explicit. Check pure diff --git a/gcc/expmed.c b/gcc/expmed.c index b9f12576b0cf..06a06d1a0cc0 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3179,11 +3179,19 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, tem = gen_lowpart (nmode, op0); } - insn = get_last_insn (); - set_dst_reg_note (insn, REG_EQUAL, - gen_rtx_MULT (nmode, tem, - gen_int_mode (val_so_far, nmode)), - accum_inner); + /* Don't add a REG_EQUAL note if tem is a paradoxical SUBREG. + In that case, only the low bits of accum would be guaranteed to + be equal to the content of the REG_EQUAL note, the upper bits + can be anything. */ + if (!paradoxical_subreg_p (tem)) + { + insn = get_last_insn (); + set_dst_reg_note (insn, REG_EQUAL, + gen_rtx_MULT (nmode, tem, + gen_int_mode (val_so_far, + nmode)), + accum_inner); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5525de68184..d9fdc68c19ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2019-03-14 Jakub Jelinek + PR rtl-optimization/89679 + * gcc.dg/pr89679.c: New test. + PR tree-optimization/89703 * gcc.c-torture/compile/pr89703-1.c: New test. * gcc.c-torture/compile/pr89703-2.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr89679.c b/gcc/testsuite/gcc.dg/pr89679.c new file mode 100644 index 000000000000..0d6e2d2c8716 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr89679.c @@ -0,0 +1,26 @@ +/* PR rtl-optimization/89679 */ +/* { dg-do run } */ +/* { dg-options "-Og -frerun-cse-after-loop -fno-tree-fre" } */ + +unsigned short g; + +void +foo (unsigned long long x) +{ + if (x != 0xffff) + __builtin_abort (); +} + +int +main () +{ +#if __SIZEOF_SHORT__ == 2 && __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8 + unsigned short d = 0; + unsigned long long x, c = ~0; + c = c >> d; + __builtin_memset (&d, c, 2); + x = d + g; + foo (x); +#endif + return 0; +}