Index: llvm/docs/ReleaseNotes.rst =================================================================== --- llvm/docs/ReleaseNotes.rst +++ llvm/docs/ReleaseNotes.rst @@ -75,6 +75,9 @@ legacy inliner pass. Backend stack coloring should handle cases alloca merging initially set out to handle. +* InstructionSimplify APIs now require instructions be inserted into a + parent function. + Changes to building LLVM ------------------------ Index: llvm/include/llvm/Analysis/InstructionSimplify.h =================================================================== --- llvm/include/llvm/Analysis/InstructionSimplify.h +++ llvm/include/llvm/Analysis/InstructionSimplify.h @@ -19,12 +19,8 @@ // values. This will prevent other code from seeing the same undef uses and // resolving them to different values. // -// These routines are designed to tolerate moderately incomplete IR, such as -// instructions that are not connected to basic blocks yet. However, they do -// require that all the IR that they encounter be valid. In particular, they -// require that all non-constant values be defined in the same function, and the -// same call context of that function (and not split between caller and callee -// contexts of a directly recursive call, for example). +// They require that all the IR that they encounter be valid and inserted into a +// parent function. // // Additionally, these routines can't simplify to the instructions that are not // def-reachable, meaning we can't just scan the basic block for instructions Index: llvm/include/llvm/IR/BasicBlock.h =================================================================== --- llvm/include/llvm/IR/BasicBlock.h +++ llvm/include/llvm/IR/BasicBlock.h @@ -251,7 +251,10 @@ /// Unlink this basic block from its current function and insert it into /// the function that \p MovePos lives in, right before \p MovePos. - void moveBefore(BasicBlock *MovePos); + inline void moveBefore(BasicBlock *MovePos) { + moveBefore(MovePos->getIterator()); + } + void moveBefore(SymbolTableList::iterator MovePos); /// Unlink this basic block from its current function and insert it /// right after \p MovePos in the function \p MovePos lives in. Index: llvm/lib/Analysis/InstructionSimplify.cpp =================================================================== --- llvm/lib/Analysis/InstructionSimplify.cpp +++ llvm/lib/Analysis/InstructionSimplify.cpp @@ -6754,6 +6754,7 @@ ArrayRef NewOps, const SimplifyQuery &SQ, unsigned MaxRecurse) { + assert(I->getFunction() && "instruction should be inserted in a function"); const SimplifyQuery Q = SQ.CxtI ? SQ : SQ.getWithInstruction(I); switch (I->getOpcode()) { Index: llvm/lib/IR/BasicBlock.cpp =================================================================== --- llvm/lib/IR/BasicBlock.cpp +++ llvm/lib/IR/BasicBlock.cpp @@ -133,9 +133,8 @@ return getParent()->getBasicBlockList().erase(getIterator()); } -void BasicBlock::moveBefore(BasicBlock *MovePos) { - MovePos->getParent()->splice(MovePos->getIterator(), getParent(), - getIterator()); +void BasicBlock::moveBefore(SymbolTableList::iterator MovePos) { + getParent()->splice(MovePos, getParent(), getIterator()); } void BasicBlock::moveAfter(BasicBlock *MovePos) { Index: llvm/lib/Transforms/Scalar/JumpThreading.cpp =================================================================== --- llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -2643,6 +2643,7 @@ // mapping and using it to remap operands in the cloned instructions. for (; BI != BB->end(); ++BI) { Instruction *New = BI->clone(); + New->insertInto(PredBB, OldPredBranch->getIterator()); // Remap operands to patch up intra-block references. for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i) @@ -2660,7 +2661,7 @@ {BB->getModule()->getDataLayout(), TLI, nullptr, nullptr, New})) { ValueMapping[&*BI] = IV; if (!New->mayHaveSideEffects()) { - New->deleteValue(); + New->eraseFromParent(); New = nullptr; } } else { @@ -2669,7 +2670,6 @@ if (New) { // Otherwise, insert the new instruction into the block. New->setName(BI->getName()); - New->insertInto(PredBB, OldPredBranch->getIterator()); // Update Dominance from simplified New instruction operands. for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i) if (BasicBlock *SuccBB = dyn_cast(New->getOperand(i))) Index: llvm/lib/Transforms/Utils/CloneFunction.cpp =================================================================== --- llvm/lib/Transforms/Utils/CloneFunction.cpp +++ llvm/lib/Transforms/Utils/CloneFunction.cpp @@ -470,9 +470,8 @@ // Nope, clone it now. BasicBlock *NewBB; - BBEntry = NewBB = BasicBlock::Create(BB->getContext()); - if (BB->hasName()) - NewBB->setName(BB->getName() + NameSuffix); + Twine NewName(BB->hasName() ? Twine(BB->getName()) + NameSuffix : ""); + BBEntry = NewBB = BasicBlock::Create(BB->getContext(), NewName, NewFunc); // It is only legal to clone a function if a block address within that // function is never referenced outside of the function. Given that, we @@ -498,6 +497,7 @@ ++II) { Instruction *NewInst = cloneInstruction(II); + NewInst->insertInto(NewBB, NewBB->end()); if (HostFuncIsStrictFP) { // All function calls in the inlined function must get 'strictfp' @@ -516,8 +516,6 @@ // If we can simplify this instruction to some other value, simply add // a mapping to that value rather than inserting a new instruction into // the basic block. - // - // FIXME: simplifyInstruction should know the context of the new function. if (Value *V = simplifyInstruction(NewInst, BB->getModule()->getDataLayout())) { // On the off-chance that this simplifies to an instruction in the old @@ -528,7 +526,7 @@ if (!NewInst->mayHaveSideEffects()) { VMap[&*II] = V; - NewInst->deleteValue(); + NewInst->eraseFromParent(); continue; } } @@ -537,7 +535,6 @@ if (II->hasName()) NewInst->setName(II->getName() + NameSuffix); VMap[&*II] = NewInst; // Add instruction map to value. - NewInst->insertInto(NewBB, NewBB->end()); if (isa(II) && !II->isDebugOrPseudoInst()) { hasCalls = true; hasMemProfMetadata |= II->hasMetadata(LLVMContext::MD_memprof); @@ -685,8 +682,8 @@ if (!NewBB) continue; // Dead block. - // Add the new block to the new function. - NewFunc->insert(NewFunc->end(), NewBB); + // Move the new block to preserve the order in the original function. + NewBB->moveBefore(NewFunc->end()); // Handle PHI nodes specially, as we have to remove references to dead // blocks. Index: llvm/lib/Transforms/Utils/LoopRotationUtils.cpp =================================================================== --- llvm/lib/Transforms/Utils/LoopRotationUtils.cpp +++ llvm/lib/Transforms/Utils/LoopRotationUtils.cpp @@ -435,6 +435,8 @@ // Otherwise, create a duplicate of the instruction. Instruction *C = Inst->clone(); + C->insertBefore(LoopEntryBranch); + ++NumInstrsDuplicated; // Eagerly remap the operands of the instruction. @@ -444,7 +446,7 @@ // Avoid inserting the same intrinsic twice. if (auto *DII = dyn_cast(C)) if (DbgIntrinsics.count(makeHash(DII))) { - C->deleteValue(); + C->eraseFromParent(); continue; } @@ -457,7 +459,7 @@ // in the map. InsertNewValueIntoMap(ValueMap, Inst, V); if (!C->mayHaveSideEffects()) { - C->deleteValue(); + C->eraseFromParent(); C = nullptr; } } else { @@ -466,7 +468,6 @@ if (C) { // Otherwise, stick the new instruction into the new block! C->setName(Inst->getName()); - C->insertBefore(LoopEntryBranch); if (auto *II = dyn_cast(C)) AC->registerAssumption(II); Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3211,6 +3211,9 @@ } // Clone the instruction. Instruction *N = BBI->clone(); + // Insert the new instruction into its new home. + N->insertInto(EdgeBB, InsertPt); + if (BBI->hasName()) N->setName(BBI->getName() + ".c"); @@ -3226,7 +3229,8 @@ if (!BBI->use_empty()) TranslateMap[&*BBI] = V; if (!N->mayHaveSideEffects()) { - N->deleteValue(); // Instruction folded away, don't need actual inst + N->eraseFromParent(); // Instruction folded away, don't need actual + // inst N = nullptr; } } else { @@ -3234,9 +3238,6 @@ TranslateMap[&*BBI] = N; } if (N) { - // Insert the new instruction into its new home. - N->insertInto(EdgeBB, InsertPt); - // Register the new instruction with the assumption cache if necessary. if (auto *Assume = dyn_cast(N)) if (AC) Index: llvm/test/Transforms/Inline/inline_inv_group.ll =================================================================== --- llvm/test/Transforms/Inline/inline_inv_group.ll +++ llvm/test/Transforms/Inline/inline_inv_group.ll @@ -14,8 +14,9 @@ ret ptr %1 } -define ptr @caller() { -; CHECK-LABEL: define ptr @caller() { +define ptr @caller() null_pointer_is_valid { +; CHECK-LABEL: define ptr @caller +; CHECK-SAME: () #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[TMP1:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr null) ; CHECK-NEXT: ret ptr [[TMP1]] ; Index: llvm/test/Transforms/Inline/simplify-instruction-computeKnownFPClass-context.ll =================================================================== --- llvm/test/Transforms/Inline/simplify-instruction-computeKnownFPClass-context.ll +++ llvm/test/Transforms/Inline/simplify-instruction-computeKnownFPClass-context.ll @@ -30,8 +30,7 @@ ; CHECK-LABEL: define i1 @simplify_fcmp_ord_fdiv_caller ; CHECK-SAME: (double nofpclass(nan inf zero) [[I0:%.*]], double nofpclass(nan inf zero) [[I1:%.*]]) { ; CHECK-NEXT: [[SUB_DOUBLE_SUB_I:%.*]] = fdiv double [[I0]], [[I1]] -; CHECK-NEXT: [[CMP_I:%.*]] = fcmp ord double [[SUB_DOUBLE_SUB_I]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[CMP_I]] +; CHECK-NEXT: ret i1 true ; %call = call i1 @simplify_fcmp_ord_fdiv_callee(double %i0, double %i1) ret i1 %call @@ -48,8 +47,7 @@ ; CHECK-LABEL: define i1 @simplify_fcmp_ord_frem_caller ; CHECK-SAME: (double nofpclass(nan inf zero) [[I0:%.*]], double nofpclass(nan inf zero) [[I1:%.*]]) { ; CHECK-NEXT: [[SUB_DOUBLE_SUB_I:%.*]] = frem double [[I0]], [[I1]] -; CHECK-NEXT: [[CMP_I:%.*]] = fcmp ord double [[SUB_DOUBLE_SUB_I]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[CMP_I]] +; CHECK-NEXT: ret i1 true ; %call = call i1 @simplify_fcmp_ord_frem_callee(double %i0, double %i1) ret i1 %call @@ -66,8 +64,7 @@ ; CHECK-LABEL: define i1 @simplify_fcmp_ord_fmul_caller ; CHECK-SAME: (double nofpclass(nan zero) [[I0:%.*]], double nofpclass(nan zero) [[I1:%.*]]) { ; CHECK-NEXT: [[SUB_DOUBLE_SUB_I:%.*]] = fmul double [[I0]], [[I1]] -; CHECK-NEXT: [[CMP_I:%.*]] = fcmp ord double [[SUB_DOUBLE_SUB_I]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[CMP_I]] +; CHECK-NEXT: ret i1 true ; %call = call i1 @simplify_fcmp_ord_fmul_callee(double %i0, double %i1) ret i1 %call Index: llvm/test/Transforms/LoopRotate/pr56260.ll =================================================================== --- llvm/test/Transforms/LoopRotate/pr56260.ll +++ llvm/test/Transforms/LoopRotate/pr56260.ll @@ -14,18 +14,17 @@ ; CHECK: L0.preheader: ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, 0 ; CHECK-NEXT: [[INC:%.*]] = zext i1 [[CMP]] to i32 -; CHECK-NEXT: [[SPEC_SELECT1:%.*]] = add nsw i32 0, [[INC]] -; CHECK-NEXT: [[TOBOOL3_NOT2:%.*]] = icmp eq i32 [[SPEC_SELECT1]], 0 -; CHECK-NEXT: br i1 [[TOBOOL3_NOT2]], label [[L0_PREHEADER_LOOPEXIT]], label [[L1_PREHEADER_LR_PH:%.*]] +; CHECK-NEXT: [[TOBOOL3_NOT1:%.*]] = icmp eq i32 [[INC]], 0 +; CHECK-NEXT: br i1 [[TOBOOL3_NOT1]], label [[L0_PREHEADER_LOOPEXIT]], label [[L1_PREHEADER_LR_PH:%.*]] ; CHECK: L1.preheader.lr.ph: ; CHECK-NEXT: br label [[L1_PREHEADER:%.*]] ; CHECK: L1.preheader: -; CHECK-NEXT: [[SPEC_SELECT4:%.*]] = phi i32 [ [[SPEC_SELECT1]], [[L1_PREHEADER_LR_PH]] ], [ [[SPEC_SELECT:%.*]], [[L0_LATCH:%.*]] ] -; CHECK-NEXT: [[K_03:%.*]] = phi i32 [ 0, [[L1_PREHEADER_LR_PH]] ], [ [[SPEC_SELECT4]], [[L0_LATCH]] ] -; CHECK-NEXT: [[TOBOOL8_NOT:%.*]] = icmp eq i32 [[K_03]], 0 +; CHECK-NEXT: [[SPEC_SELECT3:%.*]] = phi i32 [ [[INC]], [[L1_PREHEADER_LR_PH]] ], [ [[SPEC_SELECT:%.*]], [[L0_LATCH:%.*]] ] +; CHECK-NEXT: [[K_02:%.*]] = phi i32 [ 0, [[L1_PREHEADER_LR_PH]] ], [ [[SPEC_SELECT3]], [[L0_LATCH]] ] +; CHECK-NEXT: [[TOBOOL8_NOT:%.*]] = icmp eq i32 [[K_02]], 0 ; CHECK-NEXT: br label [[L0_LATCH]] ; CHECK: L0.latch: -; CHECK-NEXT: [[SPEC_SELECT]] = add nsw i32 [[SPEC_SELECT4]], [[INC]] +; CHECK-NEXT: [[SPEC_SELECT]] = add nsw i32 [[SPEC_SELECT3]], [[INC]] ; CHECK-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i32 [[SPEC_SELECT]], 0 ; CHECK-NEXT: br i1 [[TOBOOL3_NOT]], label [[L0_L0_PREHEADER_LOOPEXIT_CRIT_EDGE:%.*]], label [[L1_PREHEADER]] ; Index: llvm/test/Transforms/SampleProfile/profile-context-tracker-debug.ll =================================================================== --- llvm/test/Transforms/SampleProfile/profile-context-tracker-debug.ll +++ llvm/test/Transforms/SampleProfile/profile-context-tracker-debug.ll @@ -27,7 +27,7 @@ ; INLINE-ALL-NEXT: Getting callee context for instr: %call.i = tail call i32 @_Z8funcLeafi ; INLINE-ALL-NEXT: Callee context found: main:3 @ _Z5funcAi:1 @ _Z8funcLeafi ; INLINE-ALL-NEXT: Marking context profile as inlined: main:3 @ _Z5funcAi:1 @ _Z8funcLeafi -; INLINE-ALL-NEXT: Getting callee context for instr: %call.i1 = tail call i32 @_Z3fibi +; INLINE-ALL-NEXT: Getting callee context for instr: %call.i2 = tail call i32 @_Z3fibi ; INLINE-ALL-NEXT: Getting callee context for instr: %call5.i = tail call i32 @_Z3fibi ; INLINE-ALL-DAG: Getting base profile for function: _Z5funcAi ; INLINE-ALL-DAG-NEXT: Merging context profile into base profile: _Z5funcAi Index: llvm/test/Transforms/SimplifyCFG/pr46638.ll =================================================================== --- llvm/test/Transforms/SimplifyCFG/pr46638.ll +++ llvm/test/Transforms/SimplifyCFG/pr46638.ll @@ -15,9 +15,7 @@ ; CHECK: common.ret: ; CHECK-NEXT: ret void ; CHECK: true2.critedge: -; CHECK-NEXT: [[CMP2_C:%.*]] = icmp sgt i32 [[X]], 0 -; CHECK-NEXT: [[EXT_C:%.*]] = zext i1 [[CMP2_C]] to i32 -; CHECK-NEXT: call void @dummy(i32 [[EXT_C]]) +; CHECK-NEXT: call void @dummy(i32 0) ; CHECK-NEXT: call void @dummy(i32 2) ; CHECK-NEXT: br label [[COMMON_RET]] ; Index: llvm/unittests/Transforms/Utils/LocalTest.cpp =================================================================== --- llvm/unittests/Transforms/Utils/LocalTest.cpp +++ llvm/unittests/Transforms/Utils/LocalTest.cpp @@ -588,21 +588,6 @@ verifyDebugValuesAreSalvaged(); } -TEST(Local, SimplifyVScaleWithRange) { - LLVMContext C; - Module M("Module", C); - - IntegerType *Ty = Type::getInt32Ty(C); - Function *VScale = Intrinsic::getDeclaration(&M, Intrinsic::vscale, {Ty}); - auto *CI = CallInst::Create(VScale, {}, "vscale"); - - // Test that simplifyCall won't try to query it's parent function for - // vscale_range attributes in order to simplify llvm.vscale -> constant. - EXPECT_EQ(simplifyCall(CI, VScale, {}, SimplifyQuery(M.getDataLayout())), - nullptr); - delete CI; -} - TEST(Local, wouldInstructionBeTriviallyDead) { LLVMContext Ctx; std::unique_ptr M = parseIR(Ctx,