Index: lib/Transforms/Scalar/LICM.cpp =================================================================== --- lib/Transforms/Scalar/LICM.cpp +++ lib/Transforms/Scalar/LICM.cpp @@ -170,7 +170,8 @@ /// loop preheaders be inserted into the CFG... /// void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesCFG(); + AU.addPreserved(); + AU.addPreserved(); AU.addRequired(); if (EnableMSSALoopDependency) AU.addRequired(); @@ -220,7 +221,10 @@ return PreservedAnalyses::all(); auto PA = getLoopPassPreservedAnalyses(); - PA.preserveSet(); + + PA.preserve(); + PA.preserve(); + return PA; } Index: test/Transforms/LICM/pr37323.ll =================================================================== --- /dev/null +++ test/Transforms/LICM/pr37323.ll @@ -0,0 +1,32 @@ +;RUN: opt -loop-simplify -postdomtree -licm -adce -S -o - %s | FileCheck %s +;RUN: opt -passes='loop-simplify,require,require,loop(licm),function(adce)' -S -o - %s | FileCheck %s + +target triple = "x86_64-unknown-linux-gnu" + +@c = external global i16, align 1 + +;Make sure this test do not crash while accessing PostDomTree which is not +;preserved in LICM. +; +;CHECK-LABEL: fn1() +;CHECK-LABEL: for.cond.loopexit.split.loop.exit +;CHECK-LABEL: for.cond.loopexit.split.loop.exit1 +define void @fn1() { +entry: + br label %for.cond + +for.cond: ; preds = %if.end, %for.cond1, %entry + %0 = phi i16 [ undef, %entry ], [ ptrtoint (i16* @c to i16), %if.end ], [ %.mux, %for.cond1 ] + br i1 undef, label %for.cond1, label %for.end8 + +for.cond1: ; preds = %if.end, %for.cond + %.mux = select i1 undef, i16 undef, i16 ptrtoint (i16* @c to i16) + br i1 undef, label %for.cond, label %if.end + +if.end: ; preds = %for.cond1 + br i1 undef, label %for.cond, label %for.cond1 + +for.end8: ; preds = %for.cond + ret void +} +