[cfe-commits] r134260 - in /cfe/trunk: lib/CodeGen/CGDecl.cpp test/CodeGenCXX/constructor-init.cpp

Douglas Gregor dgregor at apple.com
Fri Jul 1 14:08:20 PDT 2011


Author: dgregor
Date: Fri Jul  1 16:08:19 2011
New Revision: 134260

URL: http://llvm.org/viewvc/llvm-project?rev=134260&view=rev
Log:
Don't zero-initialize default-initialized local variables that have
trivial default constructors. This generated-code regression was
caused by r131796, which had simplified the handling of default
initialization in Sema. Fixes <rdar://problem/9694300>.

Modified:
    cfe/trunk/lib/CodeGen/CGDecl.cpp
    cfe/trunk/test/CodeGenCXX/constructor-init.cpp

Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=134260&r1=134259&r2=134260&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Fri Jul  1 16:08:19 2011
@@ -873,6 +873,21 @@
   return false;
 }
 
+/// \brief Determine whether the given initializer is trivial in the sense
+/// that it requires no code to be generated.
+static bool isTrivialInitializer(const Expr *Init) {
+  if (!Init)
+    return true;
+  
+  if (const CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init))
+    if (CXXConstructorDecl *Constructor = Construct->getConstructor())
+      if (Constructor->isTrivial() &&
+          Constructor->isDefaultConstructor() &&
+          !Construct->requiresZeroInitialization())
+        return true;
+      
+  return false;
+}
 void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
   assert(emission.Variable && "emission was not valid!");
 
@@ -896,7 +911,9 @@
   if (emission.IsByRef)
     emitByrefStructureInit(emission);
 
-  if (!Init) return;
+  if (isTrivialInitializer(Init))
+    return;
+  
 
   CharUnits alignment = emission.Alignment;
 

Modified: cfe/trunk/test/CodeGenCXX/constructor-init.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructor-init.cpp?rev=134260&r1=134259&r2=134260&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/constructor-init.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/constructor-init.cpp Fri Jul  1 16:08:19 2011
@@ -133,3 +133,19 @@
 X<T>::X(const X &other) : start(0), end(0) { }
 
 X<int> get_X(X<int> x) { return x; }
+
+namespace rdar9694300 {
+  struct X {
+    int x;
+  };
+
+  // CHECK: define void @_ZN11rdar96943001fEv
+  void f() {
+    // CHECK: alloca
+    X x;
+    // CHECK-NEXT: [[I:%.*]] = alloca i32
+    // CHECK-NEXT: store i32 17, i32* [[I]]
+    int i = 17;
+    // CHECK-NEXT: ret void
+  }
+}





More information about the cfe-commits mailing list