[Support] Call isl_*_free() only on non-null pointers. NFC.
authorMichael Kruse <llvm@meinersbur.de>
Fri, 30 Sep 2016 15:29:43 +0000 (15:29 +0000)
committerMichael Kruse <llvm@meinersbur.de>
Fri, 30 Sep 2016 15:29:43 +0000 (15:29 +0000)
Add a non-NULL check before calling the free function into functions that are
supposed to be inlined. First, this is a form of partial inlining of the free
function, namely the nullptr test that free has to do. Secondly, and more
importantly, it allows the compiler to remove the call to isl_*_free() when it
knows that the object is nullptr, for instance because the last call is a
take(). "Consuming" the last use of an ISL object using take()
(instead of copy()) is a common pattern.

llvm-svn: 282864

polly/include/polly/Support/GICHelper.h

index b968ece..53c13e0 100644 (file)
@@ -260,10 +260,14 @@ public:
     That.Obj = nullptr;
   }
   /* implicit */ IslPtr(NonowningIslPtr<T> That) : IslPtr(That.copy(), true) {}
-  ~IslPtr() { Traits::free(Obj); }
+  ~IslPtr() {
+    if (Obj)
+      Traits::free(Obj);
+  }
 
   ThisTy &operator=(const ThisTy &That) {
-    Traits::free(this->Obj);
+    if (Obj)
+      Traits::free(Obj);
     this->Obj = Traits::copy(That.Obj);
     return *this;
   }