Some backports from mainline to gcc 4.5 branch
Jakub Jelinek
jakub@redhat.com
Tue May 3 17:16:00 GMT 2011
Hi!
I've backported 5 patches from the trunk to 4.5 branch after
bootstrapping/regtesting them on x86_64-linux and i686-linux.
Jakub
-------------- next part --------------
2011-05-03 Uros Bizjak <ubizjak@gmail.com>
Jakub Jelinek <jakub@redhat.com>
PR target/48774
* config/i386/i386.c (ix86_match_ccmode): For CC{A,C,O,S}mode
only succeed if req_mode is the same as set_mode.
* gcc.dg/pr48774.c: New test.
--- gcc/config/i386/i386.c (revision 173300)
+++ gcc/config/i386/i386.c (revision 173301)
@@ -17299,11 +17299,15 @@ ix86_match_ccmode (rtx insn, enum machin
if (req_mode == CCZmode)
return 0;
/* FALLTHRU */
+ case CCZmode:
+ break;
+
case CCAmode:
case CCCmode:
case CCOmode:
case CCSmode:
- case CCZmode:
+ if (set_mode != req_mode)
+ return 0;
break;
default:
--- gcc/testsuite/gcc.dg/pr48774.c (revision 0)
+++ gcc/testsuite/gcc.dg/pr48774.c (revision 173301)
@@ -0,0 +1,38 @@
+/* PR target/48774 */
+/* { dg-do run } */
+/* { dg-options "-O2 -funroll-loops" } */
+
+extern void abort (void);
+unsigned long int s[24]
+ = { 12, ~1, 12, ~2, 12, ~4, 12, ~8, 12, ~16, 12, ~32,
+ 12, ~64, 12, ~128, 12, ~256, 12, ~512, 12, ~1024, 12, ~2048 };
+struct { int n; unsigned long *e[12]; } g
+ = { 12, { &s[0], &s[2], &s[4], &s[6], &s[8], &s[10], &s[12], &s[14],
+ &s[16], &s[18], &s[20], &s[22] } };
+int c[12];
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+ int i, j;
+ for (i = 0; i < g.n; i++)
+ for (j = 0; j < g.n; j++)
+ {
+ if (i == j && j < g.e[0][0] && (g.e[i][1] & (1UL << j)))
+ abort ();
+ if (j < g.e[0][0] && (g.e[i][1] & (1UL << j)))
+ c[i]++;
+ }
+}
+
+int
+main ()
+{
+ int i;
+ asm volatile ("" : "+m" (s), "+m" (g), "+m" (c));
+ foo ();
+ for (i = 0; i < 12; i++)
+ if (c[i] != 11)
+ abort ();
+ return 0;
+}
-------------- next part --------------
2011-05-03 Jakub Jelinek <jakub@redhat.com>
Backport from mainline
2011-04-30 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/48809
* tree-switch-conversion.c (build_arrays): Compute tidx in unsigned
type.
(gen_inbound_check): Don't compute index_expr - range_min in utype
again, instead reuse SSA_NAME initialized in build_arrays.
Remove two useless gsi_for_stmt calls.
* gcc.c-torture/execute/pr48809.c: New test.
--- gcc/tree-switch-conversion.c (revision 173206)
+++ gcc/tree-switch-conversion.c (revision 173207)
@@ -656,7 +656,7 @@ static void
build_arrays (gimple swtch)
{
tree arr_index_type;
- tree tidx, sub, tmp;
+ tree tidx, sub, tmp, utype;
gimple stmt;
gimple_stmt_iterator gsi;
int i;
@@ -664,14 +664,20 @@ build_arrays (gimple swtch)
gsi = gsi_for_stmt (swtch);
+ /* Make sure we do not generate arithmetics in a subrange. */
+ utype = TREE_TYPE (info.index_expr);
+ if (TREE_TYPE (utype))
+ utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
+ else
+ utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
+
arr_index_type = build_index_type (info.range_size);
- tmp = create_tmp_var (TREE_TYPE (info.index_expr), "csti");
+ tmp = create_tmp_var (utype, "csui");
add_referenced_var (tmp);
tidx = make_ssa_name (tmp, NULL);
- sub = fold_build2_loc (loc, MINUS_EXPR,
- TREE_TYPE (info.index_expr), info.index_expr,
- fold_convert_loc (loc, TREE_TYPE (info.index_expr),
- info.range_min));
+ sub = fold_build2_loc (loc, MINUS_EXPR, utype,
+ fold_convert_loc (loc, utype, info.index_expr),
+ fold_convert_loc (loc, utype, info.range_min));
sub = force_gimple_operand_gsi (&gsi, sub,
false, NULL, true, GSI_SAME_STMT);
stmt = gimple_build_assign (tidx, sub);
@@ -780,12 +786,7 @@ gen_inbound_check (gimple swtch)
tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
gimple label1, label2, label3;
-
- tree utype;
- tree tmp_u_1, tmp_u_2, tmp_u_var;
- tree cast;
- gimple cast_assign, minus_assign;
- tree ulb, minus;
+ tree utype, tidx;
tree bound;
gimple cond_stmt;
@@ -799,49 +800,24 @@ gen_inbound_check (gimple swtch)
gcc_assert (info.default_values);
bb0 = gimple_bb (swtch);
- /* Make sure we do not generate arithmetics in a subrange. */
- if (TREE_TYPE (TREE_TYPE (info.index_expr)))
- utype = lang_hooks.types.type_for_mode
- (TYPE_MODE (TREE_TYPE (TREE_TYPE (info.index_expr))), 1);
- else
- utype = lang_hooks.types.type_for_mode
- (TYPE_MODE (TREE_TYPE (info.index_expr)), 1);
+ tidx = gimple_assign_lhs (info.arr_ref_first);
+ utype = TREE_TYPE (tidx);
/* (end of) block 0 */
gsi = gsi_for_stmt (info.arr_ref_first);
- tmp_u_var = create_tmp_var (utype, "csui");
- add_referenced_var (tmp_u_var);
- tmp_u_1 = make_ssa_name (tmp_u_var, NULL);
-
- cast = fold_convert_loc (loc, utype, info.index_expr);
- cast_assign = gimple_build_assign (tmp_u_1, cast);
- SSA_NAME_DEF_STMT (tmp_u_1) = cast_assign;
- gsi_insert_before (&gsi, cast_assign, GSI_SAME_STMT);
- update_stmt (cast_assign);
-
- ulb = fold_convert_loc (loc, utype, info.range_min);
- minus = fold_build2_loc (loc, MINUS_EXPR, utype, tmp_u_1, ulb);
- minus = force_gimple_operand_gsi (&gsi, minus, false, NULL, true,
- GSI_SAME_STMT);
- tmp_u_2 = make_ssa_name (tmp_u_var, NULL);
- minus_assign = gimple_build_assign (tmp_u_2, minus);
- SSA_NAME_DEF_STMT (tmp_u_2) = minus_assign;
- gsi_insert_before (&gsi, minus_assign, GSI_SAME_STMT);
- update_stmt (minus_assign);
+ gsi_next (&gsi);
bound = fold_convert_loc (loc, utype, info.range_size);
- cond_stmt = gimple_build_cond (LE_EXPR, tmp_u_2, bound, NULL_TREE, NULL_TREE);
+ cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
update_stmt (cond_stmt);
/* block 2 */
- gsi = gsi_for_stmt (info.arr_ref_first);
label2 = gimple_build_label (label_decl2);
gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
last_assign = gen_def_assigns (&gsi);
/* block 1 */
- gsi = gsi_for_stmt (info.arr_ref_first);
label1 = gimple_build_label (label_decl1);
gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
--- gcc/testsuite/gcc.c-torture/execute/pr48809.c (revision 0)
+++ gcc/testsuite/gcc.c-torture/execute/pr48809.c (revision 173207)
@@ -0,0 +1,60 @@
+/* PR tree-optimization/48809 */
+
+extern void abort (void);
+
+int
+foo (signed char x)
+{
+ int y = 0;
+ switch (x)
+ {
+ case 0: y = 1; break;
+ case 1: y = 7; break;
+ case 2: y = 2; break;
+ case 3: y = 19; break;
+ case 4: y = 5; break;
+ case 5: y = 17; break;
+ case 6: y = 31; break;
+ case 7: y = 8; break;
+ case 8: y = 28; break;
+ case 9: y = 16; break;
+ case 10: y = 31; break;
+ case 11: y = 12; break;
+ case 12: y = 15; break;
+ case 13: y = 111; break;
+ case 14: y = 17; break;
+ case 15: y = 10; break;
+ case 16: y = 31; break;
+ case 17: y = 7; break;
+ case 18: y = 2; break;
+ case 19: y = 19; break;
+ case 20: y = 5; break;
+ case 21: y = 107; break;
+ case 22: y = 31; break;
+ case 23: y = 8; break;
+ case 24: y = 28; break;
+ case 25: y = 106; break;
+ case 26: y = 31; break;
+ case 27: y = 102; break;
+ case 28: y = 105; break;
+ case 29: y = 111; break;
+ case 30: y = 17; break;
+ case 31: y = 10; break;
+ case 32: y = 31; break;
+ case 98: y = 18; break;
+ case -62: y = 19; break;
+ }
+ return y;
+}
+
+int
+main ()
+{
+ if (foo (98) != 18 || foo (97) != 0 || foo (99) != 0)
+ abort ();
+ if (foo (-62) != 19 || foo (-63) != 0 || foo (-61) != 0)
+ abort ();
+ if (foo (28) != 105 || foo (27) != 102 || foo (29) != 111)
+ abort ();
+ return 0;
+}
-------------- next part --------------
2011-05-03 Jakub Jelinek <jakub@redhat.com>
Backport from mainline
2011-04-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/48597
* final.c (final_scan_insn): Call dwarf2out_frame_debug even for
inline asm.
--- gcc/final.c (revision 173119)
+++ gcc/final.c (revision 173120)
@@ -2313,6 +2313,11 @@ final_scan_insn (rtx insn, FILE *file, i
location_t loc;
expanded_location expanded;
+ /* Make sure we flush any queued register saves in case this
+ clobbers affected registers. */
+ if (dwarf2out_do_frame ())
+ dwarf2out_frame_debug (insn, false);
+
/* There's no telling what that did to the condition codes. */
CC_STATUS_INIT;
-------------- next part --------------
2011-05-03 Jakub Jelinek <jakub@redhat.com>
Backport from mainline
2011-04-27 Jakub Jelinek <jakub@redhat.com>
PR c/48742
* c-typeck.c (build_binary_op): Don't wrap arguments if
int_operands is true.
* gcc.c-torture/compile/pr48742.c: New test.
--- gcc/c-typeck.c (revision 173325)
+++ gcc/c-typeck.c (revision 173326)
@@ -9800,7 +9800,7 @@ build_binary_op (location_t location, en
warn_for_sign_compare (location, orig_op0_folded,
orig_op1_folded, op0, op1,
result_type, resultcode);
- if (!in_late_binary_op)
+ if (!in_late_binary_op && !int_operands)
{
if (!op0_maybe_const || TREE_CODE (op0) != INTEGER_CST)
op0 = c_wrap_maybe_const (op0, !op0_maybe_const);
--- gcc/testsuite/gcc.c-torture/compile/pr48742.c (revision 0)
+++ gcc/testsuite/gcc.c-torture/compile/pr48742.c (revision 173326)
@@ -0,0 +1,15 @@
+/* PR c/48742 */
+
+void baz (int);
+
+int
+foo (void)
+{
+ return 1 / 0 > 0;
+}
+
+void
+bar (void)
+{
+ baz (1 <= 2 % (3 >> 1 > 5 / 6 == 3));
+}
-------------- next part --------------
2011-05-03 Jakub Jelinek <jakub@redhat.com>
Backport from mainline
2011-04-23 Jakub Jelinek <jakub@redhat.com>
PR c/48685
* fold-const.c (fold_convert_loc): Add NOP_EXPR when casting
to VOID_TYPE even around MODIFY_EXPR.
* gcc.dg/pr48685.c: New test.
--- gcc/fold-const.c (revision 173323)
+++ gcc/fold-const.c (revision 173324)
@@ -2784,8 +2784,6 @@ fold_convert_loc (location_t loc, tree t
case VOID_TYPE:
tem = fold_ignored_result (arg);
- if (TREE_CODE (tem) == MODIFY_EXPR)
- goto fold_convert_exit;
return fold_build1_loc (loc, NOP_EXPR, type, tem);
default:
--- gcc/testsuite/gcc.dg/pr48685.c (revision 0)
+++ gcc/testsuite/gcc.dg/pr48685.c (revision 173324)
@@ -0,0 +1,11 @@
+/* PR c/48685 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+main ()
+{
+ int v = 1;
+ (void) (1 == 2 ? (void) 0 : (v = 0));
+ return v;
+}
More information about the Gcc-patches
mailing list