Lower llvm.isunordered(a, b) into a != a | b != b.
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Tue, 1 Mar 2005 02:07:58 +0000 (02:07 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Tue, 1 Mar 2005 02:07:58 +0000 (02:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20382 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IntrinsicLowering.cpp

index 85e8ba533fd2e5cb019e8ffd0f9cc55f463bfbe9..0fe49ecedc3d1cc14ef233fe0af9ef6c9c9da6ef 100644 (file)
@@ -206,9 +206,14 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
     break;
   }
   case Intrinsic::isunordered: {
-    static Function *isunorderedFCache = 0;
-    ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
-                    Type::BoolTy, isunorderedFCache);
+    Value *L = CI->getOperand(1);
+    Value *R = CI->getOperand(2);
+
+    Value *LIsNan = new SetCondInst(Instruction::SetNE, L, L, "LIsNan", CI);
+    Value *RIsNan = new SetCondInst(Instruction::SetNE, R, R, "RIsNan", CI);
+    CI->replaceAllUsesWith(
+      BinaryOperator::create(Instruction::Or, LIsNan, RIsNan,
+                             "isunordered", CI));
     break;
   }
   }