Hi As described in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47855, there are many insn patterns don't compute attribute length correctly. This patch is the first and simplest part of the fixing.
This patch has been tested on qemu. thanks Carrot ChangeLog: 2011-03-26 Wei Guozhi <car...@google.com> PR target/47855 * config/arm/arm.md (arm_cmpsi_insn): Compute attr "length". (arm_cond_branch): Likewise. (arm_cond_branch_reversed): Likewise. (arm_jump): Likewise. (push_multi): Likewise. Index: arm.md =================================================================== --- arm.md (revision 171337) +++ arm.md (working copy) @@ -7115,7 +7115,18 @@ "@ cmp%?\\t%0, %1 cmn%?\\t%0, #%n1" - [(set_attr "conds" "set")] + [(set_attr "conds" "set") + (set (attr "length") + (if_then_else + (and (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0)) + (eq (symbol_ref "which_alternative") (const_int 0))) + (ior (ne (symbol_ref "REG_P (operands[1])") (const_int 0)) + (and (ne (symbol_ref "CONST_INT_P (operands[1])") (const_int 0)) + (and (ge (symbol_ref "INTVAL (operands[1])") (const_int 0)) + (le (symbol_ref "INTVAL (operands[1])") + (const_int 255)))))) + (const_int 2) + (const_int 4)))] ) (define_insn "*cmpsi_shiftsi" @@ -7286,7 +7297,14 @@ return \"b%d1\\t%l0\"; " [(set_attr "conds" "use") - (set_attr "type" "branch")] + (set_attr "type" "branch") + (set (attr "length") + (if_then_else + (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0)) + (and (ge (minus (match_dup 0) (pc)) (const_int -250)) + (le (minus (match_dup 0) (pc)) (const_int 256)))) + (const_int 2) + (const_int 4)))] ) (define_insn "*arm_cond_branch_reversed" @@ -7305,7 +7323,14 @@ return \"b%D1\\t%l0\"; " [(set_attr "conds" "use") - (set_attr "type" "branch")] + (set_attr "type" "branch") + (set (attr "length") + (if_then_else + (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0)) + (and (ge (minus (match_dup 0) (pc)) (const_int -250)) + (le (minus (match_dup 0) (pc)) (const_int 256)))) + (const_int 2) + (const_int 4)))] ) @@ -7757,7 +7782,14 @@ return \"b%?\\t%l0\"; } " - [(set_attr "predicable" "yes")] + [(set_attr "predicable" "yes") + (set (attr "length") + (if_then_else + (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0)) + (and (ge (minus (match_dup 0) (pc)) (const_int -2044)) + (le (minus (match_dup 0) (pc)) (const_int 2048)))) + (const_int 2) + (const_int 4)))] ) (define_insn "*thumb_jump" @@ -10256,7 +10288,26 @@ return \"\"; }" - [(set_attr "type" "store4")] + [(set_attr "type" "store4") + (set (attr "length") + (if_then_else + (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0)) + (ne (symbol_ref "{ + int i, regno, hi_reg; + int num_saves = XVECLEN (operands[2], 0); + regno = REGNO (operands[1]); + hi_reg = (REGNO_REG_CLASS (regno) == HI_REGS) + && (regno != LR_REGNUM); + for (i = 1; i < num_saves; i++) + { + regno = REGNO (XEXP (XVECEXP (operands[2], 0, i), 0)); + hi_reg |= (REGNO_REG_CLASS (regno) == HI_REGS) + && (regno != LR_REGNUM); + } + !hi_reg; }") + (const_int 0))) + (const_int 2) + (const_int 4)))] ) (define_insn "stack_tie"