[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp PPC32ISelSimple.cpp PowerPCAsmPrinter.cpp

Nate Begeman natebegeman at mac.com
Wed Nov 24 23:09:17 PST 2004



Changes in directory llvm/lib/Target/PowerPC:

PPC32CodeEmitter.cpp updated: 1.26 -> 1.27
PPC32ISelSimple.cpp updated: 1.111 -> 1.112
PowerPCAsmPrinter.cpp updated: 1.67 -> 1.68
---
Log message:

Enable optimization suggested by Chris Lattner to not emit reloc stubs for
static global variables whose addresses are taken.  This allows us to
convert the following code for taking the address of a static function foo

        addis r2, r30, ha16(Ll1__2E_foo_2$non_lazy_ptr-"L00001$pb")
        lwz r3, lo16(Ll1__2E_foo_2$non_lazy_ptr-"L00001$pb")(r2)

which also includes linker stub code emitted at the end of the .s file not
shown here, and replace it with this:

        addis r2, r30, ha16(l1__2E_foo_2-"L00001$pb")
        la r3, lo16(l1__2E_foo_2-"L00001$pb")(r2)

which in addition to not needing linker help, also has no load instruction.
For those not up on PowerPC mnemonics, la is shorthand for add immediate.


---
Diffs of the changes:  (+18 -21)

Index: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp
diff -u llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.26 llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.27
--- llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.26	Wed Nov 24 18:33:57 2004
+++ llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp	Thu Nov 25 01:09:01 2004
@@ -199,20 +199,20 @@
       Offset = -((intptr_t)MovePCtoLROffset+4);
 
       if (MI.getOpcode() == PPC::LOADHiAddr) {
-        if (GV->hasWeakLinkage() || GV->isExternal() || isa<Function>(GV))
+        if (GV->hasWeakLinkage() || GV->isExternal())
           Reloc = PPC::reloc_absolute_ptr_high;   // Pointer to stub
         else
           Reloc = PPC::reloc_absolute_high;       // Pointer to symbol
 
       } else if (MI.getOpcode() == PPC::LA) {
-        assert(!(GV->hasWeakLinkage() || GV->isExternal() || isa<Function>(GV))
+        assert(!(GV->hasWeakLinkage() || GV->isExternal())
                && "Something in the ISEL changed\n");
 
         Reloc = PPC::reloc_absolute_low;
       } else if (MI.getOpcode() == PPC::LWZ) {
         Reloc = PPC::reloc_absolute_ptr_low;
 
-        assert((GV->hasWeakLinkage() || GV->isExternal() || isa<Function>(GV))&&
+        assert((GV->hasWeakLinkage() || GV->isExternal()) &&
                "Something in the ISEL changed\n");
       } else {
         // These don't show up for global value references AFAIK, only for


Index: llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.111 llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.112
--- llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.111	Wed Nov 24 15:53:14 2004
+++ llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp	Thu Nov 25 01:09:01 2004
@@ -703,7 +703,7 @@
     BuildMI(*MBB, IP, PPC::LOADHiAddr, 2, TmpReg)
       .addReg(getGlobalBaseReg(MBB, IP)).addGlobalAddress(GV);
 
-    if (GV->hasWeakLinkage() || GV->isExternal() || isa<Function>(GV)) {
+    if (GV->hasWeakLinkage() || GV->isExternal()) {
       BuildMI(*MBB, IP, PPC::LWZ, 2, R).addGlobalAddress(GV).addReg(TmpReg);
     } else {
       BuildMI(*MBB, IP, PPC::LA, 2, R).addReg(TmpReg).addGlobalAddress(GV);


Index: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp
diff -u llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.67 llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.68
--- llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.67	Sun Nov 14 15:03:30 2004
+++ llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp	Thu Nov 25 01:09:01 2004
@@ -33,6 +33,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Target/MRegisterInfo.h"
+#include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/StringExtras.h"
 #include <set>
@@ -67,7 +68,7 @@
     bool printInstruction(const MachineInstr *MI);
 
     void printMachineInstruction(const MachineInstr *MI);
-    void printOp(const MachineOperand &MO, bool LoadAddrOp = false);
+    void printOp(const MachineOperand &MO, bool IsCallOp = false);
 
     void printOperand(const MachineInstr *MI, unsigned OpNo, MVT::ValueType VT){
       const MachineOperand &MO = MI->getOperand(OpNo);
@@ -108,7 +109,8 @@
       if (MI->getOperand(OpNo).isImmediate()) {
         O << "$+" << MI->getOperand(OpNo).getImmedValue() << '\n';
       } else {
-        printOp(MI->getOperand(OpNo));
+        printOp(MI->getOperand(OpNo), 
+                TM.getInstrInfo()->isCall(MI->getOpcode()));
       }
     }
     void printPICLabel(const MachineInstr *MI, unsigned OpNo,
@@ -120,7 +122,7 @@
     void printSymbolHi(const MachineInstr *MI, unsigned OpNo,
                        MVT::ValueType VT) {
       O << "ha16(";
-      printOp(MI->getOperand(OpNo), true /* LoadAddrOp */);
+      printOp(MI->getOperand(OpNo));
       O << "-\"L0000" << LabelNumber << "$pb\")";
     }
     void printSymbolLo(const MachineInstr *MI, unsigned OpNo,
@@ -132,7 +134,7 @@
         O << (short)MI->getOperand(OpNo).getImmedValue();
       } else {
         O << "lo16(";
-        printOp(MI->getOperand(OpNo), true /* LoadAddrOp */);
+        printOp(MI->getOperand(OpNo));
         O << "-\"L0000" << LabelNumber << "$pb\")";
       }
     }
@@ -307,8 +309,7 @@
 // Include the auto-generated portion of the assembly writer
 #include "PowerPCGenAsmWriter.inc"
 
-void PowerPCAsmPrinter::printOp(const MachineOperand &MO,
-                              bool LoadAddrOp /* = false */) {
+void PowerPCAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) {
   const MRegisterInfo &RI = *TM.getRegisterInfo();
   int new_symbol;
   
@@ -359,27 +360,23 @@
     // wary however not to output $stub for external functions whose addresses
     // are taken.  Those should be emitted as $non_lazy_ptr below.
     Function *F = dyn_cast<Function>(GV);
-    if (F && F->isExternal() && !LoadAddrOp &&
-        getTM().CalledFunctions.count(F)) {
+    if (F && F->isExternal() && IsCallOp && getTM().CalledFunctions.count(F)) {
       FnStubs.insert(Name);
       O << "L" << Name << "$stub";
       return;
     }
     
     // External or weakly linked global variables need non-lazily-resolved stubs
-    if ((GV->isExternal() || GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()) 
+    if ((GV->isExternal() || GV->hasWeakLinkage() || GV->hasLinkOnceLinkage())
          && getTM().AddressTaken.count(GV)) {
-      GVStubs.insert(Name);
+      if (GV->hasLinkOnceLinkage())
+        LinkOnceStubs.insert(Name);
+      else
+        GVStubs.insert(Name);
       O << "L" << Name << "$non_lazy_ptr";
       return;
     }
-    
-    if (F && LoadAddrOp && getTM().AddressTaken.count(GV)) {
-      LinkOnceStubs.insert(Name);
-      O << "L" << Name << "$non_lazy_ptr";
-      return;
-    }
-            
+
     O << Mang->getValueName(GV);
     return;
   }






More information about the llvm-commits mailing list