public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* Plugin duplicating statements
@ 2014-03-13 10:19 Daniel Ptáček
  0 siblings, 0 replies; only message in thread
From: Daniel Ptáček @ 2014-03-13 10:19 UTC (permalink / raw)
  To: gcc-help

Hi,
i'm trying to write an experimental GCC plugin with pass, which
duplicates gimple statements in a certain basic block, but i have a
problem with renaming symbols to SSA form.

I'm iterating over statements in the block and putting deep copies of
them into vector. Then i'm retrieving the copies from the vector,
renaming them and inserting at the end of the block. It works fine for
the gimple assigns, but for gimple calls i'm getting segmentation
fault. Even if i call only "create_new_def_for" and not inserting the
copied statement. My pass seems to finish "successfully", so it looks
like a problem, i'm causing for another passes.
My pass is registred right after the "ssa" pass. Here's my code:

unsigned execute() {
    basic_block bb;
    gimple_stmt_iterator gsi;
    vector<gimple> stmt_queue;
    gimple g;
    FOR_EACH_BB(bb) {
        if (bb->index != 3) continue; //Block number 3 is what i want
to duplicate

        for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) {
            g = gsi_stmt(gsi);
            stmt_queue.push_back(gimple_copy(g));
        }
        gimple copy;
        def_operand_p def;
        gsi = gsi_last_bb(bb);
        for (int i = 0; i < stmt_queue.size(); i++) {
            copy = stmt_queue.at(i);
            if (is_gimple_assign(copy)) { //Removing this condition
causes SIGSEGV
                def = single_ssa_def_operand(copy, SSA_OP_DEF);
                create_new_def_for(gimple_op(copy, 1), copy, def);
                gsi_insert_after(&gsi, copy, GSI_NEW_STMT);
            }
        }
    }
    return 1;
}

This si an example of how test code looks like after the ssa pass (only bb 3):
<bb 3>:
  _2 = test (5);
  x_3 = x_1 + _2;

And this is after my pass (when duplicating all gimple statements):
<bb 3>:
  _2 = test (5);
  x_3 = x_1 + _2;
  _6 = test (5);
  x_7 = x_1 + _2;

The original code in C is "x += test(5);"

I'm new to developing GCC plugins and i'm trying to understand its
internals. I would really appreciate any help with solving this
problem and understanding why is the code after my pass corrupted and
causing internal compiler error.

Thanks

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-03-13  2:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-13 10:19 Plugin duplicating statements Daniel Ptáček

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).