diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-17 20:19:57 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-17 20:19:57 +0000 |
commit | 39d4c6de7e4936eccf4f656519257b600a0cda7b (patch) | |
tree | bc170af4d8366927c41e6b65b1e754e6f985e975 /gcc | |
parent | 2c10944d9982eaa18e1c592e890bac00b3ea4f27 (diff) | |
download | ppe42-gcc-39d4c6de7e4936eccf4f656519257b600a0cda7b.tar.gz ppe42-gcc-39d4c6de7e4936eccf4f656519257b600a0cda7b.zip |
* fold-const.c (fold_relational_const): Use constant_boolean_node.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83307 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/fold-const.c | 42 |
2 files changed, 21 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e6e9258005..946ef76dfbe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2004-06-17 Roger Sayle <roger@eyesopen.com> + + * fold-const.c (fold_relational_const): Use constant_boolean_node. + 2004-06-17 Jan Hubicka <jh@suse.cz> PR target/15433 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 91f40543cd0..3494d4af41c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9966,8 +9966,7 @@ fold_not_const (tree arg0, tree type) static tree fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) { - tree tem; - int invert; + int result, invert; /* From here on, the only cases we handle are when the result is known to be a constant. @@ -9981,14 +9980,15 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) if (code == LE_EXPR || code == GT_EXPR) { - tem = op0, op0 = op1, op1 = tem; + tree tem = op0; + op0 = op1; + op1 = tem; code = swap_tree_comparison (code); } /* Note that it is safe to invert for real values here because we will check below in the one case that it matters. */ - tem = NULL_TREE; invert = 0; if (code == NE_EXPR || code == GE_EXPR) { @@ -10001,17 +10001,16 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST) { if (code == EQ_EXPR) - tem = build_int_2 (tree_int_cst_equal (op0, op1), 0); + result = tree_int_cst_equal (op0, op1); + else if (TYPE_UNSIGNED (TREE_TYPE (op0))) + result = INT_CST_LT_UNSIGNED (op0, op1); else - tem = build_int_2 ((TYPE_UNSIGNED (TREE_TYPE (op0)) - ? INT_CST_LT_UNSIGNED (op0, op1) - : INT_CST_LT (op0, op1)), - 0); + result = INT_CST_LT (op0, op1); } else if (code == EQ_EXPR && !TREE_SIDE_EFFECTS (op0) && integer_zerop (op1) && tree_expr_nonzero_p (op0)) - tem = build_int_2 (0, 0); + result = 0; /* Two real constants can be compared explicitly. */ else if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST) @@ -10025,28 +10024,21 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) if (REAL_VALUE_ISNAN (TREE_REAL_CST (op0)) || REAL_VALUE_ISNAN (TREE_REAL_CST (op1))) - tem = build_int_2 (invert && code == LT_EXPR, 0); + result = invert && code == LT_EXPR; else if (code == EQ_EXPR) - tem = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (op0), - TREE_REAL_CST (op1)), - 0); + result = REAL_VALUES_EQUAL (TREE_REAL_CST (op0), + TREE_REAL_CST (op1)); else - tem = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (op0), - TREE_REAL_CST (op1)), - 0); + result = REAL_VALUES_LESS (TREE_REAL_CST (op0), + TREE_REAL_CST (op1)); } - - if (tem == NULL_TREE) + else return NULL_TREE; if (invert) - TREE_INT_CST_LOW (tem) ^= 1; - - TREE_TYPE (tem) = type; - if (TREE_CODE (type) == BOOLEAN_TYPE) - return lang_hooks.truthvalue_conversion (tem); - return tem; + result ^= 1; + return constant_boolean_node (result, type); } /* Build an expression for the address of T. Folds away INDIRECT_REF to |