[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#151196: gcc-2.95.4-9 ICE in kernel (matroxfb) code



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
> 						vandrove@vc.cvut.cz
> 
> 
> $ 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 debian-gcc-request@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org


-- 
To UNSUBSCRIBE, email to debian-gcc-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org



Reply to: