MSP430: Dont add offsets to addresses when emitting asm for post_inc
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Fri, 10 Apr 2020 16:31:33 +0000 (17:31 +0100)
committerJozef Lawrynowicz <jozef.l@mittosystems.com>
Mon, 13 Apr 2020 09:50:40 +0000 (10:50 +0100)
Some insns, which operate on SImode operands, output assembler template
that comprise of multiple instructions using HImode operands. To access
the high word of an SImode operand, an operand selector '%H' is used to
offset the operand value by a constant amount.

When one of these HImode operands is a memory reference to a post_inc,
the address does not need to be offset, since the preceding instruction
has already offset the address to the correct value.

This fixes an ICE in change_address_1, at emit-rtl.c:2318 for
gcc.c-torture/execute/pr20527-1.c in the "-mlarge -O2 -flto
-fuse-linker-plugin -fno-fat-lto-objects" configuration.

This test generated the following insn, and the attempt to output the
high part of the post_inc address caused the ICE.
(set (reg:SI 6 R6)
     (minus:SI (reg:SI 6 R6)
               (mem:SI (post_inc:PSI (reg:PSI 10 R10)) {subsi3}

gcc/ChangeLog:

2020-04-13  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* config/msp430/msp430.c (msp430_print_operand): Don't add offsets to
memory references in %B, %C and %D operand selectors when the inner
operand is a post increment address.

gcc/ChangeLog
gcc/config/msp430/msp430.c

index c0ac32dccf6e11c7994d08272ddd509f492bfdc3..8bfc2127989bd01447523c6004b8b8ce193bd86e 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-13  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config/msp430/msp430.c (msp430_print_operand): Don't add offsets to
+       memory references in %B, %C and %D operand selectors when the inner
+       operand is a post increment address.
+
 2020-04-13  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * config/msp430/msp430.c (msp430_print_operand): Offset a %C memory
index 96532740ac15b031a1e42799f0b67396f1be83c0..e77ca101599d9ed704575dcdb90eefa8b808b5c2 100644 (file)
@@ -3474,7 +3474,9 @@ msp430_print_operand (FILE * file, rtx op, int letter)
       switch (GET_CODE (op))
        {
        case MEM:
-         op = adjust_address (op, Pmode, 2);
+         /* We don't need to adjust the address for post_inc.  */
+         op = adjust_address (op, Pmode,
+                              (GET_CODE (XEXP (op, 0)) == POST_INC) ? 0 : 2);
          break;
        case REG:
          op = gen_rtx_REG (Pmode, REGNO (op) + 1);
@@ -3492,7 +3494,8 @@ msp430_print_operand (FILE * file, rtx op, int letter)
       switch (GET_CODE (op))
        {
        case MEM:
-         op = adjust_address (op, Pmode, 4);
+         op = adjust_address (op, Pmode,
+                              (GET_CODE (XEXP (op, 0)) == POST_INC) ? 0 : 4);
          break;
        case REG:
          op = gen_rtx_REG (Pmode, REGNO (op) + 2);
@@ -3510,7 +3513,8 @@ msp430_print_operand (FILE * file, rtx op, int letter)
       switch (GET_CODE (op))
        {
        case MEM:
-         op = adjust_address (op, Pmode, 6);
+         op = adjust_address (op, Pmode,
+                              (GET_CODE (XEXP (op, 0)) == POST_INC) ? 0 : 6);
          break;
        case REG:
          op = gen_rtx_REG (Pmode, REGNO (op) + 3);