[llvm-commits] [dragonegg] r163624 - in /dragonegg/trunk: src/Convert.cpp test/validator/c++/2005-07-21-VirtualBaseAccess.cpp test/validator/c++/2012-04-27-Alias.cpp

Duncan Sands baldrick at free.fr
Tue Sep 11 09:01:07 PDT 2012


Author: baldrick
Date: Tue Sep 11 11:01:07 2012
New Revision: 163624

URL: http://llvm.org/viewvc/llvm-project?rev=163624&view=rev
Log:
Generate tons of llvm.lifetime.end intrinsics when using gcc-4.7 or better:
these compilers know when variables go out of scope and note this explicitly
in the gimple.

Modified:
    dragonegg/trunk/src/Convert.cpp
    dragonegg/trunk/test/validator/c++/2005-07-21-VirtualBaseAccess.cpp
    dragonegg/trunk/test/validator/c++/2012-04-27-Alias.cpp

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=163624&r1=163623&r2=163624&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Tue Sep 11 11:01:07 2012
@@ -8316,11 +8316,25 @@
 
 #if (GCC_MINOR > 6)
   // Assigning a right-hand side with TREE_CLOBBER_P says that the left-hand
-  // side is dead from this point on.
-  // TODO: Consider outputting an llvm.lifetime.end intrinsic to indicate this.
+  // side is dead from this point on.  Output an llvm.lifetime.end intrinsic.
   if (get_gimple_rhs_class(gimple_expr_code(stmt)) == GIMPLE_SINGLE_RHS &&
-      TREE_CLOBBER_P(gimple_assign_rhs1(stmt)))
+      TREE_CLOBBER_P(gimple_assign_rhs1(stmt))) {
+    // Be conservative and only output the intrinsic if the left-hand side
+    // corresponds to some kind of concrete object.  Note that we generate
+    // code to read from RESULT_DECLs before returning from the function, so
+    // saying that a RESULT_DECL is dead means we are dead - which is why we
+    // don't even consider it.
+    if (isa<PARM_DECL>(lhs) || isa<VAR_DECL>(lhs)) {
+      Value *LHSAddr = Builder.CreateBitCast(DECL_LOCAL(lhs),
+                                             Builder.getInt8PtrTy());
+      uint64_t LHSSize = isInt64(DECL_SIZE(lhs), true) ?
+        getInt64(DECL_SIZE(lhs), true) / 8 : ~0UL;
+      Function *EndIntr = Intrinsic::getDeclaration(TheModule,
+                                                    Intrinsic::lifetime_end);
+      Builder.CreateCall2(EndIntr, Builder.getInt64(LHSSize), LHSAddr);
+    }
     return;
+  }
 #endif
 
   if (isa<AGGREGATE_TYPE>(TREE_TYPE(lhs))) {

Modified: dragonegg/trunk/test/validator/c++/2005-07-21-VirtualBaseAccess.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c%2B%2B/2005-07-21-VirtualBaseAccess.cpp?rev=163624&r1=163623&r2=163624&view=diff
==============================================================================
--- dragonegg/trunk/test/validator/c++/2005-07-21-VirtualBaseAccess.cpp (original)
+++ dragonegg/trunk/test/validator/c++/2005-07-21-VirtualBaseAccess.cpp Tue Sep 11 11:01:07 2012
@@ -8,10 +8,11 @@
 
 struct BAR : virtual FOO { BAR(); };
 
-int testfn() {
+BAR testfn() {
   // CHECK: "alloca point" = bitcast i32 0 to i32
   // CHECK: "ssa point" = bitcast i32 0 to i32
   // CHECK-NOT: cast
   BAR B;
   foo(&B.X);
+  return B;
 }

Modified: dragonegg/trunk/test/validator/c++/2012-04-27-Alias.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c%2B%2B/2012-04-27-Alias.cpp?rev=163624&r1=163623&r2=163624&view=diff
==============================================================================
--- dragonegg/trunk/test/validator/c++/2012-04-27-Alias.cpp (original)
+++ dragonegg/trunk/test/validator/c++/2012-04-27-Alias.cpp Tue Sep 11 11:01:07 2012
@@ -5,8 +5,8 @@
   ~T() {}
 };
 
-int main() {
+T foo() {
   T x;
-  return 0;
+  return x;
 }
 // CHECK-NOT: declare





More information about the llvm-commits mailing list