This is caused by subregs not being allowed in addresses. The splitter generates something that is not recognized as a *lea_1_rex64 pattern. More on this at http://gcc.gnu.org/ml/gcc-patches/2005-03/msg02072.html Paolo
This patch should go in 4.0.0, because it blocks PR19454.
Committed fix at http://gcc.gnu.org/ml/gcc-cvs/2005-04/msg00019.html
Subject: Bug 20600 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: bonzini@gcc.gnu.org 2005-04-01 11:23:08 Modified files: gcc : ChangeLog combine.c gcc/config/i386: i386.c Log message: 2005-04-01 Paolo Bonzini <bonzini@gnu.org> PR middle-end/19454 PR rtl-optimization/20600 * combine.c (gen_binary): Remove. (known_cond, simplify_shift_const, find_split_point, combine_simplify_rtx, simplify_if_then_else, simplify_set, simplify_logical, expand_field_assignment, extract_left_shift, force_to_mode, if_then_else_cond, apply_distributive_law, simplify_and_const_int, simplify_shift_const, gen_lowpart_for_combine, simplify_comparison, reversed_comparison): Replace with simplify_gen_binary, simplify_gen_relational or distribute_and_simplify_rtx. (distribute_and_simplify_rtx): New function. * config/i386/i386.c (ix86_decompose_address): Look inside SUBREGs to fix addresses involving EBP and ESP. (aligned_operand, legitimate_address_p, ix86_address_cost): Be prepared for SUBREGed registers. (legitimate_address_p): Accept SUBREGed registers. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.107&r2=2.7592.2.108 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/combine.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.475.4.1&r2=1.475.4.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/i386/i386.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.795.6.1&r2=1.795.6.2