Hello, > We did just this change
> (on top of SMS patches we intend to send in the next > couple of weeks) and it did helped a lot - we succeeded on all unrolled > loops that could not be SMSed before. Do you think it is safe to remove this > check? There was no regressions found in our testing. For note, we did our > work on gcc 4.1 based branch. what change? Could you please send me the patch? If you mean just removing the check in doloop_condition_get, that is definitely wrong and cannot change anything (at least on mainline, I am not sure about 4.1 branch -- but anyway, you cannot submit new changes for 4.1). Zdenek > Thanks, > Vladimir > > On 6/12/07, Zdenek Dvorak <[EMAIL PROTECTED]> wrote: > > > >Hello, > > > >> To make sure I understood you correctly, does it mean that the change > >> (below in /* */) in doloop_condition_get is safe? > >> > >> /* We expect a GE or NE comparison with 0 or 1. */ > >> if (/*(GET_CODE (condition) != GE > >> && GET_CODE (condition) != NE) > >> ||*/ (XEXP (condition, 1) != const0_rtx > >> && XEXP (condition, 1) != const1_rtx)) > >> return 0; > > > >no; that there is nothing wrong with doloop_condition_get -- > >changing it will not help, as it is not applied to the > >exit condition of the loop at all. The problem must be somewhere > >else. > > > >Zdenek > > > >> Thanks, > >> Vladimir > >> > >> > >> On 6/12/07, Zdenek Dvorak <[EMAIL PROTECTED]> wrote: > >> >Hello, > >> > > >> >> In file loop_doloop.c function doloop_condition_get makes sure that > >> >> the condition is GE or NE > >> >> otherwise it prevents doloop optimizations. This caused a problem for > >> >> a loop which had NE condition without unrolling and EQ if unrolling > >> >> was run. > >> > > >> >actually, doloop_condition_get is not applied to the code of the > >> >program, so this change is irrelevant (doloop_condition_get is applied > >> >to the doloop pattern from the machine description). So there must be > >> >some other reason why doloop transformation is not applied for your > >> >loop. > >> > > >> >Zdenek > >> > > >> >> Can I make doloop work after the unroller? > >> >> > >> >> Thanks, > >> >> Vladimir > >> >> > >> >> > >> > >>---------------------------------------------------------------------------------------- > >> >> Without unrolling: > >> >> (insn 135 80 136 4 (set (reg:SI 204 [ LastIndex ]) > >> >> (plus:SI (reg:SI 204 [ LastIndex ]) > >> >> (const_int -1 [0xffffffffffffffff]))) 51 {addsi3} (nil) > >> >> (nil)) > >> >> > >> >> (jump_insn 136 135 84 4 (set (pc) > >> >> (if_then_else (ne:SI (reg:SI 204 [ LastIndex ]) > >> >> (const_int 0 [0x0])) > >> >> (label_ref:SI 69) > >> >> (pc))) 368 {*spu.md:3288} (insn_list:REG_DEP_TRUE 135 > >(nil)) > >> >> (expr_list:REG_BR_PROB (const_int 9000 [0x2328]) > >> >> (nil))) > >> >> > >> >> > >> >> After unrolling: > >> >> (insn 445 421 446 21 (set (reg:SI 213) > >> >> (plus:SI (reg:SI 213) > >> >> (const_int -1 [0xffffffffffffffff]))) 51 {addsi3} (nil) > >> >> (nil)) > >> >> > >> >> (jump_insn 446 445 667 21 (set (pc) > >> >> (if_then_else (eq:SI (reg:SI 213) > >> >> (const_int 0 [0x0])) > >> >> (label_ref:SI 465) > >> >> (pc))) 368 {*spu.md:3288} (insn_list:REG_DEP_TRUE 445 > >(nil)) > >> >> (expr_list:REG_BR_PROB (const_int 1000 [0x3e8]) > >> >> (nil))) > >> > > >