From 3af34e6095ee64332c089c98128dcfbcccced65e Mon Sep 17 00:00:00 2001
From: Gleb Popov <6yearold@gmail.com>
Date: Tue, 12 Nov 2019 14:38:19 +0400
Subject: Implement @llvm.is.constant() intrinsic handling and add a test for
 it.

---
 lib/Module/IntrinsicCleaner.cpp | 12 ++++++++++++
 1 file changed, 12 insertions(+)

(limited to 'lib/Module/IntrinsicCleaner.cpp')

diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp
index 2c86d56d..f59192c1 100644
--- a/lib/Module/IntrinsicCleaner.cpp
+++ b/lib/Module/IntrinsicCleaner.cpp
@@ -11,6 +11,7 @@
 
 #include "klee/Config/Version.h"
 #include "llvm/Analysis/MemoryBuiltins.h"
+#include "llvm/Analysis/ConstantFolding.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Function.h"
@@ -324,6 +325,17 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) {
         dirty = true;
         break;
       }
+#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0)
+      case Intrinsic::is_constant: {
+        if(auto* constant = llvm::ConstantFoldInstruction(ii, ii->getModule()->getDataLayout()))
+          ii->replaceAllUsesWith(constant);
+        else
+          ii->replaceAllUsesWith(ConstantInt::getFalse(ii->getType()));
+        ii->eraseFromParent();
+        dirty = true;
+        break;
+      }
+#endif
       default:
         IL->LowerIntrinsicCall(ii);
         dirty = true;
-- 
cgit 1.4.1