Attach MEM_EXPR information when flushing BLKmode args to the stack - V2
authorJeff Law <jlaw@localhost.localdomain>
Tue, 20 Jul 2021 18:49:54 +0000 (14:49 -0400)
committerJeff Law <jlaw@localhost.localdomain>
Tue, 20 Jul 2021 18:54:15 +0000 (14:54 -0400)
gcc/
* function.c (assign_parm_setup_block): Use adjust_address instead
of change_address to preserve MEM_EXPR and friends.

gcc/function.c

index 00b2fe7..af3d57b 100644 (file)
@@ -3036,7 +3036,15 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
                  reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
                  reg = convert_to_mode (mode, copy_to_reg (reg), 1);
                }
-             emit_move_insn (change_address (mem, mode, 0), reg);
+
+             /* We use adjust_address to get a new MEM with the mode
+                changed.  adjust_address is better than change_address
+                for this purpose because adjust_address does not lose
+                the MEM_EXPR associated with the MEM.
+
+                If the MEM_EXPR is lost, then optimizations like DSE
+                assume the MEM escapes and thus is not subject to DSE.  */
+             emit_move_insn (adjust_address (mem, mode, 0), reg);
            }
 
 #ifdef BLOCK_REG_PADDING