* [9fans] mulgen botch @ 2014-03-20 19:45 cinap_lenrek 2014-03-20 20:19 ` cinap_lenrek 0 siblings, 1 reply; 5+ messages in thread From: cinap_lenrek @ 2014-03-20 19:45 UTC (permalink / raw) To: 9fans multiplication by the constant 0 yields an "mulgen botch" error in 6c and 8c. this is probably a very rare case mostly used during debugging... would this be worth fixing? and if yes, would the fix below be in the right place? theres a patch: --- a/sys/src/cmd/6c/cgen.c Wed Mar 19 21:15:43 2014 +0100 +++ b/sys/src/cmd/6c/cgen.c Thu Mar 20 19:59:20 2014 +0100 @@ -309,6 +309,11 @@ /* fall thru */ case OMUL: case OLMUL: + if((o == OMUL || o == OLMUL) && (r->vconst == 0)){ + cgen(l, Z); + zeroregm(nn); + goto done; + } regalloc(&nod, l, nn); cgen(l, &nod); switch(o) { @@ -621,6 +626,13 @@ reglcgen(&nod2, l, Z); else nod2 = *l; + if((o == OASMUL || o == OASLMUL) && (r->vconst == 0)){ + cgen(&nod2, Z); + zeroregm(&nod2); + if(nn != Z) + zeroregm(nn); + goto done; + } regalloc(&nod, l, nn); cgen(&nod2, &nod); switch(o) { test program: #include <u.h> #include <libc.h> int bar(int a) { a *= 0; return a; } int foo(int a) { return bar(a) * 0; } void main(int argc, char *argv[]) { foo(1); } -- cinap ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] mulgen botch 2014-03-20 19:45 [9fans] mulgen botch cinap_lenrek @ 2014-03-20 20:19 ` cinap_lenrek 2014-03-20 21:50 ` erik quanstrom 0 siblings, 1 reply; 5+ messages in thread From: cinap_lenrek @ 2014-03-20 20:19 UTC (permalink / raw) To: 9fans sorry... the code from the last mail contains an error... theres a missing regfree() in the OASMUL and OASLMUL case when hardleft is set. in any case, i'm unsure if it wouldnt be better to handle this in mulgen() instead. as this case is so rare, it is probably not worth trying to avoid useless register moves here. -- cinap ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] mulgen botch 2014-03-20 20:19 ` cinap_lenrek @ 2014-03-20 21:50 ` erik quanstrom 2014-03-20 21:54 ` erik quanstrom 0 siblings, 1 reply; 5+ messages in thread From: erik quanstrom @ 2014-03-20 21:50 UTC (permalink / raw) To: 9fans On Thu Mar 20 16:20:29 EDT 2014, cinap_lenrek@felloff.net wrote: > sorry... the code from the last mail contains an error... > theres a missing regfree() in the OASMUL and OASLMUL case when > hardleft is set. in any case, i'm unsure if it wouldnt be > better to handle this in mulgen() instead. as this case is > so rare, it is probably not worth trying to avoid useless > register moves here. i suppose you can make the test for a constant expression fail, by simply changing both instances of this if(r->op == OCONST && typechl[n->type->etype]) { to this if(r->op == OCONST && r->vconst != 0 && typechl[n->type->etype]) { i haven't thought too hard about this, or compiled it, so maybe too easy? - erik ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] mulgen botch 2014-03-20 21:50 ` erik quanstrom @ 2014-03-20 21:54 ` erik quanstrom 2014-03-20 23:10 ` cinap_lenrek 0 siblings, 1 reply; 5+ messages in thread From: erik quanstrom @ 2014-03-20 21:54 UTC (permalink / raw) To: 9fans On Thu Mar 20 17:51:30 EDT 2014, quanstro@quanstro.net wrote: > On Thu Mar 20 16:20:29 EDT 2014, cinap_lenrek@felloff.net wrote: > > sorry... the code from the last mail contains an error... > > theres a missing regfree() in the OASMUL and OASLMUL case when > > hardleft is set. in any case, i'm unsure if it wouldnt be > > better to handle this in mulgen() instead. as this case is > > so rare, it is probably not worth trying to avoid useless > > register moves here. > > i suppose you can make the test for a constant expression fail, by simply > changing both instances of this > if(r->op == OCONST && typechl[n->type->etype]) { > to this > if(r->op == OCONST && r->vconst != 0 && typechl[n->type->etype]) { > > i haven't thought too hard about this, or compiled it, so maybe too easy? on second thought, better maching would be better. only multplication by 0 is safe. - erik ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] mulgen botch 2014-03-20 21:54 ` erik quanstrom @ 2014-03-20 23:10 ` cinap_lenrek 0 siblings, 0 replies; 5+ messages in thread From: cinap_lenrek @ 2014-03-20 23:10 UTC (permalink / raw) To: 9fans i found a simple solution now: diff -r 46d745fbf479 sys/src/cmd/6c/mul.c --- a/sys/src/cmd/6c/mul.c Thu Mar 20 16:44:01 2014 +0100 +++ b/sys/src/cmd/6c/mul.c Fri Mar 21 00:03:49 2014 +0100 @@ -312,6 +312,11 @@ Mparam *p; Node nod, nods; + if(v == 0){ + zeroregm(n); + return 1; + } + for(i = 0; i < nelem(multab); i++) { p = &multab[i]; if(p->value == v) as expected, the code generated *without* optimization does some stupid moves: term% ./6.out -SN /tmp/a.c TEXT bar+0(SB),0,$0 MOVL BP,a+0(FP) MOVL a+0(FP),AX MOVL $0,AX MOVL AX,a+0(FP) MOVL a+0(FP),AX NOP ,X0 RET , NOP ,AX NOP ,X0 RET , TEXT foo+0(SB),0,$16 MOVL BP,a+0(FP) MOVL a+0(FP),BP CALL ,bar+0(SB) MOVL $0,AX NOP ,X0 RET , NOP ,AX NOP ,X0 RET , TEXT main+0(SB),0,$16 MOVL BP,argc+0(FP) MOVL $1,BP CALL ,foo+0(SB) NOP ,AX NOP ,X0 RET , END , with optimization, the stupid moves are gone: term% ./6.out -S /tmp/a.c TEXT bar+0(SB),0,$0 MOVL $0,AX RET , RET , TEXT foo+0(SB),0,$16 CALL ,bar+0(SB) MOVL $0,AX RET , RET , TEXT main+0(SB),0,$16 MOVL $1,BP CALL ,foo+0(SB) RET , END , so this is as good as the initial attempt just that the change is just 4 lines in one location where we do the actual multiplication. -- cinap ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-03-20 23:10 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-03-20 19:45 [9fans] mulgen botch cinap_lenrek 2014-03-20 20:19 ` cinap_lenrek 2014-03-20 21:50 ` erik quanstrom 2014-03-20 21:54 ` erik quanstrom 2014-03-20 23:10 ` cinap_lenrek
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).