From b9da76de89731a1f9be1d256157dfec4cdf5d323 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 9 Jul 2009 13:19:22 +0200 Subject: [PATCH] re PR middle-end/40692 (Endless recursion between fold_ternary and fold_cond_expr_with_comparison) PR middle-end/40692 * fold-const.c (fold_cond_expr_with_comparison): Don't replace arg1 with arg01 if arg1 is already INTEGER_CST. * gcc.c-torture/compile/pr40692.c: New test. From-SVN: r149418 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr40692.c | 15 +++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr40692.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0347c24ae88..cc7e18644ed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-07-09 Jakub Jelinek + + PR middle-end/40692 + * fold-const.c (fold_cond_expr_with_comparison): Don't replace + arg1 with arg01 if arg1 is already INTEGER_CST. + 2009-07-08 Adam Nemet * simplify-rtx.c (simplify_binary_operation_1) : Transform (and diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 670fa45e497..f3e0614a4a6 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5303,6 +5303,8 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2) switch (comp_code) { case EQ_EXPR: + if (TREE_CODE (arg1) == INTEGER_CST) + break; /* We can replace A with C1 in this case. */ arg1 = fold_convert (type, arg01); return fold_build3 (COND_EXPR, type, arg0, arg1, arg2); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 63b2df4d0ce..736c22f5e8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-07-09 Jakub Jelinek + + PR middle-end/40692 + * gcc.c-torture/compile/pr40692.c: New test. + 2009-07-09 Tobias Burnus PR fortran/40604 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr40692.c b/gcc/testsuite/gcc.c-torture/compile/pr40692.c new file mode 100644 index 00000000000..567516e6915 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr40692.c @@ -0,0 +1,15 @@ +/* PR middle-end/40692 */ + +#define M1(x) (((x) & 0x00000002) ? 0x2 : ((x) & 0x1)) +#define M2(x) (((x) & 0x0000000c) ? M1 ((x) >> 2) << 2 : M1 (x)) +#define M3(x) (((x) & 0x000000f0) ? M2 ((x) >> 4) << 4 : M2 (x)) +#define M4(x) (((x) & 0x0000ff00) ? M3 ((x) >> 8) << 8 : M3 (x)) +#define M5(x) (((x) & 0xffff0000) ? M4 ((x) >> 16) << 16 : M4 (x)) + +struct A { char e; char f; }; + +long +foo (void) +{ + return M5 (4096UL - (long) &((struct A *) 0)->f); +} -- 2.30.2