Commit aea417d7 by Marc Glisse Committed by Marc Glisse

generic-match-head.c (types_match): Handle non-types.

2015-05-14  Marc Glisse  <marc.glisse@inria.fr>

gcc/
	* generic-match-head.c (types_match): Handle non-types.
	* gimple-match-head.c (types_match): Likewise.
	* match.pd: Remove unnecessary TREE_TYPE for types_match.

From-SVN: r223199
parent ddbd742b
2015-05-14 Marc Glisse <marc.glisse@inria.fr>
* generic-match-head.c (types_match): Handle non-types.
* gimple-match-head.c (types_match): Likewise.
* match.pd: Remove unnecessary TREE_TYPE for types_match.
2015-05-14 Wilco Dijkstra <wdijkstr@arm.com> 2015-05-14 Wilco Dijkstra <wdijkstr@arm.com>
* config/aarch64/aarch64.md (absdi2): Optimize abs expansion. * config/aarch64/aarch64.md (absdi2): Optimize abs expansion.
......
...@@ -71,11 +71,17 @@ along with GCC; see the file COPYING3. If not see ...@@ -71,11 +71,17 @@ along with GCC; see the file COPYING3. If not see
#include "generic-match.h" #include "generic-match.h"
/* Routine to determine if the types T1 and T2 are effectively /* Routine to determine if the types T1 and T2 are effectively
the same for GENERIC. */ the same for GENERIC. If T1 or T2 is not a type, the test
applies to their TREE_TYPE. */
static inline bool static inline bool
types_match (tree t1, tree t2) types_match (tree t1, tree t2)
{ {
if (!TYPE_P (t1))
t1 = TREE_TYPE (t1);
if (!TYPE_P (t2))
t2 = TREE_TYPE (t2);
return TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2); return TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2);
} }
......
...@@ -862,11 +862,17 @@ do_valueize (tree (*valueize)(tree), tree op) ...@@ -862,11 +862,17 @@ do_valueize (tree (*valueize)(tree), tree op)
} }
/* Routine to determine if the types T1 and T2 are effectively /* Routine to determine if the types T1 and T2 are effectively
the same for GIMPLE. */ the same for GIMPLE. If T1 or T2 is not a type, the test
applies to their TREE_TYPE. */
static inline bool static inline bool
types_match (tree t1, tree t2) types_match (tree t1, tree t2)
{ {
if (!TYPE_P (t1))
t1 = TREE_TYPE (t1);
if (!TYPE_P (t2))
t2 = TREE_TYPE (t2);
return types_compatible_p (t1, t2); return types_compatible_p (t1, t2);
} }
......
...@@ -289,7 +289,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -289,7 +289,7 @@ along with GCC; see the file COPYING3. If not see
(if (((TREE_CODE (@1) == INTEGER_CST (if (((TREE_CODE (@1) == INTEGER_CST
&& INTEGRAL_TYPE_P (TREE_TYPE (@0)) && INTEGRAL_TYPE_P (TREE_TYPE (@0))
&& int_fits_type_p (@1, TREE_TYPE (@0))) && int_fits_type_p (@1, TREE_TYPE (@0)))
|| types_match (TREE_TYPE (@0), TREE_TYPE (@1))) || types_match (@0, @1))
/* ??? This transform conflicts with fold-const.c doing /* ??? This transform conflicts with fold-const.c doing
Convert (T)(x & c) into (T)x & (T)c, if c is an integer Convert (T)(x & c) into (T)x & (T)c, if c is an integer
constants (if x has signed type, the sign bit cannot be set constants (if x has signed type, the sign bit cannot be set
...@@ -948,7 +948,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -948,7 +948,7 @@ along with GCC; see the file COPYING3. If not see
/* Unordered tests if either argument is a NaN. */ /* Unordered tests if either argument is a NaN. */
(simplify (simplify
(bit_ior (unordered @0 @0) (unordered @1 @1)) (bit_ior (unordered @0 @0) (unordered @1 @1))
(if (types_match (TREE_TYPE (@0), TREE_TYPE (@1))) (if (types_match (@0, @1))
(unordered @0 @1))) (unordered @0 @1)))
(simplify (simplify
(bit_ior:c (unordered @0 @0) (unordered:c@2 @0 @1)) (bit_ior:c (unordered @0 @0) (unordered:c@2 @0 @1))
...@@ -1068,8 +1068,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -1068,8 +1068,8 @@ along with GCC; see the file COPYING3. If not see
&& TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type)) && TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type))
/* The inner conversion must be a widening conversion. */ /* The inner conversion must be a widening conversion. */
&& TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0)) && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0))
&& types_match (TREE_TYPE (@0), TREE_TYPE (@1)) && types_match (@0, @1)
&& types_match (TREE_TYPE (@0), type) && types_match (@0, type)
&& single_use (@4)) && single_use (@4))
(if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))) (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)))
(convert (op @0 @1))) (convert (op @0 @1)))
...@@ -1099,7 +1099,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -1099,7 +1099,7 @@ along with GCC; see the file COPYING3. If not see
&& TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type)) && TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type))
/* The inner conversion must be a widening conversion. */ /* The inner conversion must be a widening conversion. */
&& TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0)) && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE (@0))
&& types_match (TREE_TYPE (@0), TREE_TYPE (@1)) && types_match (@0, @1)
&& (tree_int_cst_min_precision (@4, UNSIGNED) && (tree_int_cst_min_precision (@4, UNSIGNED)
<= TYPE_PRECISION (TREE_TYPE (@0))) <= TYPE_PRECISION (TREE_TYPE (@0)))
&& single_use (@5)) && single_use (@5))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment