All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] cse: treat PHI-nodes as other instructions
@ 2009-08-09 21:15 Kamil Dudka
  0 siblings, 0 replies; only message in thread
From: Kamil Dudka @ 2009-08-09 21:15 UTC (permalink / raw)
  To: sparse

[-- Attachment #1: Type: text/plain, Size: 424 bytes --]

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

[-- Attachment #2: cse-bug-after_patch.out --]
[-- Type: text/plain, Size: 467 bytes --]



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


[-- Attachment #3: cse-bug-input.c --]
[-- Type: text/x-csrc, Size: 99 bytes --]

static void test(int i)
{
    while (i) {
        if (i)
            test(0);
        i++;
    }
}

[-- Attachment #4: cse-bug-before_patch.out --]
[-- Type: text/plain, Size: 455 bytes --]



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


[-- Attachment #5: 0001-cse-treat-PHI-nodes-as-other-instructions.patch --]
[-- Type: text/x-diff, Size: 981 bytes --]

From 7658e89de5b2568d1a8663277c306b6f009b7ca7 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
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.

Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
 cse.c |    7 -------
 1 files changed, 0 insertions(+), 7 deletions(-)

diff --git a/cse.c b/cse.c
index 2a15745..2aabb65 100644
--- a/cse.c
+++ b/cse.c
@@ -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);

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

only message in thread, other threads:[~2009-08-09 21:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-09 21:15 [PATCH] cse: treat PHI-nodes as other instructions Kamil Dudka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.