diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr109442.C b/gcc/testsuite/g++.dg/tree-ssa/pr109442.C
index ec40c470c8ddf050af185fd69c4ae2b452921668..ea5800aa134013c983d7a81337f135cd8d0b4127 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/pr109442.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr109442.C
@@ -1,5 +1,5 @@
 // { dg-do compile { target c++11 } }
-// { dg-options "-O1 -fdump-tree-optimized" }
+// { dg-options "-O2 -fdump-tree-optimized" }
 #include <vector>
 #define T int
 T vat1(std::vector<T> v1) {
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index df48ba3377fac45e3d0fbb4614976fffc3391aec..3ece16b2facd87e2cac219caf34c8167c8f0fb6a 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -1114,7 +1114,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
       size_type
       size() const _GLIBCXX_NOEXCEPT
-      { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
+      {
+	ptrdiff_t __dif = this->_M_impl._M_finish - this->_M_impl._M_start;
+	if (__dif < 0)
+	   __builtin_unreachable ();
+	return size_type(__dif);
+      }
 
       /**  Returns the size() of the largest possible %vector.  */
       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
@@ -1201,8 +1206,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       size_type
       capacity() const _GLIBCXX_NOEXCEPT
       {
-	return size_type(this->_M_impl._M_end_of_storage
-			   - this->_M_impl._M_start);
+	ptrdiff_t __dif = this->_M_impl._M_end_of_storage
+			  - this->_M_impl._M_start;
+	if (__dif < 0)
+	   __builtin_unreachable ();
+	return size_type(__dif);
       }
 
       /**