I'd like to ping this patch as it fixed an ICE visible on both ia64 linux and 
ia64 openvms.

Tristan.

On Mar 6, 2012, at 11:07 PM, Eric Botcazou wrote:

> We have a regression on one of the testcases of our internal testsuite on 
> IA-64 
> with a 4.7-based compiler, which is of the form:
> 
> test_vec_madd.adb: In function 'Test_Vec_Madd':
> test_vec_madd.adb:160:5: error: could not split insn
> (insn 887 4859 889 16 (set (reg:TI 158 f30 [orig:417 m ] [417])
>        (mem/c:TI (reg/f:DI 14 r14 [1025]) [0 S16 A128])) /gnu/lib/gcc/ia64-hp-
> openvms/4_7_0/adainclude/g-altcon.adb:277 125 {movti_internal}
>     (nil))
> +===========================GNAT BUG DETECTED==============================+
> | Pro 7.1.0w (20120221-head) (ia64-hp-openvms) GCC error:                  |
> | in final_scan_insn, at final.c:2716                                      |
> | Error detected around test_vec_madd.adb:160:5|
> 
> The compiler aborts during the final pass because it couldn't split the insn.
> The pattern for movti_internal is:
> 
> (define_insn_and_split "movti_internal"
>  [(set (match_operand:TI 0 "destination_operand" "=r,   *fm,*x,*f,  Q")
>       (match_operand:TI 1 "general_operand"     "r*fim,r,  Q, *fOQ,*f"))]
>  "ia64_move_ok (operands[0], operands[1])"
>  "@
>   #
>   #
>   ldfp8 %X0 = %1%P1
>   #
>   #"
>  "reload_completed && !ia64_load_pair_ok(operands[0], operands[1])"
>  [(const_int 0)]
> 
> The problem is that the operands satisfy ia64_load_pair_ok so the splitter
> cannot be invoked on them.  The root cause is a discrepancy between this
> predicate and how the 'x' constraint is interpreted.  The predicate uses
> FP_REGNO_P to check the destination and this returns true for %f30 (but would
> return false for the immediately following register %f31).  But recog 
> interprets the 'x' constraint as meaning that every hard register in the 
> destination must be in the FP_REGS class; now the mode is TImode so both %f30 
> and %f31 are taken into account and %f31 isn't in the FP_REGS class, so the 
> operand is rejected.
> 
> AFAICS the problem dates back to the introduction of the code (r102463), so 
> I'm 
> not sure that we want to rewrite it at this point.  That's why the attached 
> patch is a simple workaround that just avoid ICEing.
> 
> Bootstrapped/regtested on IA-64/Linux, OK for the mainline?  Do we also want 
> it 
> for 4.7.1 (I assume that some RA change makes the issue visible in 4.7.x)?
> 
> 
> 2012-03-06  Eric Botcazou  <ebotca...@adacore.com>
> 
>       * config/ia64/ia64.c (ia64_load_pair_ok): Return 0 if the second member
>       of the destination isn't also a FP_REGS register.
> 
> 
> -- 
> Eric Botcazou
> <p1.diff>

Reply via email to