retitle 151196 [fixed in gcc-3.x] gcc-2.95.4-9 ICE in kernel (matroxfb) code tags 151196 + fixed thanks
Petr Vandrovec writes: > Package: gcc-2.95 > Version: 2.95.4-9 > > Hi, > I removed debug prints from new matroxfb driver, and ... compiler > died. Simplest example I was able to invent is below. If you uncomment > printf(), or if you'll remove (almost) any line from computeRegs() body, > it will stop ICE. > > gcc-3.0 (3.0.4-10) and gcc-3.1 (3.1.1-0pre2) compile code flawlessly. > > Best regards, > Petr Vandrovec > [EMAIL PROTECTED] > > > $ gcc-2.95 -W -Wall -O2 bug.c > bug.c: In function `computeRegs': > bug.c:72: Internal compiler error: > bug.c:72: internal error--unrecognizable insn: > (insn 62 61 151 (parallel[ > (set (reg:SI 0 %eax) > (asm_operands ("") ("=a") 0[ > (reg:DI 1 %edx) > ] > [ > (asm_input:DI ("A")) > ] ("bug.c") 60)) > (set (reg:SI 1 %edx) > (asm_operands ("") ("=d") 1[ > (reg:DI 1 %edx) > ] > [ > (asm_input:DI ("A")) > ] ("bug.c") 60)) > ] ) -1 (insn_list 57 (nil)) > (nil)) > $ > > #define do_div(n,base) ({ \ > unsigned long __upper, __low, __high, __mod; \ > asm("":"=a" (__low), "=d" (__high):"A" (n)); \ > __upper = __high; \ > if (__high) { \ > __upper = __high % (base); \ > __high = __high / (base); \ > } \ > asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (base), "0" (__low), "1" > (__upper)); \ > asm("":"=A" (n):"a" (__low),"d" (__high)); \ > __mod; \ > }) > > #define u_int32_t unsigned int > > struct mavenregs { > unsigned char regs[256]; > }; > > struct my_timming { > u_int32_t HDisplay; > unsigned int pixclock; > unsigned int mnp; > }; > > struct output_desc { > unsigned int h_vis; > unsigned int h_f_porch; > unsigned int h_sync; > unsigned int h_b_porch; > unsigned long long int chromasc; > unsigned int burst; > unsigned int v_total; > }; > > unsigned int matroxfb_g450_setclk(unsigned int, unsigned int); > unsigned int g450_mnp2f(unsigned int); > > static void computeRegs(struct mavenregs* r, struct my_timming* mt, const > struct output_desc* outd) { > u_int32_t chromasc; > u_int32_t hlen; > u_int32_t hfp; > u_int32_t hvis; > unsigned int pixclock; > unsigned long long piic; > int mnp; > > hvis = 1; > piic = 1000000000ULL * hvis; > > mnp = matroxfb_g450_setclk(piic, 3); > > mt->pixclock = g450_mnp2f(mnp); > // printf("PX: %u\n", mt->pixclock); > mt->mnp = mnp; > > pixclock = 1000000000U / mt->pixclock; > > piic = outd->chromasc; > do_div(piic, mt->pixclock); > chromasc = piic; > > r->regs[0] = chromasc >> 24; > r->regs[1] = chromasc >> 16; > > hfp = (((outd->h_f_porch + pixclock) / pixclock)) & ~1; > hlen = hvis + hfp; > > if (hlen) { > hfp -= hlen; > } > } > > > > > -- > To UNSUBSCRIBE, email to [EMAIL PROTECTED] > with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]