When using a 4 byte jump table on a 64 bit machine,
authorDuncan Sands <baldrick@free.fr>
Fri, 12 Dec 2008 08:13:38 +0000 (08:13 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 12 Dec 2008 08:13:38 +0000 (08:13 +0000)
do an extending load of the 4 bytes rather than a
potentially illegal (type) i32 load followed by a
sign extend.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60945 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 2108abf302f2f9496501385772b9065a8a8cd83b..1ec9bb11266817bafc573f233134a93732d98f23 100644 (file)
@@ -1951,23 +1951,15 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
       unsigned EntrySize = MF.getJumpTableInfo()->getEntrySize();
       Index= DAG.getNode(ISD::MUL, PTy, Index, DAG.getConstant(EntrySize, PTy));
       SDValue Addr = DAG.getNode(ISD::ADD, PTy, Index, Table);
-      
-      SDValue LD;
-      switch (EntrySize) {
-      default: assert(0 && "Size of jump table not supported yet."); break;
-      case 4: LD = DAG.getLoad(MVT::i32, Chain, Addr,
-                               PseudoSourceValue::getJumpTable(), 0); break;
-      case 8: LD = DAG.getLoad(MVT::i64, Chain, Addr,
-                               PseudoSourceValue::getJumpTable(), 0); break;
-      }
 
+      MVT MemVT = MVT::getIntegerVT(EntrySize * 8);
+      SDValue LD = DAG.getExtLoad(ISD::SEXTLOAD, PTy, Chain, Addr,
+                                  PseudoSourceValue::getJumpTable(), 0, MemVT);
       Addr = LD;
       if (TLI.getTargetMachine().getRelocationModel() == Reloc::PIC_) {
         // For PIC, the sequence is:
         // BRIND(load(Jumptable + index) + RelocBase)
         // RelocBase can be JumpTable, GOT or some sort of global base.
-        if (PTy != MVT::i32)
-          Addr = DAG.getNode(ISD::SIGN_EXTEND, PTy, Addr);
         Addr = DAG.getNode(ISD::ADD, PTy, Addr,
                            TLI.getPICJumpTableRelocBase(Table, DAG));
       }