diff --git a/include/diy/factory.hpp b/include/diy/factory.hpp
index 90d4ff37fff65b95aee495d5c014e36956fa770e..27f59f443f2f5b9380db0d0b255333a7fd9c6372 100644
--- a/include/diy/factory.hpp
+++ b/include/diy/factory.hpp
@@ -37,11 +37,14 @@ class Factory
                 };
                 return true;
             }
-            static bool registered;
+            static volatile bool registered;
 
             std::string id() const override     { return typeid(T).name(); }
 
             private:
+#if defined(__INTEL_COMPILER)
+                __attribute__ ((used))
+#endif
                 Registrar(): Base(Key{}) { (void)registered; }
         };
 
@@ -67,7 +70,7 @@ class Factory
 
 template <class Base, class... Args>
 template <class T>
-bool Factory<Base, Args...>::Registrar<T>::registered = Factory<Base, Args...>::Registrar<T>::registerT();
+volatile bool Factory<Base, Args...>::Registrar<T>::registered = Factory<Base, Args...>::Registrar<T>::registerT();
 
 }
 
diff --git a/include/diy/mpi.hpp b/include/diy/mpi.hpp
index 2b741247ee75e69dc308d2e5e873d1e9efceb4b9..d9dd288a711eb26996e7d818c6adcc92be292e93 100644
--- a/include/diy/mpi.hpp
+++ b/include/diy/mpi.hpp
@@ -42,7 +42,7 @@ diy::mpi::environment::
 environment(int threading)
 {
 #ifndef DIY_NO_MPI
-  int argc = 0; char** argv;
+  int argc = 0; char** argv = { NULL };
   MPI_Init_thread(&argc, &argv, threading, &provided_threading);
 #else
   provided_threading = threading;