From 2065b8e8fbd257dde44ec284dd7398ef5e612227 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 31 Aug 2018 07:49:12 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264009 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++ gcc/expmed.c | 16 +++++----- gcc/testsuite/ChangeLog | 5 ++++ .../gcc.target/i386/avx512bw-pr87138.c | 29 +++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/avx512bw-pr87138.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 363a80f3db92..f1be88bc0614 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-08-31 Jakub Jelinek + + 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 * target.def (custom_function_descriptors): Improve documentation. diff --git a/gcc/expmed.c b/gcc/expmed.c index caf29e889244..29ce10b4de2f 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 (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 c0240a13700a..ac3722a58ebf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-08-31 Jakub Jelinek + + PR middle-end/87138 + * gcc.target/i386/avx512bw-pr87138.c: New test. + 2018-08-31 Paul Thomas 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 000000000000..46cecb985296 --- /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 (); +} -- 2.47.2