Message ID | alpine.BSF.2.00.1106060006270.49583@dair.pair.com |
---|---|
State | New |
Headers | show |
Hans-Peter Nilsson <hp@bitrange.com> writes: > I needed a baseline for PR48542 (problems with setjmp/longjmp), but > building MMIX was broken on trunk. It was "bitten" by the fixups to > predicate matching done recentlish. The comment above the MMIX > truncdfsf2 expander complains about having to use an expander to > force an operand to memory - and then goes on and uses memory_operand > for that operand anyway! That accidentally worked before the fixup, > because after copying the failing operand to a new pseudo, the > expander was called without the optabs machinery doublechecking the > new pseudo against the predicate. While I stand by the comment and > still think the optabs machinery could automatically fix up operands > as needed to force an operand into memory when the predicate says so, > it hasn't worked like that before, and I guess it's no use adding > something like that just for one port, where an expander will do. FWIW, having a target-independent feature sounds like a good idea to me. It's similar in spirit to the new code that tries to force addresses into registers if a memory predicate rejects a mem. That too is something that was often handled by expanders, but which is nicer without. The implementation could be along the same lines. Have an allows_reg field in recog_data that says whether the predicate allows registers. If it doesn't, try forcing to a stack slot instead of to registers. Richard
Index: gcc/config/mmix/mmix.md =================================================================== --- gcc/config/mmix/mmix.md (revision 174376) +++ gcc/config/mmix/mmix.md (working copy) @@ -625,8 +625,8 @@ (define_insn "fixuns_truncdfdi2" ;; define_expand with the old pattern as "anonymous". ;; FIXME: Perhaps with SECONDARY_MEMORY_NEEDED? (define_expand "truncdfsf2" - [(set (match_operand:SF 0 "memory_operand" "") - (float_truncate:SF (match_operand:DF 1 "register_operand" "")))] + [(set (match_operand:SF 0 "nonimmediate_operand") + (float_truncate:SF (match_operand:DF 1 "register_operand")))] "" " { @@ -660,8 +660,8 @@ (define_insn "*truncdfsf2_real" ;; Same comment as for truncdfsf2. (define_expand "extendsfdf2" - [(set (match_operand:DF 0 "register_operand" "=r") - (float_extend:DF (match_operand:SF 1 "memory_operand" "m")))] + [(set (match_operand:DF 0 "register_operand") + (float_extend:DF (match_operand:SF 1 "nonimmediate_operand")))] "" " {