Index: lib/Transforms/Scalar/LICM.cpp =================================================================== --- lib/Transforms/Scalar/LICM.cpp +++ lib/Transforms/Scalar/LICM.cpp @@ -657,6 +657,15 @@ if (CI->mayThrow()) return false; + if (Function *F = CI->getCalledFunction()) + switch (F->getIntrinsicID()) { + default: break; + // TODO: support invariant.start, and experimental.guard here + case Intrinsic::assume: + // Assumes don't actually alias anything or throw + return true; + }; + // Handle simple cases by querying alias analysis. FunctionModRefBehavior Behavior = AA->getModRefBehavior(CI); if (Behavior == FMRB_DoesNotAccessMemory) Index: test/Transforms/LICM/assume.ll =================================================================== --- test/Transforms/LICM/assume.ll +++ test/Transforms/LICM/assume.ll @@ -36,9 +36,9 @@ define void @f_1(i1 %cond, i32* %ptr) { ; CHECK-LABEL: @f_1( ; CHECK-LABEL: entry: +; CHECK: call void @llvm.assume(i1 %cond) ; CHECK: %val = load i32, i32* %ptr ; CHECK-LABEL: loop: -; CHECK: call void @llvm.assume(i1 %cond) entry: br label %loop