diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/internal-fn.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr90095-1.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr90095-2.c | 5 |
5 files changed, 37 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3820fae8ee75..0e9aeb4a91ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-04-17 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/90095 + * internal-fn.c (expand_mul_overflow): Don't set SUBREG_PROMOTED_VAR_P + on lowpart SUBREGs. + 2019-04-17 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc.c (arc_init): Format diagnostic string. diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index 4f2ef45a0ff4..04081f36c4d3 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -1753,22 +1753,9 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, /* If both op0 and op1 are sign (!uns) or zero (uns) extended from hmode to mode, the multiplication will never overflow. We can do just one hmode x hmode => mode widening multiplication. */ - rtx lopart0s = lopart0, lopart1s = lopart1; - if (GET_CODE (lopart0) == SUBREG) - { - lopart0s = shallow_copy_rtx (lopart0); - SUBREG_PROMOTED_VAR_P (lopart0s) = 1; - SUBREG_PROMOTED_SET (lopart0s, uns ? SRP_UNSIGNED : SRP_SIGNED); - } - if (GET_CODE (lopart1) == SUBREG) - { - lopart1s = shallow_copy_rtx (lopart1); - SUBREG_PROMOTED_VAR_P (lopart1s) = 1; - SUBREG_PROMOTED_SET (lopart1s, uns ? SRP_UNSIGNED : SRP_SIGNED); - } tree halfstype = build_nonstandard_integer_type (hprec, uns); - ops.op0 = make_tree (halfstype, lopart0s); - ops.op1 = make_tree (halfstype, lopart1s); + ops.op0 = make_tree (halfstype, lopart0); + ops.op1 = make_tree (halfstype, lopart1); ops.code = WIDEN_MULT_EXPR; ops.type = type; rtx thisres diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 937057421e45..3fb6092b3bfd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-04-17 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/90095 + * gcc.dg/pr90095-1.c: New test. + * gcc.dg/pr90095-2.c: New test. + 2019-04-17 Thomas Schwinge <thomas@codesourcery.com> PR fortran/90048 diff --git a/gcc/testsuite/gcc.dg/pr90095-1.c b/gcc/testsuite/gcc.dg/pr90095-1.c new file mode 100644 index 000000000000..03968ba74191 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90095-1.c @@ -0,0 +1,18 @@ +/* PR middle-end/90095 */ +/* { dg-do run } */ +/* { dg-options "-Os -fno-tree-bit-ccp" } */ + +unsigned long long a; +unsigned int b; + +int +main () +{ + unsigned int c = 255, d = c |= b; + if (__CHAR_BIT__ != 8 || __SIZEOF_INT__ != 4 || __SIZEOF_LONG_LONG__ != 8) + return 0; + d = __builtin_mul_overflow (-(unsigned long long) d, (unsigned char) - c, &a); + if (d != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr90095-2.c b/gcc/testsuite/gcc.dg/pr90095-2.c new file mode 100644 index 000000000000..43f67e1273fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90095-2.c @@ -0,0 +1,5 @@ +/* PR middle-end/90095 */ +/* { dg-do run } */ +/* { dg-options "-Os -fno-tree-bit-ccp -fno-split-wide-types" } */ + +#include "pr90095-1.c" |