Fixed ssa problems in stage 1 of pinpoint plugin
This commit is contained in:
parent
ef755456da
commit
b7a3524779
@ -8,5 +8,6 @@
|
|||||||
#include <gimplify.h>
|
#include <gimplify.h>
|
||||||
#include <gimple-iterator.h>
|
#include <gimple-iterator.h>
|
||||||
#include <gimple-pretty-print.h>
|
#include <gimple-pretty-print.h>
|
||||||
|
#include <ssa.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -65,13 +65,30 @@ static gimple* make_stage1_separator(tree lhs, UID target, std::size_t offset) {
|
|||||||
if (!new_gasm)
|
if (!new_gasm)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
SSA_NAME_DEF_STMT(lhs) = new_gasm;
|
|
||||||
|
|
||||||
separators.emplace(uid, separator);
|
separators.emplace(uid, separator);
|
||||||
return new_gasm;
|
return new_gasm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void separator_assemble_maybe(gimple_stmt_iterator* gsi) {
|
static void separator_update_ssa_def(function* fn, gimple* old_def, gimple* new_def) {
|
||||||
|
if (!fn || !old_def)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Stage 0 separator call was definition statement of temporary variable
|
||||||
|
|
||||||
|
unsigned i;
|
||||||
|
tree name;
|
||||||
|
FOR_EACH_SSA_NAME(i, name, fn) {
|
||||||
|
if (!name)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (SSA_NAME_DEF_STMT(name) != old_def)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SSA_NAME_DEF_STMT(name) = new_def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void separator_assemble_maybe(function* fn, gimple_stmt_iterator* gsi) {
|
||||||
if (!gsi)
|
if (!gsi)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -90,6 +107,7 @@ static void separator_assemble_maybe(gimple_stmt_iterator* gsi) {
|
|||||||
pinpoint_fatal();
|
pinpoint_fatal();
|
||||||
|
|
||||||
gsi_replace(gsi, replacement, true);
|
gsi_replace(gsi, replacement, true);
|
||||||
|
separator_update_ssa_def(fn, stmt, replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const pass_data asm_offset_pass_data = {
|
static const pass_data asm_offset_pass_data = {
|
||||||
@ -110,7 +128,7 @@ unsigned int asm_offset_pass::execute(function* fn) {
|
|||||||
basic_block bb;
|
basic_block bb;
|
||||||
FOR_EACH_BB_FN(bb, fn) {
|
FOR_EACH_BB_FN(bb, fn) {
|
||||||
for (gimple_stmt_iterator gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi))
|
for (gimple_stmt_iterator gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi))
|
||||||
separator_assemble_maybe(&gsi);
|
separator_assemble_maybe(fn, &gsi);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user