[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