diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index d181f8d..8ab0c2c 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -34,6 +34,12 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
   if (!getCodeGenOpts().CXXCtorDtorAliases)
     return true;
 
+  // Don't do this optimization at -O0 since it produces a worse debug
+  // experience since the debugger is unable to tell the two user declared
+  // functions apart.
+  if (getCodeGenOpts().OptimizationLevel == 0)
+    return true;
+
   // If the destructor doesn't have a trivial body, we have to emit it
   // separately.
   if (!D->hasTrivialBody())
diff --git a/test/CodeGenCXX/constructor-alias.cpp b/test/CodeGenCXX/constructor-alias.cpp
index 18a4777..a72bd19 100644
--- a/test/CodeGenCXX/constructor-alias.cpp
+++ b/test/CodeGenCXX/constructor-alias.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -emit-llvm -triple mipsel--linux-gnu -mconstructor-aliases -o - %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -triple mipsel--linux-gnu -mconstructor-aliases -o - %s -O1 -disable-llvm-optzns | FileCheck --check-prefix=OPT %s
 
 // The target attribute code used to get confused with aliases. Make sure
 // we don't crash when an alias is used.
@@ -9,4 +10,27 @@ struct B {
 B::B() {
 }
 
-// CHECK: @_ZN1BC1Ev = alias void (%struct.B*)* @_ZN1BC2Ev
+// CHECK-DAG: @_ZN1BC1Ev = alias void (%struct.B*)* @_ZN1BC2Ev
+
+namespace test2 {
+struct Base {
+  ~Base();
+};
+
+Base::~Base() {}
+
+struct Derived : public Base {
+  ~Derived();
+};
+
+Derived::~Derived() {}
+  // CHECK-DAG: @_ZN1BC1Ev = alias void (%struct.B*)* @_ZN1BC2Ev
+  // CHECK-DAG: @_ZN5test24BaseD1Ev = alias void (%"struct.test2::Base"*)* @_ZN5test24BaseD2Ev
+  // CHECK-DAG: @_ZN5test27DerivedD1Ev = alias void (%"struct.test2::Derived"*)* @_ZN5test27DerivedD2Ev
+  // CHECK-DAG: define void @_ZN5test27DerivedD2Ev
+
+  // OPT-DAG: @_ZN1BC1Ev = alias void (%struct.B*)* @_ZN1BC2Ev
+  // OPT-DAG: @_ZN5test24BaseD1Ev = alias void (%"struct.test2::Base"*)* @_ZN5test24BaseD2Ev
+  // OPT-DAG: @_ZN5test27DerivedD1Ev = alias void (%"struct.test2::Derived"*)* @_ZN5test27DerivedD2Ev
+  // OPT-DAG: @_ZN5test27DerivedD2Ev = alias bitcast (void (%"struct.test2::Base"*)* @_ZN5test24BaseD2Ev to void (%"struct.test2::Derived"*)*)
+}
diff --git a/test/CodeGenCXX/destructors.cpp b/test/CodeGenCXX/destructors.cpp
index 0be188b..ea227fe 100644
--- a/test/CodeGenCXX/destructors.cpp
+++ b/test/CodeGenCXX/destructors.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions | FileCheck %s
+// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions -O1 -disable-llvm-optzns | FileCheck %s
 
 // CHECK: @_ZN5test01AD1Ev = alias {{.*}} @_ZN5test01AD2Ev
 // CHECK: @_ZN5test11MD2Ev = alias {{.*}} @_ZN5test11AD2Ev
diff --git a/test/CodeGenCXX/virtual-destructor-calls.cpp b/test/CodeGenCXX/virtual-destructor-calls.cpp
index 0c03c9f..ae3704f 100644
--- a/test/CodeGenCXX/virtual-destructor-calls.cpp
+++ b/test/CodeGenCXX/virtual-destructor-calls.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s
 
 struct Member {
   ~Member();
