From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: Christopher Li <sparse@chrisli.org>
Cc: linux-sparse@vger.kernel.org,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [PATCH 4/4] mark pseudo users as deleted instead of removing them
Date: Fri, 4 Aug 2017 22:09:15 +0200 [thread overview]
Message-ID: <20170804200915.56738-5-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170804200915.56738-1-luc.vanoostenryck@gmail.com>
This will fix the (rare) problems with deletion while doing
nested ptrlist walking that occurs when doing recursive
kill_instruction() - remove_usage() - kill_instruction()
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
flow.c | 28 ++++++++++++++++++++++------
linearize.c | 2 ++
memops.c | 5 ++++-
simplify.c | 10 ++++++++--
unssa.c | 2 ++
5 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/flow.c b/flow.c
index 6cac21b24..1dbfd431e 100644
--- a/flow.c
+++ b/flow.c
@@ -283,6 +283,8 @@ void convert_instruction_target(struct instruction *insn, pseudo_t src)
if (target == src)
return;
FOR_EACH_PTR(target->users, pu) {
+ if (!pu)
+ continue;
if (*pu->userp != VOID) {
assert(*pu->userp == target);
*pu->userp = src;
@@ -675,8 +677,10 @@ static void simplify_one_symbol(struct entrypoint *ep, struct symbol *sym)
complex = 0;
FOR_EACH_PTR(pseudo->users, pu) {
/* We know that the symbol-pseudo use is the "src" in the instruction */
- struct instruction *insn = pu->insn;
-
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
switch (insn->opcode) {
case OP_STORE:
stores++;
@@ -715,7 +719,10 @@ static void simplify_one_symbol(struct entrypoint *ep, struct symbol *sym)
src = def->target;
FOR_EACH_PTR(pseudo->users, pu) {
- struct instruction *insn = pu->insn;
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
if (insn->opcode == OP_LOAD) {
check_access(insn);
convert_load_instruction(insn, src);
@@ -731,7 +738,10 @@ complex_def:
external_visibility:
all = 1;
FOR_EACH_PTR_REVERSE(pseudo->users, pu) {
- struct instruction *insn = pu->insn;
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
if (insn->opcode == OP_LOAD)
all &= find_dominating_stores(pseudo, insn, ++bb_generation, !mod);
} END_FOR_EACH_PTR_REVERSE(pu);
@@ -739,7 +749,10 @@ external_visibility:
/* If we converted all the loads, remove the stores. They are dead */
if (all && !mod) {
FOR_EACH_PTR(pseudo->users, pu) {
- struct instruction *insn = pu->insn;
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
if (insn->opcode == OP_STORE)
kill_store(insn);
} END_FOR_EACH_PTR(pu);
@@ -749,7 +762,10 @@ external_visibility:
* of them..
*/
FOR_EACH_PTR(pseudo->users, pu) {
- struct instruction *insn = pu->insn;
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
if (insn->opcode == OP_STORE)
kill_dominated_stores(pseudo, insn, ++bb_generation, insn->bb, !mod, 0);
} END_FOR_EACH_PTR(pu);
diff --git a/linearize.c b/linearize.c
index ba76397ea..0933e935f 100644
--- a/linearize.c
+++ b/linearize.c
@@ -542,6 +542,8 @@ static void show_symbol_usage(pseudo_t pseudo)
if (pseudo) {
FOR_EACH_PTR(pseudo->users, pu) {
+ if (!pu)
+ continue;
printf("\t%s\n", show_instruction(pu->insn));
} END_FOR_EACH_PTR(pu);
}
diff --git a/memops.c b/memops.c
index aeacdf566..ce5aecbe8 100644
--- a/memops.c
+++ b/memops.c
@@ -66,7 +66,10 @@ static int address_taken(pseudo_t pseudo)
{
struct pseudo_user *pu;
FOR_EACH_PTR(pseudo->users, pu) {
- struct instruction *insn = pu->insn;
+ struct instruction *insn;
+ if (!pu)
+ continue;
+ insn = pu->insn;
if (insn->bb && (insn->opcode != OP_LOAD && insn->opcode != OP_STORE))
return 1;
} END_FOR_EACH_PTR(pu);
diff --git a/simplify.c b/simplify.c
index 03ff9c942..0569007a1 100644
--- a/simplify.c
+++ b/simplify.c
@@ -166,20 +166,24 @@ static int clean_up_phi(struct instruction *insn)
return if_convert_phi(insn);
}
+
static int delete_pseudo_user_list_entry(struct pseudo_user_list **list, pseudo_t *entry, int count)
{
struct pseudo_user *pu;
FOR_EACH_PTR(*list, pu) {
+ if (!pu)
+ continue;
if (pu->userp == entry) {
- DELETE_CURRENT_PTR(pu);
+ MARK_CURRENT_DELETED(pu);
if (!--count)
goto out;
}
} END_FOR_EACH_PTR(pu);
assert(count <= 0);
out:
- pack_ptr_list((struct ptr_list **)list);
+ if (ptr_list_size((struct ptr_list *) *list) == 0)
+ *list = NULL;
return count;
}
@@ -308,6 +312,8 @@ static int dead_insn(struct instruction *insn, pseudo_t *src1, pseudo_t *src2, p
{
struct pseudo_user *pu;
FOR_EACH_PTR(insn->target->users, pu) {
+ if (!pu)
+ continue;
if (*pu->userp != VOID)
return 0;
} END_FOR_EACH_PTR(pu);
diff --git a/unssa.c b/unssa.c
index e7c9154d5..87d0c2c7f 100644
--- a/unssa.c
+++ b/unssa.c
@@ -58,6 +58,8 @@ static int simplify_phi_node(struct instruction *phi, pseudo_t tmp)
// no need to make a copy of this one
// -> replace the target pseudo by the tmp
FOR_EACH_PTR(target->users, pu) {
+ if (!pu)
+ continue;
use_pseudo(pu->insn, tmp, pu->userp);
} END_FOR_EACH_PTR(pu);
--
2.13.2
next prev parent reply other threads:[~2017-08-04 20:09 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-10 15:32 [PATCH RFC] Let pseudo->users loop on duplicate version of list Christopher Li
2017-07-11 20:53 ` Christopher Li
2017-07-11 21:04 ` Dibyendu Majumdar
2017-07-12 5:29 ` Christopher Li
2017-07-12 15:56 ` Dibyendu Majumdar
2017-07-12 17:03 ` Christopher Li
2017-07-12 18:05 ` Dibyendu Majumdar
2017-07-13 5:27 ` Christopher Li
2017-07-19 21:14 ` Luc Van Oostenryck
2017-07-19 21:42 ` Christopher Li
2017-07-19 22:51 ` Luc Van Oostenryck
2017-07-20 2:34 ` Christopher Li
2017-08-02 23:44 ` Luc Van Oostenryck
2017-08-03 0:50 ` Christopher Li
2017-08-03 10:18 ` Luc Van Oostenryck
2017-08-03 23:48 ` Christopher Li
2017-08-04 0:41 ` Luc Van Oostenryck
2017-08-04 2:22 ` Christopher Li
2017-08-04 10:38 ` Luc Van Oostenryck
2017-08-04 14:48 ` Christopher Li
2017-08-04 16:58 ` Luc Van Oostenryck
[not found] ` <20170804002230.5047-1-luc.vanoostenryck@gmail.com>
2017-08-04 14:54 ` Fwd: [PATCH] mark pseudo user as deleted instead of removing them Christopher Li
2017-08-04 15:29 ` Christopher Li
2017-08-04 15:58 ` Luc Van Oostenryck
2017-08-04 18:19 ` Christopher Li
2017-08-04 19:12 ` Luc Van Oostenryck
2017-08-04 19:24 ` Christopher Li
2017-08-04 20:09 ` [PATCH 0/4] fix list corruption with recursive remove_usage() Luc Van Oostenryck
2017-08-04 20:09 ` [PATCH 1/4] ptrlist: add a counter for the number of removed elemnets Luc Van Oostenryck
2017-08-04 20:09 ` [PATCH 2/4] ptrlist: adjust ptr_list_size for the new ->rm field Luc Van Oostenryck
2017-08-04 20:09 ` [PATCH 3/4] ptrlist: add MARK_CURRENT_DELETED Luc Van Oostenryck
2017-08-04 20:09 ` Luc Van Oostenryck [this message]
2017-08-04 20:17 ` [PATCH 4/4] mark pseudo users as deleted instead of removing them Christopher Li
2017-08-04 20:18 ` Christopher Li
2017-08-04 20:34 ` Luc Van Oostenryck
2017-08-04 20:48 ` Christopher Li
2017-08-04 21:03 ` Luc Van Oostenryck
2017-08-04 21:14 ` Christopher Li
2017-08-04 21:34 ` Luc Van Oostenryck
2017-08-04 16:54 ` [PATCH] mark pseudo user " Linus Torvalds
2017-08-04 18:33 ` Christopher Li
2017-08-04 20:08 ` Christopher Li
2017-08-04 20:37 ` Christopher Li
2017-07-13 12:23 ` [PATCH RFC] Let pseudo->users loop on duplicate version of list Christopher Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170804200915.56738-5-luc.vanoostenryck@gmail.com \
--to=luc.vanoostenryck@gmail.com \
--cc=linux-sparse@vger.kernel.org \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).