On 10/8/18 9:52 AM, Jeff Law wrote: > My tester is showing a variety of problems as well. hppa, sh4, aarch64, > aarch64_be, alpha arm* and s390x bootstraps are all failing at various > points. Others may trickle in over time, but clearly something went > wrong recently. I'm going to start trying to pick them off after the > morning meetings are wrapped up.
Hi Vlad and Jeff, I looked into the PA-RISC test case issue Jeff sent me that is caused by my patch that handles conflicts wrt reg copies and I _think_ I have a handle on what the problem is, but don't yet know how to fix. Jeff, I agree with the analysis you gave in your email to me, but to get Vlad up to speed, here it is again along with some additional info. Compiling the test case, we have the following RTL during IRA. I have also annotated the pseudos in the RTL to include their hard reg assignment: (insn 30 19 32 3 (set (reg/f:SI 112 "%r19") ....)) (insn 32 30 20 3 (set (reg:SI 26 %r26) (reg/f:SI 101 "%r26"))) [snip] (insn 23 22 49 3 (set (reg:SI 109 "%r28") (mem:SI (reg/f:SI 101 "%r26")))) (insn 49 23 31 3 (set (reg/f:SI 100 "%r28") (if_then_else:SI (eq (reg:SI 109 "%r28") (const_int 15 [0xf])) (reg/f:SI 101 "%r26") (const_int 0 [0]))) (expr_list:REG_DEAD (reg:SI 109 "%r28") (expr_list:REG_DEAD (reg/f:SI 101 "%r26")))) (insn 31 49 33 3 (set (mem/f:SI (reg/f:SI 112 "%r19")) (reg/f:SI 100 "%r28")) (expr_list:REG_DEAD (reg/f:SI 112 "%r19") (expr_list:REG_DEAD (reg/f:SI 100 "%r28")))) (call_insn 33 31 36 3 (parallel [ (call (mem:SI (symbol_ref/v:SI ("@_Z3yowP11dw_cfi_node")) (const_int 16 [0x10])) (clobber (reg:SI 1 %r1)) (clobber (reg:SI 2 %r2)) (use (const_int 0 [0]))]) (expr_list:REG_DEAD (reg:SI 26 %r26)) (expr_list:SI (use (reg:SI 26 %r26))))) Before my patch, hard reg %r26 and pseudo 101 conflicted, but with my patch they now (correctly) do not. IRA is able to assign hard regs to all of the pseudos, but the constraints in the pattern for insn 49 forces op0 (pseudo 100) and op1 (pseudo 101) to have the same hard reg. They are not, so LRA comes along and spills insn 49 with the following reloads: Reloads for insn # 49 Reload 0: reload_in (SI) = (reg/f:SI 26 %r26 [orig:101 _10 ] [101]) reload_out (SI) = (reg/f:SI 28 %r28 [orig:100 iftmp.2_5 ] [100]) GENERAL_REGS, RELOAD_OTHER (opnum = 0) reload_in_reg: (reg/f:SI 26 %r26 [orig:101 _10 ] [101]) reload_out_reg: (reg/f:SI 28 %r28 [orig:100 iftmp.2_5 ] [100]) reload_reg_rtx: (reg/f:SI 26 %r26 [orig:101 _10 ] [101]) ..giving us the following updated insn: (insn 49 23 58 3 (set (reg/f:SI 26 %r26 [101]) (if_then_else:SI (eq (reg:SI 28 %r28 [109]) (const_int 15)) (reg/f:SI 26 %r26 [101]) (const_int 0 [0])))) The problem is, that hard reg %r26 is defined in insn 32, to be used in insn 33, so using %r26 as the reload reg is wrong, because it will clobber the value we set in insn 32. Looking thru LRA, it looks like LRA assumes that for a reload, if one of the input pseudos dies in the insn, then the hard reg it was assigned to is available to use. That assumption is (now) wrong, because another pseudo may be using that hard reg or in this case, the hard reg itself is still live. For this example, pseudo 109 also dies in insn 49 and since it's hard reg %r28 isn't live thru the insn, we could have used that instead. However, we cannot just look at REG_DEAD notes for free hard regs to use for reload regs. We need to make sure that that hard reg isn't also assigned to another pseudo that is live at that insn or even that the hard reg itself is live. Vlad, you know the LRA code better than anyone. Will it be easy to find all the places where we create reload regs and fix them up so that we look at more than just REG_DEAD notes? Even though looking at REG_DEAD notes isn't enough, I still think the majority of the time those regs probably will be free to use, we just have to check for the special cases like above where they are not. Peter