aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-09-20 22:41:08 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-09-20 22:41:08 +0200
commit220c5f0c7f75f556a37f0b8ae25c1f5a3a69240f (patch)
treefd6859a437a2904175c94cfdd0e4b0b0a34c9f46
parent0a7a6af67e6311a427052ef6fc21f6df72be7b51 (diff)
downloadgcc-220c5f0c7f75f556a37f0b8ae25c1f5a3a69240f.zip
gcc-220c5f0c7f75f556a37f0b8ae25c1f5a3a69240f.tar.gz
gcc-220c5f0c7f75f556a37f0b8ae25c1f5a3a69240f.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr45728.c17
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5538b50..cad3a43 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2010-09-20 Jakub Jelinek <jakub@redhat.com>
+ 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 e99eabe..6b56383 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 3d4bcf9..13d783d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/45728
+ * gcc.c-torture/compile/pr45728.c: New test.
+
2010-09-20 Paul Thomas <pault@gcc.gnu.org>
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 0000000..a6ee10b
--- /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;
+}