aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2010-08-17 15:49:32 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2010-08-17 08:49:32 -0700
commit1c111d0a5874d378f3e80c057255b2edb1bf0836 (patch)
tree2dd7ee12e470dc49dda87653d8123bb331b108a4 /gcc
parente2a1fcf0add4aaa44ac743278eacf623d9f39f62 (diff)
downloadgcc-1c111d0a5874d378f3e80c057255b2edb1bf0836.zip
gcc-1c111d0a5874d378f3e80c057255b2edb1bf0836.tar.gz
gcc-1c111d0a5874d378f3e80c057255b2edb1bf0836.tar.bz2
Try to avoid lea if possible.
2010-08-17 H.J. Lu <hongjiu.lu@intel.com> * config/i386/i386.c (ix86_lea_for_add_ok): For !TARGET_OPT_AGU or optimizing for size, always avoid lea if possible. * config/i386/i386.md (*add<mode>_1): Always avoid lea if possible. From-SVN: r163310
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.c18
-rw-r--r--gcc/config/i386/i386.md11
3 files changed, 21 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 61f3c19..47aa331 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2010-08-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/i386/i386.c (ix86_lea_for_add_ok): For !TARGET_OPT_AGU
+ or optimizing for size, always avoid lea if possible.
+
+ * config/i386/i386.md (*add<mode>_1): Always avoid lea if
+ possible.
+
2010-08-17 Iain Sandoe <iains@gcc.gnu.org>
* unwind-dw2-fde-darwin.c (_darwin10_Unwind_FindEnclosingFunction):
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b925122..f1d4402 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -14802,10 +14802,10 @@ distance_agu_use (unsigned int regno0, rtx insn)
#define IX86_LEA_PRIORITY 2
/* Return true if it is ok to optimize an ADD operation to LEA
- operation to avoid flag register consumation. For the processors
- like ATOM, if the destination register of LEA holds an actual
- address which will be used soon, LEA is better and otherwise ADD
- is better. */
+ operation to avoid flag register consumation. For most processors,
+ ADD is faster than LEA. For the processors like ATOM, if the
+ destination register of LEA holds an actual address which will be
+ used soon, LEA is better and otherwise ADD is better. */
bool
ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
@@ -14813,16 +14813,14 @@ ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
{
unsigned int regno0 = true_regnum (operands[0]);
unsigned int regno1 = true_regnum (operands[1]);
- unsigned int regno2;
-
- if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
- return regno0 != regno1;
-
- regno2 = true_regnum (operands[2]);
+ unsigned int regno2 = true_regnum (operands[2]);
/* If a = b + c, (a!=b && a!=c), must use lea form. */
if (regno0 != regno1 && regno0 != regno2)
return true;
+
+ if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
+ return false;
else
{
int dist_define, dist_use;
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 0041158..f6ab0e2 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -5813,8 +5813,10 @@
}
default:
- /* Use add as much as possible to replace lea for AGU optimization. */
- if (which_alternative == 2 && TARGET_OPT_AGU)
+ /* This alternative was added for TARGET_OPT_AGU to use add as
+ much as possible. But add is also faster than lea for
+ !TARGET_OPT_AGU. */
+ if (which_alternative == 2)
return "add{<imodesuffix>}\t{%1, %0|%0, %1}";
gcc_assert (rtx_equal_p (operands[0], operands[1]));
@@ -5825,10 +5827,7 @@
}
}
[(set (attr "type")
- (cond [(and (eq_attr "alternative" "2")
- (eq (symbol_ref "TARGET_OPT_AGU") (const_int 0)))
- (const_string "lea")
- (eq_attr "alternative" "3")
+ (cond [(eq_attr "alternative" "3")
(const_string "lea")
(match_operand:SWI48 2 "incdec_operand" "")
(const_string "incdec")