diff options
author | Richard Biener <rguenther@suse.de> | 2014-04-02 08:26:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-04-02 08:26:57 +0000 |
commit | dad16761d163a5854d55f27f2e5212d1ade8b799 (patch) | |
tree | 5acdcf8242a39258c75e71d48d441096c4ada2fe | |
parent | 21b624f069b9e5b9c088f709cbc11704377e7a59 (diff) | |
download | gcc-dad16761d163a5854d55f27f2e5212d1ade8b799.zip gcc-dad16761d163a5854d55f27f2e5212d1ade8b799.tar.gz gcc-dad16761d163a5854d55f27f2e5212d1ade8b799.tar.bz2 |
re PR middle-end/60729 (Compiler failure for combination of -ftrapv and -O3: compiler error: in prepare_cmp_insn)
2014-04-02 Richard Biener <rguenther@suse.de>
PR middle-end/60729
* optabs.c (expand_abs_nojump): Honor flag_trapv only for
MODE_INTs. Properly use negv_optab.
(expand_abs): Likewise.
* g++.dg/vect/pr60729.cc: New testcase.
From-SVN: r209012
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/optabs.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr60729.cc | 10 |
4 files changed, 28 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a4de86..cf26a41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-04-02 Richard Biener <rguenther@suse.de> + PR middle-end/60729 + * optabs.c (expand_abs_nojump): Honor flag_trapv only for + MODE_INTs. Properly use negv_optab. + (expand_abs): Likewise. + +2014-04-02 Richard Biener <rguenther@suse.de> + PR bootstrap/60719 * Makefile.in (install-driver): Guard extra installs with special names properly. diff --git a/gcc/optabs.c b/gcc/optabs.c index c4540f8..54f07ab 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -3384,7 +3384,8 @@ expand_abs_nojump (enum machine_mode mode, rtx op0, rtx target, { rtx temp; - if (! flag_trapv) + if (GET_MODE_CLASS (mode) != MODE_INT + || ! flag_trapv) result_unsignedp = 1; /* First try to do it with a special abs instruction. */ @@ -3407,7 +3408,8 @@ expand_abs_nojump (enum machine_mode mode, rtx op0, rtx target, { rtx last = get_last_insn (); - temp = expand_unop (mode, neg_optab, op0, NULL_RTX, 0); + temp = expand_unop (mode, result_unsignedp ? neg_optab : negv_optab, + op0, NULL_RTX, 0); if (temp != 0) temp = expand_binop (mode, smax_optab, op0, temp, target, 0, OPTAB_WIDEN); @@ -3449,7 +3451,8 @@ expand_abs (enum machine_mode mode, rtx op0, rtx target, { rtx temp, op1; - if (! flag_trapv) + if (GET_MODE_CLASS (mode) != MODE_INT + || ! flag_trapv) result_unsignedp = 1; temp = expand_abs_nojump (mode, op0, target, result_unsignedp); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7092fa7..5e3bc26 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-02 Richard Biener <rguenther@suse.de> + + PR middle-end/60729 + * g++.dg/vect/pr60729.cc: New testcase. + 2014-04-01 Fabien ChĂȘne <fabien@gcc.gnu.org> * g++.dg/init/ctor4.C: Adjust. diff --git a/gcc/testsuite/g++.dg/vect/pr60729.cc b/gcc/testsuite/g++.dg/vect/pr60729.cc new file mode 100644 index 0000000..fd472c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr60729.cc @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-additional-options "-ftrapv" } + +void doSomething(int dim, double *Y, double *A) +{ + for (int k=0; k<dim; k++) + Y[k] += __builtin_fabs (A[k]); +} + +// { dg-final { cleanup-tree-dump "vect" } } |