Hi, I'm implementing a loop peeling function used in tree-ssa-loop-prefetch.c according to the following comment,
/* Step 5: unroll the loop. TODO -- peeling of first and last few iterations so that we do not issue superfluous prefetches. */ I take the functions slpeel_* in tree-vercterizer.c as a reference. Firstly generate a loop copy and then reset the niters of the first loop. But, a bug occurs during the out-of-ssa pass. For now I just know it is caused by reseting the niters (actually, I use the slpeel_make_loop_iterate_ntimes), but can't see the deep reason. Who can give me some suggestions? The original loop looks like this, loop_9 (header = 51, latch = 52, niter = D.1620_125 + 4294967295, upper_bound = 4294967295) { bb_51 (preds = {bb_52 bb_50 }, succs = {bb_52 bb_53 }) { <bb 51>: # i_298 = PHI <i_163(52), 0(50)> # SMT.23_307 = PHI <SMT.23_270(52), SMT.23_263(50)> # SMT.24_305 = PHI <SMT.24_266(52), SMT.24_247(50)> # SMT.26_303 = PHI <SMT.26_268(52), SMT.26_249(50)> # SMT.27_300 = PHI <SMT.27_271(52), SMT.27_264(50)> # prephitmp.192_538 = PHI <D.1634_162(52), 0(50)> # SMT.244_531 = PHI <SMT.244_606(52), SMT.244_605(50)> D.1629_157 = ImageOutPtr_127 + i_298; # VUSE <SMT.23_307, SMT.24_305, SMT.26_303, SMT.27_300, SMT.244_531> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1630_158 = *D.1629_157; D.1631_159 = (int) D.1630_158; D.1633_161 = (int) prephitmp.192_538; # SMT.23_265 = VDEF <SMT.23_307> # SMT.24_266 = VDEF <SMT.24_305> # SMT.26_268 = VDEF <SMT.26_303> # SMT.27_269 = VDEF <SMT.27_300> # SMT.244_606 = VDEF <SMT.244_531> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1634_162 = Calc_crc16 (D.1631_159, D.1633_161); # SMT.23_270 = VDEF <SMT.23_265> # SMT.27_271 = VDEF <SMT.27_269> { SMT.23 SMT.27 } tcdef_129(D)->CRC = D.1634_162; i_163 = i_298 + 1; if (D.1620_125 > i_163) goto <bb 52>; else goto <bb 53>; } bb_52 (preds = {bb_51 }, succs = {bb_51 }) { <bb 52>: goto <bb 51>; } } After loop copying and niters reseting, loop_10 (header = 56, latch = 57, niter = ) { bb_56 (preds = {bb_57 bb_51 }, succs = {bb_57 bb_53 }) { <bb 56>: # i_302 = PHI <i_620(57), i_163(51)> # SMT.23_304 = PHI <SMT.23_622(57), SMT.23_270(51)> # SMT.24_295 = PHI <SMT.24_506(57), SMT.24_266(51)> # SMT.26_109 = PHI <SMT.26_505(57), SMT.26_268(51)> # SMT.27_323 = PHI <SMT.27_621(57), SMT.27_271(51)> # prephitmp.192_322 = PHI <D.1634_508(57), D.1634_162(51)> # SMT.244_174 = PHI <SMT.244_623(57), SMT.244_606(51)> D.1629_524 = ImageOutPtr_127 + i_302; # VUSE <SMT.23_304, SMT.24_295, SMT.26_109, SMT.27_323, SMT.244_174> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1630_516 = *D.1629_524; D.1631_629 = (int) D.1630_516; D.1633_509 = (int) prephitmp.192_322; # SMT.23_507 = VDEF <SMT.23_304> # SMT.24_506 = VDEF <SMT.24_295> # SMT.26_505 = VDEF <SMT.26_109> # SMT.27_624 = VDEF <SMT.27_323> # SMT.244_623 = VDEF <SMT.244_174> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1634_508 = Calc_crc16 (D.1631_629, D.1633_509); # SMT.23_622 = VDEF <SMT.23_507> # SMT.27_621 = VDEF <SMT.27_624> { SMT.23 SMT.27 } tcdef_129(D)->CRC = D.1634_508; i_620 = i_302 + 1; if (D.1620_125 > i_620) goto <bb 57>; else goto <bb 53>; } bb_57 (preds = {bb_56 }, succs = {bb_56 }) { <bb 57>: goto <bb 56>; } } loop_9 (header = 51, latch = 52, niter = , upper_bound = 4294967295) { bb_51 (preds = {bb_52 bb_50 }, succs = {bb_52 bb_56 }) { <bb 51>: # i_298 = PHI <i_163(52), 0(50)> # SMT.23_307 = PHI <SMT.23_270(52), SMT.23_263(50)> # SMT.24_305 = PHI <SMT.24_266(52), SMT.24_247(50)> # SMT.26_303 = PHI <SMT.26_268(52), SMT.26_249(50)> # SMT.27_300 = PHI <SMT.27_271(52), SMT.27_264(50)> # prephitmp.192_538 = PHI <D.1634_162(52), 0(50)> # SMT.244_531 = PHI <SMT.244_606(52), SMT.244_605(50)> # ivtmp.245_615 = PHI <ivtmp.245_614(52), 0(50)> D.1629_157 = ImageOutPtr_127 + i_298; # VUSE <SMT.23_307, SMT.24_305, SMT.26_303, SMT.27_300, SMT.244_531> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1630_158 = *D.1629_157; D.1631_159 = (int) D.1630_158; D.1633_161 = (int) prephitmp.192_538; # SMT.23_265 = VDEF <SMT.23_307> # SMT.24_266 = VDEF <SMT.24_305> # SMT.26_268 = VDEF <SMT.26_303> # SMT.27_269 = VDEF <SMT.27_300> # SMT.244_606 = VDEF <SMT.244_531> { SMT.23 SMT.24 SMT.26 SMT.27 SMT.244 } D.1634_162 = Calc_crc16 (D.1631_159, D.1633_161); # SMT.23_270 = VDEF <SMT.23_265> # SMT.27_271 = VDEF <SMT.27_269> { SMT.23 SMT.27 } tcdef_129(D)->CRC = D.1634_162; i_163 = i_298 + 1; ivtmp.245_614 = ivtmp.245_615 + 1; if (ivtmp.245_614 < 10) goto <bb 52>; else goto <bb 56>; } bb_52 (preds = {bb_51 }, succs = {bb_51 }) { <bb 52>: goto <bb 51>; } } The error is reported in build2_stat, by gcc_assert (POINTER_TYPE_P (tt) && POINTER_TYPE_P (TREE_TYPE (arg0)) && INTEGRAL_TYPE_P (TREE_TYPE (arg1)) && useless_type_conversion_p (sizetype, TREE_TYPE (arg1))); (gdb) bt #0 fancy_abort (file=0x8747f60 "../../gcc-4.4.0/gcc/tree.c", line=3303, function=0x874953d "build2_stat") at ../../gcc-4.4.0/gcc/diagnostic.c:712 #1 0x0849ed4d in build2_stat (code=POINTER_PLUS_EXPR, tt=0xb7d11478, arg0=0xb7d10aa8, arg1=0xb7b59840) at ../../gcc-4.4.0/gcc/tree.c:3301 #2 0x0860179f in gimple_assign_rhs_to_tree (stmt=0xb7b60780) at ../../gcc-4.4.0/gcc/cfgexpand.c:59 #3 0x083a02b8 in replace_use_variable (map=0x89ba758, p=0xb7b484d4, expr=0x89ed7b0) at ../../gcc-4.4.0/gcc/tree-outof-ssa.c:567 #4 0x083a06cb in rewrite_trees (map=0x89ba758, values=0x89ed7b0) at ../../gcc-4.4.0/gcc/tree-outof-ssa.c:774 #5 0x083a19d4 in remove_ssa_form (perform_ter=1 '\001') at ../../gcc-4.4.0/gcc/tree-outof-ssa.c:1381 #6 0x083a1d9b in rewrite_out_of_ssa () at ../../gcc-4.4.0/gcc/tree-outof-ssa.c:1506 Thanks, Eric