[llvm-commits] [llvm] r149678 - /llvm/trunk/lib/VMCore/AutoUpgrade.cpp
Craig Topper
craig.topper at gmail.com
Thu Feb 2 22:10:55 PST 2012
Author: ctopper
Date: Fri Feb 3 00:10:55 2012
New Revision: 149678
URL: http://llvm.org/viewvc/llvm-project?rev=149678&view=rev
Log:
Add auto upgrade support for x86 pcmpgt/pcmpeq intrinics removed in r149367.
Modified:
llvm/trunk/lib/VMCore/AutoUpgrade.cpp
Modified: llvm/trunk/lib/VMCore/AutoUpgrade.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AutoUpgrade.cpp?rev=149678&r1=149677&r2=149678&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/AutoUpgrade.cpp (original)
+++ llvm/trunk/lib/VMCore/AutoUpgrade.cpp Fri Feb 3 00:10:55 2012
@@ -55,6 +55,16 @@
}
break;
}
+ case 'x': {
+ if (Name.startswith("x86.sse2.pcmpeq.") ||
+ Name.startswith("x86.sse2.pcmpgt.") ||
+ Name.startswith("x86.avx2.pcmpeq.") ||
+ Name.startswith("x86.avx2.pcmpgt.")) {
+ NewFn = 0;
+ return true;
+ }
+ break;
+ }
}
// This may not belong here. This function is effectively being overloaded
@@ -85,13 +95,40 @@
// upgraded intrinsic. All argument and return casting must be provided in
// order to seamlessly integrate with existing context.
void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
- assert(CI->getCalledFunction() && "Intrinsic call is not direct?");
- if (!NewFn) return;
-
+ Function *F = CI->getCalledFunction();
LLVMContext &C = CI->getContext();
IRBuilder<> Builder(C);
Builder.SetInsertPoint(CI->getParent(), CI);
+ assert(F && "Intrinsic call is not direct?");
+
+ if (!NewFn) {
+ // Get the Function's name.
+ StringRef Name = F->getName();
+
+ Value *Rep;
+ // Upgrade packed integer vector compares intrinsics to compare instructions
+ if (Name.startswith("llvm.x86.sse2.pcmpeq.") ||
+ Name.startswith("llvm.x86.avx2.pcmpeq.")) {
+ Rep = Builder.CreateICmpEQ(CI->getArgOperand(0), CI->getArgOperand(1),
+ "pcmpeq");
+ // need to sign extend since icmp returns vector of i1
+ Rep = Builder.CreateSExt(Rep, CI->getType(), "");
+ } else if (Name.startswith("llvm.x86.sse2.pcmpgt.") ||
+ Name.startswith("llvm.x86.avx2.pcmpgt.")) {
+ Rep = Builder.CreateICmpSGT(CI->getArgOperand(0), CI->getArgOperand(1),
+ "pcmpgt");
+ // need to sign extend since icmp returns vector of i1
+ Rep = Builder.CreateSExt(Rep, CI->getType(), "");
+ } else {
+ llvm_unreachable("Unknown function for CallInst upgrade.");
+ }
+
+ CI->replaceAllUsesWith(Rep);
+ CI->eraseFromParent();
+ return;
+ }
+
switch (NewFn->getIntrinsicID()) {
default:
llvm_unreachable("Unknown function for CallInst upgrade.");
More information about the llvm-commits
mailing list