Use subregs to improve any_extend code generation when feasible.
authorChristopher Lamb <christopher.lamb@gmail.com>
Fri, 10 Aug 2007 22:22:41 +0000 (22:22 +0000)
committerChristopher Lamb <christopher.lamb@gmail.com>
Fri, 10 Aug 2007 22:22:41 +0000 (22:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41013 91177308-0d34-0410-b5e6-96231b3b80d8

CREDITS.TXT
lib/Target/X86/README.txt
lib/Target/X86/X86ISelDAGToDAG.cpp

index 13611d22ab5252f0cd33b507bf71e0bd0dd9592f..8dfed1975932ff25c6450c873b9e6556becfdb35 100644 (file)
@@ -135,7 +135,8 @@ D: Author of the original C backend
 
 N: Christopher Lamb
 E: christopher.lamb@gmail.com
-D: aligned load/store support
+D: aligned load/store support, parts of noalias and restrict support
+D: vreg subreg infrastructure, X86 codegen improvements based on subregs
 
 N: Jim Laskey
 E: jlaskey@apple.com
index 073e2dacef183b26bab7ac32332d4a19f2702471..96f494181eff6fea9b8659ed998b35ba7277b95e 100644 (file)
@@ -532,22 +532,6 @@ the load's chain result is read by the callseq_start.
 
 //===---------------------------------------------------------------------===//
 
-Don't forget to find a way to squash noop truncates in the JIT environment.
-
-//===---------------------------------------------------------------------===//
-
-Implement anyext in the same manner as truncate that would allow them to be
-eliminated.
-
-//===---------------------------------------------------------------------===//
-
-How about implementing truncate / anyext as a property of machine instruction
-operand? i.e. Print as 32-bit super-class register / 16-bit sub-class register.
-Do this for the cases where a truncate / anyext is guaranteed to be eliminated.
-For IA32 that is truncate from 32 to 16 and anyext from 16 to 32.
-
-//===---------------------------------------------------------------------===//
-
 For this:
 
 int test(int a)
index 97da290ffc90545da558b8eae2b8b3c7a8acfc58..f0331b83a1a9f53488d8a1c80ecd5d7a2604a517 100644 (file)
@@ -1372,6 +1372,39 @@ SDNode *X86DAGToDAGISel::Select(SDOperand N) {
 
       return NULL;
     }
+
+    case ISD::ANY_EXTEND: {
+      SDOperand N0 = Node->getOperand(0);
+      AddToISelQueue(N0);
+      if (NVT == MVT::i64 || NVT == MVT::i32 || NVT == MVT::i16) {
+        SDOperand SRIdx;
+        switch(N0.getValueType()) {
+        case MVT::i32:
+          SRIdx = CurDAG->getTargetConstant(3, MVT::i32); // SubRegSet 3
+          break;
+        case MVT::i16:
+          SRIdx = CurDAG->getTargetConstant(2, MVT::i32); // SubRegSet 2
+          break;
+        case MVT::i8:
+          if (Subtarget->is64Bit())
+            SRIdx = CurDAG->getTargetConstant(1, MVT::i32); // SubRegSet 1
+          break;
+        default: assert(0 && "Unknown any_extend!");
+        }
+        if (SRIdx.Val) {
+          SDNode *ResNode = CurDAG->getTargetNode(X86::INSERT_SUBREG, NVT, N0, SRIdx);
+
+#ifndef NDEBUG
+          DOUT << std::string(Indent-2, ' ') << "=> ";
+          DEBUG(ResNode->dump(CurDAG));
+          DOUT << "\n";
+          Indent -= 2;
+#endif
+          return ResNode;
+        } // Otherwise let generated ISel handle it.
+      }
+      break;
+    }
     
     case ISD::SIGN_EXTEND_INREG: {
       SDOperand N0 = Node->getOperand(0);