aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames E Wilson <wilson@specifixinc.com>2004-08-17 00:00:50 +0000
committerJim Wilson <wilson@gcc.gnu.org>2004-08-16 17:00:50 -0700
commitd97c633306d2f90198577afc5ead6ad4f8fb06ef (patch)
treec420f74d10fc4b348591d6a21ce1ec384cfa199d
parent16d85b639cd5abc3662f49b02e28c4fe7136587f (diff)
downloadgcc-d97c633306d2f90198577afc5ead6ad4f8fb06ef.zip
gcc-d97c633306d2f90198577afc5ead6ad4f8fb06ef.tar.gz
gcc-d97c633306d2f90198577afc5ead6ad4f8fb06ef.tar.bz2
Make unsafe vector float optimizations dependent on -ffast-math.
* tree.h (VECTOR_FLOAT_TYPE_P): New. (FLOAT_TYPE_P): Use it. * c-typeck.c (build_binary_op): After convert calls, check for check for ERROR_MARK operands. From-SVN: r86088
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-typeck.c5
-rw-r--r--gcc/tree.h11
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49d413a..e7e7961 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-08-16 James E Wilson <wilson@specifixinc.com>
+
+ * tree.h (VECTOR_FLOAT_TYPE_P): New.
+ (FLOAT_TYPE_P): Use it.
+ * c-typeck.c (build_binary_op): After convert calls, check for
+ check for ERROR_MARK operands.
+
2004-08-16 Zack Weinberg <zack@codesourcery.com>
* Makefile.in (BUILD_PREFIX, BUILD_PREFIX_1): Delete.
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 5fca42d..1688834 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -7551,6 +7551,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
op0 = convert (result_type, op0);
if (TREE_TYPE (op1) != result_type)
op1 = convert (result_type, op1);
+
+ /* This can happen if one operand has a vector type, and the other
+ has a different type. */
+ if (TREE_CODE (op0) == ERROR_MARK || TREE_CODE (op1) == ERROR_MARK)
+ return error_mark_node;
}
if (build_type == NULL_TREE)
diff --git a/gcc/tree.h b/gcc/tree.h
index ff03d9c..4feabef 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -668,11 +668,18 @@ extern void tree_operand_check_failed (int, enum tree_code,
(TREE_CODE (TYPE) == COMPLEX_TYPE \
&& TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
+/* Nonzero if TYPE represents a vector floating-point type. */
+
+#define VECTOR_FLOAT_TYPE_P(TYPE) \
+ (TREE_CODE (TYPE) == VECTOR_TYPE \
+ && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
+
/* Nonzero if TYPE represents a floating-point type, including complex
- floating-point types. */
+ and vector floating-point types. */
#define FLOAT_TYPE_P(TYPE) \
- (SCALAR_FLOAT_TYPE_P (TYPE) || COMPLEX_FLOAT_TYPE_P (TYPE))
+ (SCALAR_FLOAT_TYPE_P (TYPE) || COMPLEX_FLOAT_TYPE_P (TYPE) \
+ || VECTOR_FLOAT_TYPE_P (TYPE))
/* Nonzero if TYPE represents an aggregate (multi-component) type. */