summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/mode-switching.c38
2 files changed, 32 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index db3a99c1dfa..0261aa57138 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-10 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ PR rtl-optimization/32664
+ * mode-switching.c (create_pre_exit): Skip barrier insns.
+
2007-07-10 Zdenek Dvorak <dvorakz@suse.cz>
* tree-scalar-evolution.c (scev_const_prop): Add arguments to
diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c
index 0e4f58caef0..e935acdd979 100644
--- a/gcc/mode-switching.c
+++ b/gcc/mode-switching.c
@@ -246,21 +246,37 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
if (INSN_P (return_copy))
{
- if (GET_CODE (PATTERN (return_copy)) == USE
- && GET_CODE (XEXP (PATTERN (return_copy), 0)) == REG
- && (FUNCTION_VALUE_REGNO_P
- (REGNO (XEXP (PATTERN (return_copy), 0)))))
- {
- maybe_builtin_apply = 1;
- last_insn = return_copy;
- continue;
- }
- if (GET_CODE (PATTERN (return_copy)) == ASM_INPUT
- && strcmp (XSTR (PATTERN (return_copy), 0), "") == 0)
+ return_copy_pat = PATTERN (return_copy);
+ switch (GET_CODE (return_copy_pat))
{
+ case USE:
+ /* Skip __builtin_apply pattern. */
+ if (GET_CODE (XEXP (return_copy_pat, 0)) == REG
+ && (FUNCTION_VALUE_REGNO_P
+ (REGNO (XEXP (return_copy_pat, 0)))))
+ {
+ maybe_builtin_apply = 1;
+ last_insn = return_copy;
+ continue;
+ }
+ break;
+
+ case ASM_OPERANDS:
+ /* Skip barrier insns. */
+ if (!MEM_VOLATILE_P (return_copy_pat))
+ break;
+
+ /* Fall through. */
+
+ case ASM_INPUT:
+ case UNSPEC_VOLATILE:
last_insn = return_copy;
continue;
+
+ default:
+ break;
}
+
/* If the return register is not (in its entirety)
likely spilled, the return copy might be
partially or completely optimized away. */