Index: lib/Transforms/Utils/Local.cpp =================================================================== --- lib/Transforms/Utils/Local.cpp +++ lib/Transforms/Utils/Local.cpp @@ -1424,9 +1424,12 @@ } // 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)) + if (auto *JMD = J->getMetadata(LLVMContext::MD_invariant_group) && + (isa(K) || isa(K))) K->setMetadata(LLVMContext::MD_invariant_group, JMD); }