summaryrefslogtreecommitdiff
path: root/gcc/mode-switching.c
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2007-07-10 01:01:11 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2007-07-10 01:01:11 +0000
commit89ab46599d72839cb0b823baaaad4b76b384a543 (patch)
tree178762480d117e6b39ac6b9f575f63df1f6642e2 /gcc/mode-switching.c
parent823c696f9b593b5b7225d87587fba3f2d6acd41f (diff)
re PR rtl-optimization/32664 ([sh] ICE in create_pre_exit, at mode-switching.c:373)
PR rtl-optimization/32664 * mode-switching.c (create_pre_exit): Skip barrier insns. From-SVN: r126507
Diffstat (limited to 'gcc/mode-switching.c')
-rw-r--r--gcc/mode-switching.c38
1 files changed, 27 insertions, 11 deletions
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. */