diff mbox

[committed] rs6000_secondary_reload_inner (PR target/64226)

Message ID CAGWvny=AKTV9MYdyga7F-nvSSVqZ_QCCJgxk5NAQLnu9WWiG=w@mail.gmail.com
State New
Headers show

Commit Message

David Edelsohn Dec. 8, 2014, 11:45 p.m. UTC
The patch removes code from rs6000_secondary_reload_inner that
explicitly called create_TOC_reference on SYMBOL_REF, CONST, and
LABEL_REF involved in a secondary reload.  find_reload was choosing an
equivalence of a symbol_ref that referenced the raw data and secondary
reload code was creating a direct reference to the data instead of a
TOC reference, treating the symbol offset as a TOC offset, which was
invalid.  This generated code that performed a load from a wild
address and garbage data.

As Uli pointed out, rs6000_emit_move already knows how and when to
create TOC references.

Mike Meissner tested the patch with PPC32 and PPC64 Linux.  I have
bootstrapped and tested on powerpc-ibm-aix7.1.0.0.  This fixes all of
failures in the GCC VMX testsuite on AIX.

Thanks, David

        * config/rs6000/rs6000.c (rs6000_secondary_reload_inner)
[SYMBOL_REF]: Do not explicitly call create_TOC_reference for
TARGET_TOC. Always use rs6000_emit_move.
diff mbox

Patch

Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c      (revision 218496)
+++ config/rs6000/rs6000.c      (working copy)
@@ -17379,12 +17379,7 @@  rs6000_secondary_reload_inner (rtx reg, rtx mem, r
     case SYMBOL_REF:
     case CONST:
     case LABEL_REF:
-      if (TARGET_TOC)
-       emit_insn (gen_rtx_SET (VOIDmode, scratch,
-                               create_TOC_reference (addr, scratch)));
-      else
-       rs6000_emit_move (scratch, addr, Pmode);
-
+      rs6000_emit_move (scratch, addr, Pmode);
       new_addr = scratch;
       break;