Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1508,6 +1508,11 @@ if (BB1->hasAddressTaken() || BB2->hasAddressTaken()) return false; + // Don't try to hoist anything from deoptimization blocks. + if (BB1->getPostdominatingDeoptimizeCall() || + BB2->getPostdominatingDeoptimizeCall()) + return false; + BasicBlock::iterator BB1_Itr = BB1->begin(); BasicBlock::iterator BB2_Itr = BB2->begin(); Index: llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll =================================================================== --- llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll +++ llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll @@ -1,13 +1,27 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S --passes='simplifycfg' -simplifycfg-hoist-common-skip-limit=0 %s | FileCheck %s target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" target triple = "x86_64-unknown-linux-gnu" declare void @llvm.experimental.deoptimize.isVoid(...) #0 -; REQUIRES: asserts -; XFAIL: * - define void @widget(i1 %arg) { +; CHECK-LABEL: @widget( +; CHECK-NEXT: bb: +; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB1:%.*]], label [[BB4:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[TMP:%.*]] = trunc i64 5 to i32 +; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 0 to i32 +; CHECK-NEXT: [[TMP3:%.*]] = trunc i64 0 to i32 +; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) #[[ATTR0:[0-9]+]] [ "deopt"(i32 0, i32 1, i32 0, i32 502, i32 4, i32 35, i32 0, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP3]], i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP]], i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 14, i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 0, ptr addrspace(1) null, i32 3, float 0.000000e+00, i32 4, double 0.000000e+00, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null) ] +; CHECK-NEXT: ret void +; CHECK: bb4: +; CHECK-NEXT: [[TMP5:%.*]] = trunc i64 5 to i32 +; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 1 to i32 +; CHECK-NEXT: [[TMP7:%.*]] = trunc i64 0 to i32 +; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) #[[ATTR0]] [ "deopt"(i32 0, i32 1, i32 0, i32 502, i32 4, i32 35, i32 0, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP7]], i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP5]], i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 14, i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 0, ptr addrspace(1) null, i32 3, float 0.000000e+00, i32 4, double 0.000000e+00, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null) ] +; CHECK-NEXT: ret void +; bb: br i1 %arg, label %bb1, label %bb4