This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Reload problem


On Thu, 2006-04-13 at 22:37 +0530, Ramana Radhakrishnan wrote:
> Right :  A way to work around this would be to hold to not match this
> instruction until reload has been completed and have a define_split to
> convert this to a cmp , bne when its a memory operand matching . Look at
> rs6000.md or mt.md for a sample implementation.
> 
> What I am saying is the following. 
> 
> 1. Add an extra scratch register with a clobber pattern in your bcounter
> insn . 
> 
> 2. Have a define_insn which matches this if the 'q' register could be
> given for this . 

Oh I meant to say match the insn only after reload_completed .Add
"reload_completed" to your bcounter pattern. 




> 
> 3. Have a define_split pattern for the case where your first operand is
> a memory_operand in which case you take care of loading this into a
> register and then generate equivalent cmp and jmp instructions. 

Do this split after reload_completed. 


> 
> My 2 cents .
> 
> HTH 
> 
> cheers
> Ramana
> 
> On Thu, 2006-04-13 at 21:17 +0800, Ching-Hua Chang wrote:
> > Hi,
> >   I had wrote doloop_end instruction to support hwloop.
> >   When try to compile linux kernel, I meet a reload problem,
> >   the error message as follow.
> > 
> >   What kinds of instuction pattern should I add to support
> >   the reload that compiler need ?
> > 
> >   Thanks,
> >   Aladdin
> > 
> > 
> >   the constrant 'q' mean the non-general "counter" register
> > ========================================================
> > (define_expand "doloop_end"
> >   [(use (match_operand:SI 0 "register_operand" ""))
> >    (use (match_operand:SI 1 "const_int_operand" ""))
> >    (use (match_operand:SI 2 "const_int_operand" ""))
> >    (use (match_operand:SI 3 "const_int_operand" ""))
> >    (use (label_ref (match_operand 4 "" "")))]
> >   ""
> > {
> >         if(operands[3] != const1_rtx || flag_unroll_loops ||
> > flag_unroll_all_loops)
> >                 FAIL;
> >     emit_jump_insn(gen_bcounter(operands[0], operands[4]));
> >     DONE;
> > })
> > 
> > (define_insn "bcounter"
> >   [(set(pc) (if_then_else
> >                 (ge (match_operand:SI 0 "register_operand" "=q") (const_int 0))
> >                  (label_ref (match_operand 1 "" ""))
> >                         (pc)))
> >    (set(match_dup 0)
> >         (plus:SI (match_dup 0)
> >             (const_int -1)))]
> >   ""
> >   "bcnz %1"
> >   [(set_attr "type" "branch")])
> > 
> > 
> > Error message
> > ===================================================================
> > panic.c: In function `panic':
> > panic.c:104: error: unable to generate reloads for:
> > (jump_insn 222 152 158 7 (parallel [
> >             (set (pc)
> >                 (if_then_else (ge (reg:SI 5 r5 [orig:199 msec ] [199])
> >                         (const_int 0 [0x0]))
> >                     (label_ref 224)
> >                     (pc)))
> >             (set (reg:SI 5 r5 [orig:199 msec ] [199])
> >                 (plus:SI (reg:SI 5 r5 [orig:199 msec ] [199])
> >                     (const_int -1 [0xffffffff])))
> >         ]) 0 {bcounter} (nil)
> >     (expr_list:REG_BR_PROB (const_int 8900 [0x22c4])
> >         (nil)))
> > panic.c:104: internal compiler error: in find_reloads, at reload.c:3672
> > Please submit a full bug report,
> > with preprocessed source if appropriate.
> > See <URL:http://gcc.gnu.org/bugs.html> for instructions.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]