[PATCH] cse: treat PHI-nodes as other instructions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <kdudka@xxxxxxxxxx>
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@xxxxxxxxxx>
---
 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);
-
-	/*
 	 * Currently we only handle the uninteresting degenerate case where
 	 * the CSE is inside one basic-block.
 	 */
-- 
1.6.4


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux