cse: treat PHI-nodes as other instructions
PATCH 1/1 cse: treat PHI-nodes as other instructions
Hello,
I've encountered a bug in the cse (over-)optimization. A patch, testing input for test-linearize and its outputs before/after patch are attached.
Note there is still something odd which the attached test-case revealed. The output of test-unssa still contains two (4 without my previous patch applied) unprocessed phisrc nodes. As time permits I'll try to write another for it if nobody will be faster ;-)
Kamil
test:
.L0x7fbd14330010
<entry-point> phisrc.32 %phi1(i) <- %arg1 phisrc.32 %phi4(i) <- %arg1 br .L0x7fbd14330130
.L0x7fbd14330130
copy.32 %r1(i) <- %r5(i) br %r1(i), .L0x7fbd14330178, .L0x7fbd143300e8
.L0x7fbd14330178
call test, $0 br .L0x7fbd143301c0
.L0x7fbd143301c0
add.32 %r4 <- %r1(i), $1 phisrc.32 %phi2(i) <- %r4 phisrc.32 %phi5(i) <- %r4 br .L0x7fbd14330130
.L0x7fbd143300e8
ret
static void test(int i)
{
while (i) {
if (i)
test(0);
i++;
}
}test:
.L0x7f43c1f02010
<entry-point> phisrc.32 %phi1(i) <- %arg1 phisrc.32 %phi4(i) <- %arg1 br .L0x7f43c1f02130
.L0x7f43c1f02130
br %r3, .L0x7f43c1f02178, .L0x7f43c1f020e8
.L0x7f43c1f02178
call test, $0 br .L0x7f43c1f021c0
.L0x7f43c1f021c0
copy.32 %r3 <- %r5 add.32 %r4 <- %r3, $1 phisrc.32 %phi2(i) <- %r4 phisrc.32 %phi5(i) <- %r4 br .L0x7f43c1f02130
.L0x7f43c1f020e8
ret
From 7658e89de5b2568d1a8663277c306b6f009b7ca7 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <[email protected]>
Date: Sun, 9 Aug 2009 22:43:17 +0200
Subject: [PATCH] cse: treat PHI-nodes as other instructions
Without this patch test-linearize fails on a simple example:
static void test(int i)
{
while (i) {
if (i)
test(0);
i++;
}
}It generates a conditional jump depending on an uninitialized value which is obviously not in the input code.
--- cse.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-)
cse.c +0 -5
@@ -317,13 +317,6 @@ static struct instruction * try_to_cse(struct entrypoint *ep, struct instruction b2 = i2->bb;/* -* PHI-nodes do not care where they are - the only thing that matters -* are the PHI _sources_. -*/ -if (i1->opcode ==OP_PHI ) -return cse_one_instruction (i1, i2);