diff options
author | 2009-08-09 08:30:23 +0000 | |
---|---|---|
committer | 2009-08-02 03:06:58 -0700 | |
commit | 2ceccd7b956b6588f2faa566b64249605ae52ceb (patch) | |
tree | fe635b57e9d96057560470f169f327acacddf480 | |
parent | Define __LP64__ for x86_64 unless in 32 bit mode (diff) | |
download | sparse-2ceccd7b956b6588f2faa566b64249605ae52ceb.tar.gz sparse-2ceccd7b956b6588f2faa566b64249605ae52ceb.tar.bz2 sparse-2ceccd7b956b6588f2faa566b64249605ae52ceb.zip |
unssa: track uses when replacing a phi node
Hello,
attached are patch, testing input for test-unssa and its outputs before patch
and after patch. Thanks in advance for considering the patch!
Kamil
test:
.L0x7f9fb2030010
<entry-point>
phisrc.32 %phi2(ptr) <- %arg1
br .L0x7f9fb2030130
.L0x7f9fb2030130
copy.32 %r1(ptr) <- %r5(ptr)
br %r1(ptr), .L0x7f9fb2030058, .L0x7f9fb20300e8
.L0x7f9fb2030058
load.32 %r3 <- 0[%r1(ptr)]
phisrc.32 %phi3(ptr) <- %r3
br .L0x7f9fb2030130
.L0x7f9fb20300e8
ret
test:
.L0x7f4a7f7f1010
<entry-point>
copy.32 %r5(ptr) <- %arg1
br .L0x7f4a7f7f1130
.L0x7f4a7f7f1130
copy.32 %r1(ptr) <- %r5(ptr)
br %r1(ptr), .L0x7f4a7f7f1058, .L0x7f4a7f7f10e8
.L0x7f4a7f7f1058
load.32 %r3 <- 0[%r1(ptr)]
copy.32 %r5(ptr) <- %r3
br .L0x7f4a7f7f1130
.L0x7f4a7f7f10e8
ret
>From 66a02fa7cec780fc88d6ef4cce7a1e704928808a Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Sun, 9 Aug 2009 10:22:11 +0200
Subject: [PATCH] unssa: track uses when replacing a phi node
The output of test-unssa is inconsistent for a simple test-case without
this patch:
static void test(void **ptr)
{
while (ptr) {
ptr = *ptr;
}
}
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>
-rw-r--r-- | flow.h | 1 | ||||
-rw-r--r-- | liveness.c | 2 | ||||
-rw-r--r-- | unssa.c | 2 |
3 files changed, 4 insertions, 1 deletions
@@ -29,6 +29,7 @@ int dominates(pseudo_t pseudo, struct instruction *insn, struct instruction *dom extern void clear_liveness(struct entrypoint *ep); extern void track_pseudo_liveness(struct entrypoint *ep); extern void track_pseudo_death(struct entrypoint *ep); +extern void track_phi_uses(struct instruction *insn); extern void vrfy_flow(struct entrypoint *ep); extern int pseudo_in_list(struct pseudo_list *list, pseudo_t pseudo); @@ -279,7 +279,7 @@ static void merge_pseudo_list(struct pseudo_list *src, struct pseudo_list **dest } END_FOR_EACH_PTR(pseudo); } -static void track_phi_uses(struct instruction *insn) +void track_phi_uses(struct instruction *insn) { pseudo_t phi; FOR_EACH_PTR(insn->phi_list, phi) { @@ -26,6 +26,7 @@ #include "lib.h" #include "linearize.h" #include "allocate.h" +#include "flow.h" #include <assert.h> @@ -51,6 +52,7 @@ static void replace_phi_node(struct instruction *phi) // update the current liveness remove_pseudo(&phi->bb->needs, phi->target); add_pseudo(&phi->bb->needs, tmp); + track_phi_uses(phi); phi->opcode = OP_COPY; phi->src = tmp; |