------- Additional Comments From dorit at il dot ibm dot com 2005-08-09 15:38 ------- I was able to reproduce the error on powerpc-drawin using the first testcase from comment 3 for PR22543.
I was also able to pin down the patch that triggered/exposed this problem: 2005-07-09 Diego Novillo <[EMAIL PROTECTED]> * Makefile.in (tree-ssa-alias.o): Depend on tree-ssa-structalias.h * tree-cfg.c (CHECK_OP): Only test for is_gimple_val. * tree-dfa.c (dump_subvars_for): New. (debug_subvars_for): New. (dump_variable): Show subvariables if VAR has them. ........ Here is what I think is going on: The updating of phi-nodes during loop-peeling (in the vectorizer) does not create all the required phis for the variable SFT.3. This happens because the vectorizer can only update the ssa-form for variables that are in proper loop- closed-ssa-form. SFT.3 is not in loop-closed-form, and in fact virtual variables in general are no longer guaranteed to be in loop-closed-form (or maybe never have been?). More specifically, the function slpeel_update_phi_nodes_for_guard2 was supposed to create the missing phis, but it only works for variables that have a loop-closed phi at the loop exit. The reason we don't fail in the presence of virtual-phis all the time, is, I think, that usually the virtual variables that need to be updated (due to peeling) are also used or defined inside the loop (in a load or store operation), and are therefore marked by the vectorizer for renaming when that load/store is handled (and update_ssa is consequently called). This was also what used to happen in this testcase, until the patch by Diego was committed - SFT.3 was used in the loop, and was therefore marked for renaming. This is how the loop looked like before the patch: # ivtmp.20D.2696_34 = PHI <ivtmp.20D.2696_2(2), 4(0)>; # SFT.4D.2672_41 = PHI <SFT.4D.2672_33(2), SFT.4D.2672_22(0)>; # SFT.3D.2671_39 = PHI <SFT.3D.2671_32(2), SFT.3D.2671_23(0)>; # iD.2620_37 = PHI <iD.2620_17(2), 0(0)>; <L0>:; # SFT.3D.2671_32 = V_MAY_DEF <SFT.3D.2671_39>; # SFT.4D.2672_33 = V_MAY_DEF <SFT.4D.2672_41>; thisD.2584_16->zD.2580[iD.2620_37] = 0; iD.2620_17 = iD.2620_37 + 1; ivtmp.20D.2696_2 = ivtmp.20D.2696_34 - 1; if (ivtmp.20D.2696_2 != 0) goto <L14>; else goto <L15>; And this is how the loop looks like now, after the patch: # ivtmp.37D.2713_4 = PHI <ivtmp.37D.2713_1(2), 4(0)>; # TMT.10D.2678_10 = PHI <TMT.10D.2678_11(2), TMT.10D.2678_9(0)>; # SFT.4D.2672_41 = PHI <SFT.4D.2672_41(2), SFT.4D.2672_22(0)>; # SFT.3D.2671_39 = PHI <SFT.3D.2671_39(2), SFT.3D.2671_23(0)>; # iD.2620_37 = PHI <iD.2620_17(2), 0(0)>; <L0>:; # TMT.10D.2678_11 = V_MAY_DEF <TMT.10D.2678_10>; thisD.2584_16->zD.2580[iD.2620_37] = 0; iD.2620_17 = iD.2620_37 + 1; ivtmp.37D.2713_1 = ivtmp.37D.2713_4 - 1; if (ivtmp.37D.2713_1 != 0) goto <L14>; else goto <L15>; SFT.3 no longer gets used inside the loop, so it doesn't get marked for renaming, and the proper phis do not get created. I tried to mark for renaming virtual variables that have phis in the loop, like this SFT.3, as follows: Index: tree-vectorizer.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-vectorizer.c,v retrieving revision 2.107 diff -c -3 -p -r2.107 tree-vectorizer.c *** tree-vectorizer.c 28 Jul 2005 16:29:57 -0000 2.107 --- tree-vectorizer.c 9 Aug 2005 12:20:00 -0000 *************** slpeel_update_phi_nodes_for_guard1 (edge *** 522,527 **** --- 522,532 ---- orig_phi && update_phi; orig_phi = PHI_CHAIN (orig_phi), update_phi = PHI_CHAIN (update_phi)) { + /* Virtual phi; Mark it for renaming. */ + /* CHECKME: skip? */ + if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (orig_phi)))) + mark_sym_for_renaming (SSA_NAME_VAR (PHI_RESULT (orig_phi))); + /** 1. Handle new-merge-point phis **/ /* 1.1. Generate new phi node in NEW_MERGE_BB: */ This patch didn't help although SFT.3 was marked for renaming. Diego, any ideas?? The other thing we could try to do is put virtual variables in loop-closed- form, at least just before the vectorizer, and at least just for some loops. (By the way, why don't we keep virtual variables in loop-closed-form?) -- What |Removed |Added ---------------------------------------------------------------------------- CC| |dnovillo at redhat dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22228