OSDN Git Service

Make unsafe vector float optimizations dependent on -ffast-math.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Aug 2004 00:00:50 +0000 (00:00 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Aug 2004 00:00:50 +0000 (00:00 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86088 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-typeck.c
gcc/tree.h

index 49d413a..e7e7961 100644 (file)
@@ -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.
index 5fca42d..1688834 100644 (file)
@@ -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)
index ff03d9c..4feabef 100644 (file)
@@ -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.  */