Lines 852-857
forward_propagate_subreg (df_ref use, rt
Link Here
|
852 |
return false; |
852 |
return false; |
853 |
} |
853 |
} |
854 |
|
854 |
|
|
|
855 |
/* Try to replace USE with SRC (defined in DEF_INSN) in __asm. */ |
856 |
|
857 |
static bool |
858 |
forward_propagate_asm (df_ref use, rtx def_insn, rtx def_set, rtx reg) |
859 |
{ |
860 |
rtx use_insn = DF_REF_INSN (use), src, use_pat, asm_operands, new_rtx, *loc; |
861 |
int speed_p, i; |
862 |
df_ref *use_vec; |
863 |
|
864 |
gcc_assert ((DF_REF_FLAGS (use) & DF_REF_IN_NOTE) == 0); |
865 |
|
866 |
src = SET_SRC (def_set); |
867 |
use_pat = PATTERN (use_insn); |
868 |
|
869 |
/* In __asm don't replace if src might need more registers than |
870 |
reg, as that could increase register pressure on the __asm. */ |
871 |
use_vec = DF_INSN_USES (def_insn); |
872 |
if (use_vec[0] && use_vec[1]) |
873 |
return false; |
874 |
|
875 |
speed_p = optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_insn)); |
876 |
asm_operands = NULL_RTX; |
877 |
switch (GET_CODE (use_pat)) |
878 |
{ |
879 |
case ASM_OPERANDS: |
880 |
asm_operands = use_pat; |
881 |
break; |
882 |
case SET: |
883 |
if (MEM_P (SET_DEST (use_pat))) |
884 |
{ |
885 |
loc = &SET_DEST (use_pat); |
886 |
new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg, src, speed_p); |
887 |
if (new_rtx) |
888 |
validate_unshare_change (use_insn, loc, new_rtx, true); |
889 |
} |
890 |
asm_operands = SET_SRC (use_pat); |
891 |
break; |
892 |
case PARALLEL: |
893 |
for (i = 0; i < XVECLEN (use_pat, 0); i++) |
894 |
if (GET_CODE (XVECEXP (use_pat, 0, i)) == SET) |
895 |
{ |
896 |
if (MEM_P (SET_DEST (XVECEXP (use_pat, 0, i)))) |
897 |
{ |
898 |
loc = &SET_DEST (XVECEXP (use_pat, 0, i)); |
899 |
new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg, |
900 |
src, speed_p); |
901 |
if (new_rtx) |
902 |
validate_unshare_change (use_insn, loc, new_rtx, true); |
903 |
} |
904 |
asm_operands = SET_SRC (XVECEXP (use_pat, 0, i)); |
905 |
} |
906 |
else if (GET_CODE (XVECEXP (use_pat, 0, i)) == ASM_OPERANDS) |
907 |
asm_operands = XVECEXP (use_pat, 0, i); |
908 |
break; |
909 |
default: |
910 |
gcc_unreachable (); |
911 |
} |
912 |
|
913 |
gcc_assert (asm_operands && GET_CODE (asm_operands) == ASM_OPERANDS); |
914 |
for (i = 0; i < ASM_OPERANDS_INPUT_LENGTH (asm_operands); i++) |
915 |
{ |
916 |
loc = &ASM_OPERANDS_INPUT (asm_operands, i); |
917 |
new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg, src, speed_p); |
918 |
if (new_rtx) |
919 |
validate_unshare_change (use_insn, loc, new_rtx, true); |
920 |
} |
921 |
|
922 |
if (num_changes_pending () == 0 || !apply_change_group ()) |
923 |
return false; |
924 |
|
925 |
num_changes++; |
926 |
return true; |
927 |
} |
928 |
|
855 |
/* Try to replace USE with SRC (defined in DEF_INSN) and simplify the |
929 |
/* Try to replace USE with SRC (defined in DEF_INSN) and simplify the |
856 |
result. */ |
930 |
result. */ |
857 |
|
931 |
|
Lines 863-874
forward_propagate_and_simplify (df_ref u
Link Here
|
863 |
rtx src, reg, new_rtx, *loc; |
937 |
rtx src, reg, new_rtx, *loc; |
864 |
bool set_reg_equal; |
938 |
bool set_reg_equal; |
865 |
enum machine_mode mode; |
939 |
enum machine_mode mode; |
|
|
940 |
int asm_use = -1; |
866 |
|
941 |
|
867 |
if (!use_set) |
942 |
if (INSN_CODE (use_insn) < 0) |
|
|
943 |
asm_use = asm_noperands (PATTERN (use_insn)); |
944 |
|
945 |
if (!use_set && asm_use < 0) |
868 |
return false; |
946 |
return false; |
869 |
|
947 |
|
870 |
/* Do not propagate into PC, CC0, etc. */ |
948 |
/* Do not propagate into PC, CC0, etc. */ |
871 |
if (GET_MODE (SET_DEST (use_set)) == VOIDmode) |
949 |
if (use_set && GET_MODE (SET_DEST (use_set)) == VOIDmode) |
872 |
return false; |
950 |
return false; |
873 |
|
951 |
|
874 |
/* If def and use are subreg, check if they match. */ |
952 |
/* If def and use are subreg, check if they match. */ |
Lines 900-906
forward_propagate_and_simplify (df_ref u
Link Here
|
900 |
if (MEM_P (src) && MEM_READONLY_P (src)) |
978 |
if (MEM_P (src) && MEM_READONLY_P (src)) |
901 |
{ |
979 |
{ |
902 |
rtx x = avoid_constant_pool_reference (src); |
980 |
rtx x = avoid_constant_pool_reference (src); |
903 |
if (x != src) |
981 |
if (x != src && use_set) |
904 |
{ |
982 |
{ |
905 |
rtx note = find_reg_note (use_insn, REG_EQUAL, NULL_RTX); |
983 |
rtx note = find_reg_note (use_insn, REG_EQUAL, NULL_RTX); |
906 |
rtx old_rtx = note ? XEXP (note, 0) : SET_SRC (use_set); |
984 |
rtx old_rtx = note ? XEXP (note, 0) : SET_SRC (use_set); |
Lines 911-916
forward_propagate_and_simplify (df_ref u
Link Here
|
911 |
return false; |
989 |
return false; |
912 |
} |
990 |
} |
913 |
|
991 |
|
|
|
992 |
if (asm_use >= 0) |
993 |
return forward_propagate_asm (use, def_insn, def_set, reg); |
994 |
|
914 |
/* Else try simplifying. */ |
995 |
/* Else try simplifying. */ |
915 |
|
996 |
|
916 |
if (DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE) |
997 |
if (DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE) |