From 220c5f0c7f75f556a37f0b8ae25c1f5a3a69240f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 20 Sep 2010 22:41:08 +0200 Subject: [PATCH] re PR rtl-optimization/45728 (ICE: in gen_lowpart_general, at rtlhooks.c:59 at -O1 when comparing union members) PR rtl-optimization/45728 * expr.c (expand_expr_real_1): If op0 isn't REG or MEM, try gen_lowpart_common first and if that fails, force_reg first before calling gen_lowpart. * gcc.c-torture/compile/pr45728.c: New test. From-SVN: r164456 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 10 +++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr45728.c | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr45728.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5538b500092..cad3a439a6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2010-09-20 Jakub Jelinek + PR rtl-optimization/45728 + * expr.c (expand_expr_real_1): If op0 isn't REG or MEM, try + gen_lowpart_common first and if that fails, force_reg first + before calling gen_lowpart. + PR middle-end/45678 * cfgexpand.c (expand_one_stack_var_at): Use crtl->max_used_stack_slot_alignment as max_align, instead diff --git a/gcc/expr.c b/gcc/expr.c index e99eabe6306..6b56383f249 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -9381,7 +9381,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, { if (GET_CODE (op0) == SUBREG) op0 = force_reg (GET_MODE (op0), op0); - op0 = gen_lowpart (mode, op0); + temp = gen_lowpart_common (mode, op0); + if (temp) + op0 = temp; + else + { + if (!REG_P (op0) && !MEM_P (op0)) + op0 = force_reg (GET_MODE (op0), op0); + op0 = gen_lowpart (mode, op0); + } } /* If both types are integral, convert from one mode to the other. */ else if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (treeop0))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3d4bcf94157..13d783d058c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-20 Jakub Jelinek + + PR rtl-optimization/45728 + * gcc.c-torture/compile/pr45728.c: New test. + 2010-09-20 Paul Thomas PR fortran/45081 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr45728.c b/gcc/testsuite/gcc.c-torture/compile/pr45728.c new file mode 100644 index 00000000000..a6ee10b8cd1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr45728.c @@ -0,0 +1,17 @@ +/* PR rtl-optimization/45728 */ + +union U +{ + int *m; + double d; +}; + +int i; +union U u; + +int +foo (void) +{ + union U v = { &i }; + return u.d == v.d; +} -- 2.30.2