Index: lib/Transforms/Utils/Local.cpp =================================================================== --- lib/Transforms/Utils/Local.cpp +++ lib/Transforms/Utils/Local.cpp @@ -1424,10 +1424,13 @@ } // Set !invariant.group from J if J has it. If both instructions have it // then we will just pick it from J - even when they are different. + // Also make sure that K is load or store - f.e. combining bitcast with load + // could produce bitcast with invariant.group metadata, which is invalid. // FIXME: we should try to preserve both invariant.group md if they are // different, but right now instruction can only have one invariant.group. if (auto *JMD = J->getMetadata(LLVMContext::MD_invariant_group)) - K->setMetadata(LLVMContext::MD_invariant_group, JMD); + if (isa(K) || isa(K)) + K->setMetadata(LLVMContext::MD_invariant_group, JMD); }