From 8f3b986eaa03a56fe371a1144af4a4d2b9b0d1a6 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Thu, 3 May 2018 16:39:15 -0400 Subject: [PATCH] [NewOptimizer] Minor bugfixes --- base/compiler/ssair/inlining2.jl | 6 +++--- src/codegen.cpp | 17 +++++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/base/compiler/ssair/inlining2.jl b/base/compiler/ssair/inlining2.jl index 891b85dcec48b..bea0ec52629b2 100644 --- a/base/compiler/ssair/inlining2.jl +++ b/base/compiler/ssair/inlining2.jl @@ -401,7 +401,7 @@ function minimal_backinf(compact, constraints, unconstrained_types, argexprs) unconstrained_types end -function ir_inline_unionsplit!(compact::IncrementalCompact, idx::Int, +function ir_inline_unionsplit!(compact::IncrementalCompact, topmod::Module, idx::Int, argexprs::Vector{Any}, linetable::Vector{LineInfoNode}, item::UnionSplit, boundscheck::Symbol, todo_bbs::Vector{Tuple{Int, Int}}) stmt, typ, line = compact.result[idx], compact.result_types[idx], compact.result_lines[idx] @@ -480,7 +480,7 @@ function ir_inline_unionsplit!(compact::IncrementalCompact, idx::Int, bb += 1 # We're now in the fall through block, decide what to do if item.fully_covered - e = Expr(:call, :error, "fatal error in type inference (type bound)") + e = Expr(:call, GlobalRef(topmod, :error), "fatal error in type inference (type bound)") e.typ = Union{} insert_node_here!(compact, e, Union{}, line) insert_node_here!(compact, ReturnNode(), Union{}, line) @@ -548,7 +548,7 @@ function batch_inline!(todo::Vector{Any}, ir::IRCode, linetable::Vector{LineInfo if isa(item, InliningTodo) compact.ssa_rename[compact.idx-1] = ir_inline_item!(compact, idx, argexprs, linetable, item, boundscheck, state.todo_bbs) elseif isa(item, UnionSplit) - ir_inline_unionsplit!(compact, idx, argexprs, linetable, item, boundscheck, state.todo_bbs) + ir_inline_unionsplit!(compact, _topmod(sv.mod), idx, argexprs, linetable, item, boundscheck, state.todo_bbs) end compact[idx] = nothing refinish && finish_current_bb!(compact) diff --git a/src/codegen.cpp b/src/codegen.cpp index cf018c3f17280..25464e05e992b 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -893,9 +893,11 @@ static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t & Value *union_box_dt = NULL; BasicBlock *union_isaBB = NULL; auto maybe_setup_union_isa = [&]() { - union_isaBB = BasicBlock::Create(jl_LLVMContext, "union_isa", ctx.f); - ctx.builder.SetInsertPoint(union_isaBB); - union_box_dt = emit_typeof(ctx, v.Vboxed); + if (!union_isaBB) { + union_isaBB = BasicBlock::Create(jl_LLVMContext, "union_isa", ctx.f); + ctx.builder.SetInsertPoint(union_isaBB); + union_box_dt = emit_typeof(ctx, v.Vboxed); + } }; // If we don't find a match. The type remains unknown @@ -6583,7 +6585,9 @@ static std::unique_ptr emit_function( if (val.constant) val = mark_julia_const(val.constant); // be over-conservative at making sure `.typ` is set concretely, not tindex TerminatorInst *terminator = FromBB->getTerminator(); - if (!isa(terminator) || cast(terminator)->isConditional()) { + if (!isa(terminator) || + (cast(terminator)->isConditional() && + !(terminator->getSuccessor(0) == terminator->getSuccessor(1)))) { bool found = false; for (size_t i = 0; i < terminator->getNumSuccessors(); ++i) { if (terminator->getSuccessor(i) == PhiBB) { @@ -6595,6 +6599,7 @@ static std::unique_ptr emit_function( Function::iterator FBBI = FromBB->getIterator(); ctx.f->getBasicBlockList().insert(++FBBI, NewBB); ctx.builder.SetInsertPoint(NewBB); + terminator = BranchInst::Create(PhiBB); found = true; break; } @@ -6602,7 +6607,7 @@ static std::unique_ptr emit_function( assert(found); } else { - terminator->eraseFromParent(); + terminator->removeFromParent(); ctx.builder.SetInsertPoint(FromBB); } if (!jl_is_uniontype(phiType) || !TindexN) { @@ -6675,7 +6680,7 @@ static std::unique_ptr emit_function( if (TindexN) TindexN->addIncoming(RTindex, ctx.builder.GetInsertBlock()); } - ctx.builder.CreateBr(PhiBB); + ctx.builder.Insert(terminator); // Check any phi nodes in the Phi block to see if by splitting the edges, // we made things inconsistent if (FromBB != ctx.builder.GetInsertBlock()) {