aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim@codesourcery.com>2010-08-18 10:34:02 +0000
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>2010-08-18 10:34:02 +0000
commitc701e857d83417daf6a691d1817c9aa08dcf3605 (patch)
treec5f3f41546d28f39779ef0690fb7793e6c4c41ff /gcc
parent63d90a96304b484a365e8411578413b40a2b1a35 (diff)
downloadgcc-c701e857d83417daf6a691d1817c9aa08dcf3605.zip
gcc-c701e857d83417daf6a691d1817c9aa08dcf3605.tar.gz
gcc-c701e857d83417daf6a691d1817c9aa08dcf3605.tar.bz2
re PR rtl-optimization/42575 (arm-eabi-gcc 64-bit multiply weirdness)
gcc/ PR rtl-optimization/42575 * optabs.c (expand_doubleword_mult): Generate new pseudos to shorten live ranges. gcc/testsuite/ PR rtl-optimization/42575 * gcc.target/pr42575.c: New test. From-SVN: r163334
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/optabs.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/pr42575.c9
4 files changed, 22 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 48ee833..c16adad 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-08-18 Maxim Kuvyrkov <maxim@codesourcery.com>
+
+ PR rtl-optimization/42575
+ * optabs.c (expand_doubleword_mult): Generate new pseudos to shorten
+ live ranges.
+
2010-08-18 Marcus Shawcroft <marcus.shawcroft@arm.com>
* config/arm/arm-protos.h (arm_expand_sync): New.
diff --git a/gcc/optabs.c b/gcc/optabs.c
index b9db02f..1fcbedc 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -1257,7 +1257,7 @@ expand_doubleword_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target,
/* OP1_HIGH should now be dead. */
adjust = expand_binop (word_mode, add_optab, adjust, temp,
- adjust, 0, OPTAB_DIRECT);
+ NULL_RTX, 0, OPTAB_DIRECT);
if (target && !REG_P (target))
target = NULL_RTX;
@@ -1274,8 +1274,7 @@ expand_doubleword_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target,
product_high = operand_subword (product, high, 1, mode);
adjust = expand_binop (word_mode, add_optab, product_high, adjust,
- REG_P (product_high) ? product_high : adjust,
- 0, OPTAB_DIRECT);
+ NULL_RTX, 0, OPTAB_DIRECT);
emit_move_insn (product_high, adjust);
return product;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 10a8aff..d71fa99 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-18 Maxim Kuvyrkov <maxim@codesourcery.com>
+
+ PR rtl-optimization/42575
+ * gcc.target/pr42575.c: New test.
+
2010-08-18 Iain Sandoe <iains@gcc.gnu.org>
* lib/target-supports.exp (check_effective_target_tls_emulated): New.
diff --git a/gcc/testsuite/gcc.target/arm/pr42575.c b/gcc/testsuite/gcc.target/arm/pr42575.c
new file mode 100644
index 0000000..474bf6c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr42575.c
@@ -0,0 +1,9 @@
+/* { dg-options "-O2 -march=armv7-a" } */
+/* Make sure RA does good job allocating registers and avoids
+ unnecessary moves. */
+/* { dg-final { scan-assembler-not "mov" } } */
+
+long long longfunc(long long x, long long y)
+{
+ return x * y;
+}