Revert r131664 and fix it in instcombine instead. rdar://9467055
authorEvan Cheng <evan.cheng@apple.com>
Fri, 20 May 2011 00:54:37 +0000 (00:54 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 20 May 2011 00:54:37 +0000 (00:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131708 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMSubtarget.cpp
lib/Target/ARM/ARMSubtarget.h
lib/Target/X86/X86ISelLowering.cpp
lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
test/CodeGen/X86/crc64.ll [deleted file]
test/Transforms/InstCombine/x86-crc32-demanded.ll [new file with mode: 0644]

index e9a996328f8249cbb1cf0985edc939b581533498..2c90aa28fe7e64e7044c0628e9cb3abc00b310e0 100644 (file)
@@ -1182,7 +1182,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
   bool IsStructRet    = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
   bool IsSibCall = false;
   // Temporarily disable tail calls so things don't break.
-  if (!EnableARMTailCalls)
+  if (!EnableARMTailCalls && !Subtarget->supportsTailCall())
     isTailCall = false;
   if (isTailCall) {
     // Check if it's really possible to do a tail call.
index c6f266b0753100b6ea9a6d7075bf0f8fa7dd69f0..0509d58c2af3547d66653a0ea2c108b9fb55aa61 100644 (file)
@@ -46,6 +46,7 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
   , PostRAScheduler(false)
   , IsR9Reserved(ReserveR9)
   , UseMovt(false)
+  , SupportsTailCall(false)
   , HasFP16(false)
   , HasD16(false)
   , HasHardwareDivide(false)
@@ -153,6 +154,8 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
   else {
     IsR9Reserved = ReserveR9 | (ARMArchVersion < V6);
     UseMovt = DarwinUseMOVT && hasV6T2Ops();
+    const Triple &T = getTargetTriple();
+    SupportsTailCall = T.getOS() == Triple::IOS && !T.isOSVersionLT(5, 0);
   }
 
   if (!isThumb() || hasThumb2())
index 0271c873f191a92942c00925f408e9230d3b8689..c1494109a45541a338f7b6b8036580415208ad37 100644 (file)
@@ -87,6 +87,11 @@ protected:
   /// imms (including global addresses).
   bool UseMovt;
 
+  /// SupportsTailCall - True if the OS supports tail call. The dynamic linker
+  /// must be able to synthesize call stubs for interworking between ARM and
+  /// Thumb.
+  bool SupportsTailCall;
+
   /// HasFP16 - True if subtarget supports half-precision FP (We support VFP+HF
   /// only so far)
   bool HasFP16;
@@ -217,6 +222,7 @@ protected:
   bool isR9Reserved() const { return IsR9Reserved; }
 
   bool useMovt() const { return UseMovt && hasV6T2Ops(); }
+  bool supportsTailCall() const { return SupportsTailCall; }
 
   bool allowsUnalignedMem() const { return AllowsUnalignedMem; }
 
index 88f5d31f1d09e575e5c980e265f01fc731cc575f..e5156f8d413ad06e3d2de303b6427f472a466910 100644 (file)
@@ -10939,19 +10939,6 @@ void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op,
     KnownZero |= APInt::getHighBitsSet(Mask.getBitWidth(),
                                        Mask.getBitWidth() - 1);
     break;
-
-  case ISD::INTRINSIC_WO_CHAIN: {
-    unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
-    switch (IntNo) {
-      default: break;
-      case Intrinsic::x86_sse42_crc64_8:
-      case Intrinsic::x86_sse42_crc64_64:
-        // crc32 with 64-bit destination zeros high 32-bit.
-        KnownZero |= APInt::getHighBitsSet(64, 32);
-        break;
-    }
-    break;
-  }
   }
 }
 
index 9863ceb731c8059f63fe8006e9695736afdd1353..e3a117fa4acb959faa2f565a4b55bef150df1e08 100644 (file)
@@ -780,6 +780,10 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
         // TODO: Could compute known zero/one bits based on the input.
         break;
       }
+      case Intrinsic::x86_sse42_crc64_8:
+      case Intrinsic::x86_sse42_crc64_64:
+        KnownZero = APInt::getHighBitsSet(64, 32);
+        return 0;
       }
     }
     ComputeMaskedBits(V, DemandedMask, KnownZero, KnownOne, Depth);
diff --git a/test/CodeGen/X86/crc64.ll b/test/CodeGen/X86/crc64.ll
deleted file mode 100644 (file)
index 1e0aa0d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-; RUN: llc < %s -march=x86-64 -mattr=sse42 | FileCheck %s
-
-; crc32 with 64-bit destination zeros high 32-bit.
-; rdar://9467055
-
-define i64 @t() nounwind {
-entry:
-; CHECK: t:
-; CHECK: crc32q
-; CHECK-NOT: mov
-; CHECK-NEXT: crc32q
-  %0 = tail call i64 @llvm.x86.sse42.crc64.64(i64 0, i64 4) nounwind
-  %1 = and i64 %0, 4294967295
-  %2 = tail call i64 @llvm.x86.sse42.crc64.64(i64 %1, i64 4) nounwind
-  %3 = and i64 %2, 4294967295
-  ret i64 %3
-}
-
-declare i64 @llvm.x86.sse42.crc64.64(i64, i64) nounwind readnone
diff --git a/test/Transforms/InstCombine/x86-crc32-demanded.ll b/test/Transforms/InstCombine/x86-crc32-demanded.ll
new file mode 100644 (file)
index 0000000..be257ac
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+; crc32 with 64-bit destination zeros high 32-bit.
+; rdar://9467055
+
+define i64 @test() nounwind {
+entry:
+; CHECK: test
+; CHECK: tail call i64 @llvm.x86.sse42.crc64.64
+; CHECK-NOT: and
+; CHECK: ret
+  %0 = tail call i64 @llvm.x86.sse42.crc64.64(i64 0, i64 4) nounwind
+  %1 = and i64 %0, 4294967295
+  ret i64 %1
+}
+
+declare i64 @llvm.x86.sse42.crc64.64(i64, i64) nounwind readnone