aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-07-19 13:28:15 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-07-19 13:28:15 +0000
commitd906fd7fec3b6fcdea45922c4475b1b6bcd5b34c (patch)
treed6fa623f7f1b41202ae3ba9147e8ed8746741ec3
parentb21a544bb1a94f29adc4fc812cda0766b9a048e9 (diff)
downloadgcc-d906fd7fec3b6fcdea45922c4475b1b6bcd5b34c.zip
gcc-d906fd7fec3b6fcdea45922c4475b1b6bcd5b34c.tar.gz
gcc-d906fd7fec3b6fcdea45922c4475b1b6bcd5b34c.tar.bz2
re PR middle-end/18908 (Missed folding opportunities with bools)
2011-07-19 Richard Guenther <rguenther@suse.de> * expr.c (expand_expr_real_2): Remove TRUTH_*_EXPR handling. (expand_expr_real_1): Remove TRUTH_*IF_EXPR and STATEMENT_LIST handling. PR middle-end/18908 * expr.c (expand_expr_real_2): Do not unnecessarily truncate the result of BIT_*_EXPR to bitfield precision. From-SVN: r176460
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/expr.c77
2 files changed, 22 insertions, 71 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ee76d11..3b4ef1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2011-07-19 Richard Guenther <rguenther@suse.de>
+
+ * expr.c (expand_expr_real_2): Remove TRUTH_*_EXPR handling.
+ (expand_expr_real_1): Remove TRUTH_*IF_EXPR and STATEMENT_LIST
+ handling.
+
+ PR middle-end/18908
+ * expr.c (expand_expr_real_2): Do not unnecessarily truncate the
+ result of BIT_*_EXPR to bitfield precision.
+
2011-07-19 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/49742
@@ -6,6 +16,12 @@
2011-07-19 Richard Guenther <rguenther@suse.de>
+ * Makefile.in (tree-ssa-forwprop.o): Depend on gimple-pretty-print.h.
+ * tree-ssa-forwprop.c: Include gimple-pretty-print.h.
+ (forward_propagate_comparison): Simplify, remove obsolete code.
+
+2011-07-19 Richard Guenther <rguenther@suse.de>
+
* gimplify.c (gimplify_expr): Gimplify TRUTH_NOT_EXPR as
BIT_XOR_EXPR, same as the RTL expander does.
* tree-cfg.c (verify_expr): Disallow TRUTH_NOT_EXPR in the gimple IL.
diff --git a/gcc/expr.c b/gcc/expr.c
index 0f20372..27d77bc 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8054,26 +8054,8 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
and (a bitwise1 b) bitwise2 b (etc)
but that is probably not worth while. */
- /* BIT_AND_EXPR is for bitwise anding. TRUTH_AND_EXPR is for anding two
- boolean values when we want in all cases to compute both of them. In
- general it is fastest to do TRUTH_AND_EXPR by computing both operands
- as actual zero-or-1 values and then bitwise anding. In cases where
- there cannot be any side effects, better code would be made by
- treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is
- how to recognize those cases. */
-
- case TRUTH_AND_EXPR:
- code = BIT_AND_EXPR;
case BIT_AND_EXPR:
- goto binop;
-
- case TRUTH_OR_EXPR:
- code = BIT_IOR_EXPR;
case BIT_IOR_EXPR:
- goto binop;
-
- case TRUTH_XOR_EXPR:
- code = BIT_XOR_EXPR;
case BIT_XOR_EXPR:
goto binop;
@@ -8152,18 +8134,6 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
emit_label (op1);
return target;
- case TRUTH_NOT_EXPR:
- if (modifier == EXPAND_STACK_PARM)
- target = 0;
- op0 = expand_expr (treeop0, target,
- VOIDmode, EXPAND_NORMAL);
- /* The parser is careful to generate TRUTH_NOT_EXPR
- only with operands that are always zero or one. */
- temp = expand_binop (mode, xor_optab, op0, const1_rtx,
- target, 1, OPTAB_LIB_WIDEN);
- gcc_assert (temp);
- return temp;
-
case COMPLEX_EXPR:
/* Get the rtx code of the operands. */
op0 = expand_normal (treeop0);
@@ -8319,6 +8289,12 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
temp = expand_binop (mode, this_optab, op0, op1, target,
unsignedp, OPTAB_LIB_WIDEN);
gcc_assert (temp);
+ /* Bitwise operations do not need bitfield reduction as we expect their
+ operands being properly truncated. */
+ if (code == BIT_XOR_EXPR
+ || code == BIT_AND_EXPR
+ || code == BIT_IOR_EXPR)
+ return temp;
return REDUCE_BIT_FIELD (temp);
}
#undef REDUCE_BIT_FIELD
@@ -9541,47 +9517,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
return op0;
- /* Use a compare and a jump for BLKmode comparisons, or for function
- type comparisons is HAVE_canonicalize_funcptr_for_compare. */
-
- /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
- are occassionally created by folding during expansion. */
- case TRUTH_ANDIF_EXPR:
- case TRUTH_ORIF_EXPR:
- if (! ignore
- && (target == 0
- || modifier == EXPAND_STACK_PARM
- || ! safe_from_p (target, treeop0, 1)
- || ! safe_from_p (target, treeop1, 1)
- /* Make sure we don't have a hard reg (such as function's return
- value) live across basic blocks, if not optimizing. */
- || (!optimize && REG_P (target)
- && REGNO (target) < FIRST_PSEUDO_REGISTER)))
- target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
-
- if (target)
- emit_move_insn (target, const0_rtx);
-
- op1 = gen_label_rtx ();
- jumpifnot_1 (code, treeop0, treeop1, op1, -1);
-
- if (target)
- emit_move_insn (target, const1_rtx);
-
- emit_label (op1);
- return ignore ? const0_rtx : target;
-
- case STATEMENT_LIST:
- {
- tree_stmt_iterator iter;
-
- gcc_assert (ignore);
-
- for (iter = tsi_start (exp); !tsi_end_p (iter); tsi_next (&iter))
- expand_expr (tsi_stmt (iter), const0_rtx, VOIDmode, modifier);
- }
- return const0_rtx;
-
case COND_EXPR:
/* A COND_EXPR with its type being VOID_TYPE represents a
conditional jump and is handled in