summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-25 10:23:28 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-25 10:23:28 +0000
commit1d093889eda4e3f58d8eec813224343555bbe93e (patch)
treea800361128cc24f0094a756fb8eadf2d5420ce97
parent010eee56fd3144e80819afb153f0124cdbb72241 (diff)
downloadgcc-1d093889eda4e3f58d8eec813224343555bbe93e.tar.gz
Remove broken ifcvt code for speculating memory writes
* ifcvt.c (noce_mem_write_may_trap_or_fault_p, noce_can_store_speculate): Delete. (noce_process_if_block): Don't try to handle single MEM stores. * rtl.h (memory_must_be_modified_in_insn_p): Don't declare. * alias.c (memory_must_be_modified_in_insn_p): Delete. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230864 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/alias.c24
-rw-r--r--gcc/ifcvt.c121
-rw-r--r--gcc/rtl.h1
4 files changed, 14 insertions, 140 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49fa59bca05..1e788e88c4f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2015-11-25 Bernd Schmidt <bschmidt@redhat.com>
+
+ * ifcvt.c (noce_mem_write_may_trap_or_fault_p,
+ noce_can_store_speculate): Delete.
+ (noce_process_if_block): Don't try to handle single MEM stores.
+ * rtl.h (memory_must_be_modified_in_insn_p): Don't declare.
+ * alias.c (memory_must_be_modified_in_insn_p): Delete.
+
2015-11-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/68435
diff --git a/gcc/alias.c b/gcc/alias.c
index fb7919af152..9a642dde03e 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -3032,30 +3032,6 @@ set_dest_equal_p (const_rtx set, const_rtx item)
return rtx_equal_p (dest, item);
}
-/* Like memory_modified_in_insn_p, but return TRUE if INSN will
- *DEFINITELY* modify the memory contents of MEM. */
-bool
-memory_must_be_modified_in_insn_p (const_rtx mem, const_rtx insn)
-{
- if (!INSN_P (insn))
- return false;
- insn = PATTERN (insn);
- if (GET_CODE (insn) == SET)
- return set_dest_equal_p (insn, mem);
- else if (GET_CODE (insn) == PARALLEL)
- {
- int i;
- for (i = 0; i < XVECLEN (insn, 0); i++)
- {
- rtx sub = XVECEXP (insn, 0, i);
- if (GET_CODE (sub) == SET
- && set_dest_equal_p (sub, mem))
- return true;
- }
- }
- return false;
-}
-
/* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
array. */
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 212d320dadb..fc724bcb890 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -2962,97 +2962,6 @@ noce_operand_ok (const_rtx op)
return ! may_trap_p (op);
}
-/* Return true if a write into MEM may trap or fault. */
-
-static bool
-noce_mem_write_may_trap_or_fault_p (const_rtx mem)
-{
- rtx addr;
-
- if (MEM_READONLY_P (mem))
- return true;
-
- if (may_trap_or_fault_p (mem))
- return true;
-
- addr = XEXP (mem, 0);
-
- /* Call target hook to avoid the effects of -fpic etc.... */
- addr = targetm.delegitimize_address (addr);
-
- while (addr)
- switch (GET_CODE (addr))
- {
- case CONST:
- case PRE_DEC:
- case PRE_INC:
- case POST_DEC:
- case POST_INC:
- case POST_MODIFY:
- addr = XEXP (addr, 0);
- break;
- case LO_SUM:
- case PRE_MODIFY:
- addr = XEXP (addr, 1);
- break;
- case PLUS:
- if (CONST_INT_P (XEXP (addr, 1)))
- addr = XEXP (addr, 0);
- else
- return false;
- break;
- case LABEL_REF:
- return true;
- case SYMBOL_REF:
- if (SYMBOL_REF_DECL (addr)
- && decl_readonly_section (SYMBOL_REF_DECL (addr), 0))
- return true;
- return false;
- default:
- return false;
- }
-
- return false;
-}
-
-/* Return whether we can use store speculation for MEM. TOP_BB is the
- basic block above the conditional block where we are considering
- doing the speculative store. We look for whether MEM is set
- unconditionally later in the function. */
-
-static bool
-noce_can_store_speculate_p (basic_block top_bb, const_rtx mem)
-{
- basic_block dominator;
-
- for (dominator = get_immediate_dominator (CDI_POST_DOMINATORS, top_bb);
- dominator != NULL;
- dominator = get_immediate_dominator (CDI_POST_DOMINATORS, dominator))
- {
- rtx_insn *insn;
-
- FOR_BB_INSNS (dominator, insn)
- {
- /* If we see something that might be a memory barrier, we
- have to stop looking. Even if the MEM is set later in
- the function, we still don't want to set it
- unconditionally before the barrier. */
- if (INSN_P (insn)
- && (volatile_insn_p (PATTERN (insn))
- || (CALL_P (insn) && (!RTL_CONST_CALL_P (insn)))))
- return false;
-
- if (memory_must_be_modified_in_insn_p (mem, insn))
- return true;
- if (modified_in_p (XEXP (mem, 0), insn))
- return false;
-
- }
- }
-
- return false;
-}
-
/* Return true if X contains a MEM subrtx. */
static bool
@@ -3582,30 +3491,12 @@ noce_process_if_block (struct noce_if_info *if_info)
}
if (!set_b && MEM_P (orig_x))
- {
- /* Disallow the "if (...) x = a;" form (implicit "else x = x;")
- for optimizations if writing to x may trap or fault,
- i.e. it's a memory other than a static var or a stack slot,
- is misaligned on strict aligned machines or is read-only. If
- x is a read-only memory, then the program is valid only if we
- avoid the store into it. If there are stores on both the
- THEN and ELSE arms, then we can go ahead with the conversion;
- either the program is broken, or the condition is always
- false such that the other memory is selected. */
- if (noce_mem_write_may_trap_or_fault_p (orig_x))
- return FALSE;
-
- /* Avoid store speculation: given "if (...) x = a" where x is a
- MEM, we only want to do the store if x is always set
- somewhere in the function. This avoids cases like
- if (pthread_mutex_trylock(mutex))
- ++global_variable;
- where we only want global_variable to be changed if the mutex
- is held. FIXME: This should ideally be expressed directly in
- RTL somehow. */
- if (!noce_can_store_speculate_p (test_bb, orig_x))
- return FALSE;
- }
+ /* We want to avoid store speculation to avoid cases like
+ if (pthread_mutex_trylock(mutex))
+ ++global_variable;
+ Rather than go to much effort here, we rely on the SSA optimizers,
+ which do a good enough job these days. */
+ return FALSE;
if (noce_try_move (if_info))
goto success;
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 194ed9ba959..00334668fa3 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3657,7 +3657,6 @@ extern void init_alias_analysis (void);
extern void end_alias_analysis (void);
extern void vt_equate_reg_base_value (const_rtx, const_rtx);
extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
-extern bool memory_must_be_modified_in_insn_p (const_rtx, const_rtx);
extern bool may_be_sp_based_p (rtx);
extern rtx gen_hard_reg_clobber (machine_mode, unsigned int);
extern rtx get_reg_known_value (unsigned int);