We ran into an ICE at -Os on the 4.7 branch for ARM (BE/VFPv3/ARM):

FAIL: gcc.c-torture/compile/920928-2.c  -Os  (internal compiler error)

It's an assertion deep in the ARM back-end:

  /* If an insn doesn't have a range defined for it, then it isn't
     expecting to be reworked by this code.  Better to stop now than
     to generate duff assembly code.  */
  gcc_assert (fix->forwards || fix->backwards);

This happens for arm_zero_extendhisi2_v6, but I fail to see what is different 
for it from arm_extendhisi2_v6, which is expecting to be reworked.

Hence the attached patch, which copies attributes from arm_extendhisi2_v6 to 
arm_zero_extendhisi2_v6.  No regressions on ARM, OK for the mainline?


2013-03-23  Eric Botcazou  <ebotca...@adacore.com>

        * config/arm/arm.md (arm_zero_extendhisi2): Add pool_range and
        neg_pool_range attributes.
        (arm_zero_extendhisi2_v6): Likewise.


-- 
Eric Botcazou
Index: config/arm/arm.md
===================================================================
--- config/arm/arm.md	(revision 196816)
+++ config/arm/arm.md	(working copy)
@@ -4650,7 +4650,9 @@ (define_insn "*arm_zero_extendhisi2"
    #
    ldr%(h%)\\t%0, %1"
   [(set_attr "type" "alu_shift,load_byte")
-   (set_attr "predicable" "yes")]
+   (set_attr "predicable" "yes")
+   (set_attr "pool_range" "*,256")
+   (set_attr "neg_pool_range" "*,244")]
 )
 
 (define_insn "*arm_zero_extendhisi2_v6"
@@ -4660,8 +4662,10 @@ (define_insn "*arm_zero_extendhisi2_v6"
   "@
    uxth%?\\t%0, %1
    ldr%(h%)\\t%0, %1"
-  [(set_attr "predicable" "yes")
-   (set_attr "type" "simple_alu_shift,load_byte")]
+  [(set_attr "type" "simple_alu_shift,load_byte")
+   (set_attr "predicable" "yes")
+   (set_attr "pool_range" "*,256")
+   (set_attr "neg_pool_range" "*,244")]
 )
 
 (define_insn "*arm_zero_extendhisi2addsi"

Reply via email to