Skip to contentSkip to conversation

cse: treat PHI-nodes as other instructions

PATCH New Kamil Dudka 1 participant 1 message Aug 9, 2009 Sparse checker

lore
Share & tools
lore
#0 lore raw

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
index 2a15745..2aabb65 100644
@@ -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);