combine 两条指令出错

10 views
Skip to first unread message

Jianzhang Peng

unread,
Dec 10, 2009, 7:53:02 AM12/10/09
to hell...@googlegroups.com
我在pass-sched里,把两条load指令合并为一个parallel,出错。

代码如下:
void merge(rtx insn1,rtx insn2)
{
        rtx parallel;
       
        parallel = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
        XVECEXP (par, 0, 0) = PATTERN(insn1);
        XVECEXP (par, 0, 1) = PATTERN(insn2);
        PATTERN(insn1) = parallel;
        delete_insn(insn2);
}

GDB 跟踪结果:
#0  0x000000000067aa5c in constrain_operands (strict=0) at ../../gcc-4.4.0/gcc/recog.c:2306
#1  0x0000000000679f17 in extract_constrain_insn_cached (insn=0x2a961a3d20)    at ../../gcc-4.4.0/gcc/recog.c:1965
#2  0x00000000008f2423 in insn_default_latency (insn=0x2a961a3d20)     at ../../gcc-4.4.0/gcc/config/mips/mips.md:584
#3  0x0000000000a25865 in insn_cost (insn=0x2a961a3d20) at ../../gcc-4.4.0/gcc/haifa-sched.c:636
#4  0x0000000000a2598a in dep_cost_1 (link=0xf61120, dw=0) at ../../gcc-4.4.0/gcc/haifa-sched.c:670
#5  0x0000000000a25aac in dep_cost (link=0xf61120) at ../../gcc-4.4.0/gcc/haifa-sched.c:725
#6  0x0000000000a25d3b in priority (insn=0x2a961a3d20) at ../../gcc-4.4.0/gcc/haifa-sched.c:834
#7  0x0000000000a29576 in set_priorities (head=0x2a961a3cd0, tail=0x2a961933c0)     at ../../gcc-4.4.0/gcc/haifa-sched.c:2830
#8  0x00000000006d0c2e in compute_priorities () at ../../gcc-4.4.0/gcc/sched-rgn.c:3221
#9  0x00000000006d0c97 in schedule_region (rgn=0) at ../../gcc-4.4.0/gcc/sched-rgn.c:3250
#10 0x00000000006d1a69 in schedule_insns () at ../../gcc-4.4.0/gcc/sched-rgn.c:3663
#11 0x00000000006d22de in rest_of_handle_sched () at ../../gcc-4.4.0/gcc/sched-rgn.c:3862
#12 0x0000000000657289 in execute_one_pass (pass=0xdc2020) at ../../gcc-4.4.0/gcc/passes.c:1278
#13 0x0000000000657471 in execute_pass_list (pass=0xdc2020) at ../../gcc-4.4.0/gcc/passes.c:1327
#14 0x000000000065748d in execute_pass_list (pass=0xdc0ce0) at ../../gcc-4.4.0/gcc/passes.c:1328
#15 0x0000000000769feb in tree_rest_of_compilation (fndecl=0x2a96155f00)     at ../../gcc-4.4.0/gcc/tree-optimize.c:420
#16 0x00000000008b2830 in cgraph_expand_function (node=0x2a96181000)     at ../../gcc-4.4.0/gcc/cgraphunit.c:1047
#17 0x00000000008b2a0c in cgraph_expand_all_functions () at ../../gcc-4.4.0/gcc/cgraphunit.c:1106
#18 0x00000000008b2f9e in cgraph_optimize () at ../../gcc-4.4.0/gcc/cgraphunit.c:1311
#19 0x000000000041a386 in c_write_global_declarations () at ../../gcc-4.4.0/gcc/c-decl.c:8102
#20 0x000000000071face in compile_file () at ../../gcc-4.4.0/gcc/toplev.c:981
#21 0x0000000000721527 in do_compile () at ../../gcc-4.4.0/gcc/toplev.c:2193
#22 0x0000000000721589 in toplev_main (argc=8, argv=0x7fbffff8c8) at ../../gcc-4.4.0/gcc/toplev.c:2225
#23 0x000000000047d63b in main (argc=8, argv=0x7fbffff8c8) at ../../gcc-4.4.0/gcc/main.c:35


--
Jianzhang Peng

Eric Fisher

unread,
Dec 10, 2009, 8:37:45 PM12/10/09
to hell...@googlegroups.com
没有把出错信息贴出来呀。

2009/12/10 Jianzhang Peng <pengji...@gmail.com>:
> --~--~---------~--~----~------------~-------~--~----~
> 您收到此信息是由于您订阅了 Google 论坛"HelloGcc Workshop"论坛。
> 要在此论坛发帖,请发电子邮件到 hell...@googlegroups.com
> 要退订此论坛,请发邮件至 hellogcc+u...@googlegroups.com
> 更多选项,请通过 http://groups.google.com/group/hellogcc?hl=zh-CN 访问该论坛
>
> -~----------~----~----~----~------~----~------~--~---
>
>

Jianzhang Peng

unread,
Dec 10, 2009, 10:36:48 PM12/10/09
to hell...@googlegroups.com
上面的那个错误是我没有正确生成INSN指令,我直接把parallel放到以存在的一个insn的pattern里面去了,应该用make_insn_raw 生成新的insn。

现在改过来了。但是在下面的代码中,我好像并没有把指令连进去,我在debug_bb 的并没有发现我combine的指令。
我是用这种方法给loongson 3A做128位访存,我才今年8月份才接触GCC开发,希望大家多多指教!

void merge(rtx insn1,rtx insn2)
{
        rtx par, pre,sur, insn;

        par = gen_rtx_PARALLEL (SFmode, rtvec_alloc (2));


        XVECEXP (par, 0, 0) = PATTERN(insn1);
        XVECEXP (par, 0, 1) = PATTERN(insn2);

        insn = make_insn_raw (par);

        sur = NEXT_INSN(insn1);

        PREV_INSN(insn) = insn1;
        NEXT_INSN(insn) = sur;
        delete_insn(insn1);

        delete_insn(insn2);
}


2009/12/11 Eric Fisher <joefo...@gmail.com>

--

您收到此邮件是因为您订阅了 Google 网上论坛的“HelloGcc Workshop”论坛。
要向此网上论坛发帖,请发送电子邮件至 hell...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 hellogcc+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/hellogcc?hl=zh-CN 访问此网上论坛。





--
Jianzhang Peng

daniel tian

unread,
Dec 10, 2009, 10:45:59 PM12/10/09
to hell...@googlegroups.com
我觉得你应该用emit-rtl.c里面的函数,比如set_insn_deleted,
add_insn_after等等之类的,看名字就知道用哪些的。你可以试试这些函数。
好像是你给我发的邮件吧?gcc maillist上的。

2009/12/11 Jianzhang Peng <pengji...@gmail.com>:
> 上面的那个错误是我没有正确生成INSN指令,我直接把parallel放到以存在的一个insn的pattern里面去了,应该用make_insn_raw
> 生成新的insn。
>
> 现在改过来了。但是在下面的代码中,我好像并没有把指令连进去,emit我在debug_bb 的并没有发现我combine的指令。

Jianzhang Peng

unread,
Dec 11, 2009, 4:03:41 AM12/11/09
to hell...@googlegroups.com
恩,谢谢!!

2009/12/11 daniel tian <daniel...@gmail.com>



--
Jianzhang Peng
Reply all
Reply to author
Forward
0 new messages