===================================================================
@@ -15079,30 +15079,8 @@
ix86_avx_u128_mode_after (int mode, rtx insn)
{
rtx pat = PATTERN (insn);
- rtx reg = NULL;
- int i;
enum upper_128bits_state state;
- /* Check for CALL instruction. */
- if (CALL_P (insn))
- {
- if (GET_CODE (pat) == SET || GET_CODE (pat) == CALL)
- reg = SET_DEST (pat);
- else if (GET_CODE (pat) == PARALLEL)
- for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
- {
- rtx x = XVECEXP (pat, 0, i);
- if (GET_CODE(x) == SET)
- reg = SET_DEST (x);
- }
- /* Mode after call is set to AVX_U128_DIRTY if there are
- 256bit modes used in the function return register. */
- if (reg && REG_P (reg) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (reg)))
- return AVX_U128_DIRTY;
- else
- return AVX_U128_CLEAN;
- }
-
if (vzeroupper_operation (pat, VOIDmode)
|| vzeroall_operation (pat, VOIDmode))
return AVX_U128_CLEAN;
@@ -15112,6 +15090,10 @@
note_stores (pat, check_avx256_stores, &state);
if (state == used)
return AVX_U128_DIRTY;
+ /* We know that state is clean after CALL insn if there are no
+ 256bit modes used in the function return register. */
+ else if (CALL_P (insn) && state == unused)
+ return AVX_U128_CLEAN;
return mode;
}