//
//===----------------------------------------------------------------------===//
-#include "llvm/IntrinsicLowering.h"
+#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Module.h"
-#include "llvm/iOther.h"
+#include "llvm/Instructions.h"
+#include <iostream>
+
using namespace llvm;
template <class ArgIt>
std::string Name = CI->getName(); CI->setName("");
if (FT->getReturnType() == Type::VoidTy) Name.clear();
- return new CallInst(FCache, Operands, Name, CI);
+ CallInst *NewCI = new CallInst(FCache, Operands, Name, CI);
+ if (!CI->use_empty()) {
+ Value *V = NewCI;
+ if (CI->getType() != NewCI->getType())
+ V = new CastInst(NewCI, CI->getType(), Name, CI);
+ CI->replaceAllUsesWith(V);
+ }
+ return NewCI;
}
void DefaultIntrinsicLowering::AddPrototypes(Module &M) {
EnsureFunctionExists(M, "memset", I->abegin(), --I->aend(),
I->abegin()->getType());
break;
-
+ case Intrinsic::isunordered:
+ EnsureFunctionExists(M, "isunordered", I->abegin(), I->aend(), Type::BoolTy);
+ break;
}
}
(*(CI->op_begin()+1))->getType(), MemsetFCache);
break;
}
- case Intrinsic::isnan: {
- // FIXME: This should force the argument to be a double. There may be
- // multiple isnans for different FP arguments.
- static Function *isnanFCache = 0;
- ReplaceCallWith("isnan", CI, CI->op_begin()+1, CI->op_end(),
- (*(CI->op_begin()+1))->getType(), isnanFCache);
+ case Intrinsic::isunordered: {
+ static Function *isunorderedFCache = 0;
+ ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
+ Type::BoolTy, isunorderedFCache);
break;
}
}