diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-08-31 09:49:12 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-08-31 09:49:12 +0200 |
commit | 8e7dfe7144a4bca1db98be1aa7e637edb3c3e42f (patch) | |
tree | faa700061e1cd3148b49a828297a03a0624b9943 /gcc | |
parent | 4e227341f6e6c3ceef721d3839c8d9eb6292db70 (diff) | |
download | gcc-8e7dfe7144a4bca1db98be1aa7e637edb3c3e42f.zip gcc-8e7dfe7144a4bca1db98be1aa7e637edb3c3e42f.tar.gz gcc-8e7dfe7144a4bca1db98be1aa7e637edb3c3e42f.tar.bz2 |
re PR middle-end/87138 (wrong code with TI multiplication with -O -march=k8 -fno-tree-fre -mavx512bw)
PR middle-end/87138
* expmed.c (expand_mult_const): Use immed_wide_int_const instead of
gen_int_mode. Formatting fixes.
* gcc.target/i386/avx512bw-pr87138.c: New test.
From-SVN: r264009
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/avx512bw-pr87138.c | 29 |
4 files changed, 49 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 363a80f..f1be88b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-08-31 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/87138 + * expmed.c (expand_mult_const): Use immed_wide_int_const instead of + gen_int_mode. Formatting fixes. + 2018-08-30 Sandra Loosemore <sandra@codesourcery.com> * target.def (custom_function_descriptors): Improve documentation. diff --git a/gcc/expmed.c b/gcc/expmed.c index caf29e8..29ce10b 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3347,19 +3347,21 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, /* Write a REG_EQUAL note on the last insn so that we can cse multiplication sequences. Note that if ACCUM is a SUBREG, we've set the inner register and must properly indicate that. */ - tem = op0, nmode = mode; - accum_inner = accum; - if (GET_CODE (accum) == SUBREG) + tem = op0, nmode = mode; + accum_inner = accum; + if (GET_CODE (accum) == SUBREG) { accum_inner = SUBREG_REG (accum); nmode = GET_MODE (accum_inner); 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)), + insn = get_last_insn (); + wide_int wval_so_far + = wi::uhwi (val_so_far, + GET_MODE_PRECISION (as_a <scalar_mode> (nmode))); + rtx c = immed_wide_int_const (wval_so_far, nmode); + set_dst_reg_note (insn, REG_EQUAL, gen_rtx_MULT (nmode, tem, c), accum_inner); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c0240a1..ac3722a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-08-31 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/87138 + * gcc.target/i386/avx512bw-pr87138.c: New test. + 2018-08-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/86328 diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-pr87138.c b/gcc/testsuite/gcc.target/i386/avx512bw-pr87138.c new file mode 100644 index 0000000..46cecb9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/avx512bw-pr87138.c @@ -0,0 +1,29 @@ +/* PR middle-end/87138 */ +/* { dg-do run { target int128 } } */ +/* { dg-options "-O -fno-tree-fre -mavx512bw -mtune=k8" } */ +/* { dg-require-effective-target avx512bw } */ + +#include "avx512bw-check.h" + +typedef int U __attribute__ ((vector_size (64))); +typedef __int128 V __attribute__ ((vector_size (64))); +V g, i; + +static inline void +foo (unsigned h, V j, U k, V n) +{ + k /= h; + __builtin_memmove (&h, &n, 1); + n[j[1]] *= 0x7FFFFFFFFFFFFFFF; + j[k[5]] = 0; + g = n; + i = h + j + n; +} + +void +avx512bw_test () +{ + foo (~0, (V) { }, (U) { 5 }, (V) { 3 }); + if (g[0] != (__int128) 3 * 0x7FFFFFFFFFFFFFFF) + abort (); +} |