aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-02 08:26:57 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-02 08:26:57 +0000
commitdad16761d163a5854d55f27f2e5212d1ade8b799 (patch)
tree5acdcf8242a39258c75e71d48d441096c4ada2fe /gcc
parent21b624f069b9e5b9c088f709cbc11704377e7a59 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/optabs.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/vect/pr60729.cc10
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" } }