diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 0fd9b1f5f5d550314e97c9716ef9a879a8654aaa..4a67614be756fd5e21ffa8694fd8063b8354f7f4 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -1014,9 +1014,9 @@ def _normalize_helper(self, visited, spec_deps, provider_index):
         any_change = False
         changed = True
 
+        pkg = spack.db.get(self.name)
         while changed:
             changed = False
-            pkg = spack.db.get(self.name)
             for dep_name in pkg.dependencies:
                 # Do we depend on dep_name?  If so pkg_dep is not None.
                 pkg_dep = self._evaluate_dependency_conditions(dep_name)
@@ -1132,16 +1132,19 @@ def constrain(self, other, **kwargs):
                 raise UnsatisfiableArchitectureSpecError(self.architecture,
                                                          other.architecture)
 
+        changed = False
         if self.compiler is not None and other.compiler is not None:
-            self.compiler.constrain(other.compiler)
+            changed |= self.compiler.constrain(other.compiler)
         elif self.compiler is None:
+            changed |= (self.compiler != other.compiler)
             self.compiler = other.compiler
 
-        changed = False
         changed |= self.versions.intersect(other.versions)
         changed |= self.variants.constrain(other.variants)
-        changed |= bool(self.architecture)
+
+        old = self.architecture
         self.architecture = self.architecture or other.architecture
+        changed |= (self.architecture != old)
 
         if constrain_deps:
             changed |= self._constrain_dependencies(other)
diff --git a/lib/spack/spack/test/optional_deps.py b/lib/spack/spack/test/optional_deps.py
index 669e02f8c9a08828065d2670a1a1797b0f0845c2..265a983f3fed4c27a4f4abb29ae29a0fe644c8c0 100644
--- a/lib/spack/spack/test/optional_deps.py
+++ b/lib/spack/spack/test/optional_deps.py
@@ -92,4 +92,3 @@ def test_transitive_chain(self):
         # the whole chain.
         self.check_normalize('optional-dep-test+f',
                              Spec('optional-dep-test+f', Spec('f'), Spec('g'), Spec('mpi')))
-