m68k: don't allow o/o in movdi, movdf, movxf
The movdi, movdf and movxf patterns allow both operands to be offsettable memory, but output_move_double cannot handle overlapping objects. This is visible in the failure of gcc.c-torture/execute/pr97073.c when compiled with LTO (where cprop optimizes out the AND operation; the failure also occurs without LTO when the AND is removed). Split the constraints so that the operands cannot both be "o" in the same insn. * config/m68k/m68k.md (movdi+1, movdf+1, movxf+2): Split constraints so that the operands cannot both be "o".
This commit is contained in:
parent
a3e5fbcd05
commit
cec97549b7
1 changed files with 6 additions and 6 deletions
|
@ -1354,8 +1354,8 @@
|
|||
})
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:DF 0 "nonimmediate_operand" "=rm,rf,rf,&rof<>")
|
||||
(match_operand:DF 1 "general_operand" "*rf,m,0,*rofE<>"))]
|
||||
[(set (match_operand:DF 0 "nonimmediate_operand" "=rm,rf,rf,&rof<>,&rf<>")
|
||||
(match_operand:DF 1 "general_operand" "*rf,m,0,*rfE<>,*rofE<>"))]
|
||||
; [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,&rf,&rof<>")
|
||||
; (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]
|
||||
"!TARGET_COLDFIRE"
|
||||
|
@ -1514,8 +1514,8 @@
|
|||
[(set_attr "flags_valid" "move")])
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>")
|
||||
(match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))]
|
||||
[(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>,&rf<>")
|
||||
(match_operand:XF 1 "nonimmediate_operand" "rf,m,rf<>,rof<>"))]
|
||||
"! TARGET_68881 && ! TARGET_COLDFIRE"
|
||||
{
|
||||
if (FP_REG_P (operands[0]))
|
||||
|
@ -1568,8 +1568,8 @@
|
|||
;; movdi can apply to fp regs in some cases
|
||||
(define_insn ""
|
||||
;; Let's see if it really still needs to handle fp regs, and, if so, why.
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "=rm,r,&ro<>")
|
||||
(match_operand:DI 1 "general_operand" "rF,m,roi<>F"))]
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "=rm,r,&ro<>,&r<>")
|
||||
(match_operand:DI 1 "general_operand" "rF,m,ri<>F,roi<>F"))]
|
||||
; [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&r,&ro<>,!&rm,!&f")
|
||||
; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF"))]
|
||||
; [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&rf,&ro<>,!&rm,!&f")
|
||||
|
|
Loading…
Add table
Reference in a new issue