[PATCH] kill dead instructions before any other simplifications

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

 



Dead instructions are removed when simplify_instruction() is
called but this is done in various places, depending on the kind
of instructions, sometimes after other simplifications.

Change this by using the instruction's flag OPF_TARGET at the very
beginning of simplify_instruction() to test which instructions are
dead and thus can be removed.

Note: OP_CALLs are special here as they're considered as always
      returning a value but only calls to pure functions are
      removed. This is OK since pure functions should always
      return a value.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx>
---
 simplify.c | 51 +++++----------------------------------------------
 1 file changed, 5 insertions(+), 46 deletions(-)

diff --git a/simplify.c b/simplify.c
index 6caf6cbcf918..f91aaa69dd81 100644
--- a/simplify.c
+++ b/simplify.c
@@ -388,20 +388,6 @@ int kill_insn(struct instruction *insn, int force)
 	return repeat_phase |= REPEAT_CSE;
 }
 
-///
-// kill trivially dead instructions
-static int dead_insn(struct instruction *insn, pseudo_t *src1, pseudo_t *src2, pseudo_t *src3)
-{
-	if (has_users(insn->target))
-		return 0;
-
-	insn->bb = NULL;
-	kill_use(src1);
-	kill_use(src2);
-	kill_use(src3);
-	return REPEAT_CSE;
-}
-
 static inline bool has_target(struct instruction *insn)
 {
 	return opcode_table[insn->opcode].flags & OPF_TARGET;
@@ -1270,8 +1256,6 @@ static int simplify_binop_same_args(struct instruction *insn, pseudo_t arg)
 
 static int simplify_binop(struct instruction *insn)
 {
-	if (dead_insn(insn, &insn->src1, &insn->src2, NULL))
-		return REPEAT_CSE;
 	if (constant(insn->src1)) {
 		if (constant(insn->src2))
 			return simplify_constant_binop(insn);
@@ -1451,8 +1435,6 @@ static int simplify_constant_unop(struct instruction *insn)
 
 static int simplify_unop(struct instruction *insn)
 {
-	if (dead_insn(insn, &insn->src1, NULL, NULL))
-		return REPEAT_CSE;
 	if (constant(insn->src1))
 		return simplify_constant_unop(insn);
 
@@ -1543,16 +1525,11 @@ static int simplify_cast(struct instruction *insn)
 {
 	unsigned long long mask;
 	struct instruction *def;
-	pseudo_t src;
+	pseudo_t src = insn->src;
 	pseudo_t val;
 	int osize;
 	int size;
 
-	if (dead_insn(insn, &insn->src, NULL, NULL))
-		return REPEAT_CSE;
-
-	src = insn->src;
-
 	/* A cast of a constant? */
 	if (constant(src))
 		return simplify_constant_unop(insn);
@@ -1687,9 +1664,6 @@ static int simplify_select(struct instruction *insn)
 {
 	pseudo_t cond, src1, src2;
 
-	if (dead_insn(insn, &insn->src1, &insn->src2, &insn->src3))
-		return REPEAT_CSE;
-
 	cond = insn->src1;
 	src1 = insn->src2;
 	src2 = insn->src3;
@@ -1861,6 +1835,10 @@ int simplify_instruction(struct instruction *insn)
 		return 0;
 
 	flags = opcode_table[insn->opcode].flags;
+	if (flags & OPF_TARGET) {
+		if (!has_users(insn->target))
+			return kill_instruction(insn);
+	}
 	if (flags & OPF_COMMU)
 		canonicalize_commutative(insn) ;
 	if (flags & OPF_COMPARE)
@@ -1906,14 +1884,9 @@ int simplify_instruction(struct instruction *insn)
 	case OP_SET_AE:
 		break;
 	case OP_LOAD:
-		if (!has_users(insn->target))
-			return kill_instruction(insn);
-		/* fall-through */
 	case OP_STORE:
 		return simplify_memop(insn);
 	case OP_SYMADDR:
-		if (dead_insn(insn, &insn->src, NULL, NULL))
-			return REPEAT_CSE | REPEAT_SYMBOL_CLEANUP;
 		return replace_with_pseudo(insn, insn->src);
 	case OP_SEXT: case OP_ZEXT:
 	case OP_TRUNC:
@@ -1923,30 +1896,18 @@ int simplify_instruction(struct instruction *insn)
 	case OP_UCVTF: case OP_SCVTF:
 	case OP_FCVTF:
 	case OP_PTRCAST:
-		if (dead_insn(insn, &insn->src, NULL, NULL))
-			return REPEAT_CSE;
 		break;
 	case OP_UTPTR:
 	case OP_PTRTU:
 		return replace_with_pseudo(insn, insn->src);
 	case OP_SLICE:
-		if (dead_insn(insn, &insn->src, NULL, NULL))
-			return REPEAT_CSE;
 		break;
 	case OP_SETVAL:
 	case OP_SETFVAL:
-		if (dead_insn(insn, NULL, NULL, NULL))
-			return REPEAT_CSE;
 		break;
 	case OP_PHI:
-		if (dead_insn(insn, NULL, NULL, NULL)) {
-			kill_use_list(insn->phi_list);
-			return REPEAT_CSE;
-		}
 		return clean_up_phi(insn);
 	case OP_PHISOURCE:
-		if (dead_insn(insn, &insn->phi_src, NULL, NULL))
-			return REPEAT_CSE;
 		break;
 	case OP_SEL:
 		return simplify_select(insn);
@@ -1960,8 +1921,6 @@ int simplify_instruction(struct instruction *insn)
 	case OP_FSUB:
 	case OP_FMUL:
 	case OP_FDIV:
-		if (dead_insn(insn, &insn->src1, &insn->src2, NULL))
-			return REPEAT_CSE;
 		break;
 	}
 	return 0;

base-commit: cfca7b4c6cb48283cb554fc91dc859ff669f2547
-- 
2.29.0




[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