Hi,all,
I have recently porting the instruction scheduler to the new arch of
our lab. But something seems strange.
Our pipeline( single issue) will stall for 1 cycle if the
arithmetic/logic instruction follows by a load, and for 2 cycles if a
store/jump/call instruction follows. I wrote my scheduler as follows:
(define_insn_reservation "apc_genetic_insn" 1
             (eq_attr "type" "!load,mul")
             "nothing")
(define_insn_reservation "apc_load_insn" 2
             (eq_attr "type" "load")
             "nothing")
(define_insn_reservation "apc_mul_insn" 4
             (eq_attr "type" "mul")
             "nothing")
 The multiply operation is implemented by 4 arithmetic instruction, so
I made the latency  4 cycles. As our pipeline introduces no interlock,
so the reservations for all insns are "nothing", which is very similar
as XTENSA. For data dependency cases,  I do some jobs in the
adjust_cost target hook.
static int
target_adjust_cost (rtx insn, rtx link, rtx dep, int cost)
{
 ......
   switch (get_attr_type(insn) ){
   case TYPE_ARITH_LOGIC:
           if (REG_NOTE_KIND (link) == 0 && get_attr_type (dep) == TYPE_LOAD)
                    return 2;
    break;

    case TYPE_JUMP_CALL_STORE:
           if (REG_NOTE_KIND (link) == 0 && get_attr_type (dep) == TYPE_LOAD)
                    return 3;
    break;
     ......
   }
    return 1;
}

When I finished the scheduler, I got a strange phenomenon:
The CPI is reduced, but the total execution cycles are dramatically increased.

I  read  THE GNU INSTRUCTION SCHEDULER written by  Michael D. Tiemann,
which mentioned a similar situation in sparc arch( chapter 7 extension
and future work), This article infromed me that register pressure is a
really big problem during instruction scheduling. I know I must ignore
something critical, but I don't know what it is. Is anyone there
helping me? Thank in advance.

Xiao

Reply via email to