Author: Nikolas Klauser Date: 2026-06-23T18:54:03+02:00 New Revision: 999c87f65ea81bcdb58b8df6fddfb1ccdef978b1
URL: https://github.com/llvm/llvm-project/commit/999c87f65ea81bcdb58b8df6fddfb1ccdef978b1 DIFF: https://github.com/llvm/llvm-project/commit/999c87f65ea81bcdb58b8df6fddfb1ccdef978b1.diff LOG: Revert "Reapply "[InstCombine] Merge consecutive assumes" (#205177) (#205324)" This reverts commit e9aec194f1e034f7b548240bd76b623d80bac034. Added: Modified: llvm/include/llvm/IR/InstrTypes.h llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp llvm/lib/Transforms/InstCombine/InstructionCombining.cpp llvm/test/Transforms/InstCombine/assume-loop-align.ll llvm/test/Transforms/InstCombine/assume.ll llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll Removed: ################################################################################ diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h index 681c4b18375f4..5f7df6a4eb6f8 100644 --- a/llvm/include/llvm/IR/InstrTypes.h +++ b/llvm/include/llvm/IR/InstrTypes.h @@ -2359,12 +2359,6 @@ class CallBase : public Instruction { }); } - /// Return whether there exists an operand bundle of type ID - bool hasOperandBundle(uint32_t ID) const { - return any_of(operand_bundles(), - [&](OperandBundleUse OBU) { return OBU.getTagID() == ID; }); - } - /// Populate the BundleOpInfo instances and the Use& vector from \p /// Bundles. Return the op_iterator pointing to the Use& one past the last /// last bundle operand use. diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 880d896e12d6e..ce9e4b836a56e 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3844,26 +3844,10 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { } } - if (II->hasOperandBundles()) { - // Merge consecutive assumes to save some resources - if (auto *PrevAI = dyn_cast_or_null<AssumeInst>(II->getPrevNode()); - PrevAI && PrevAI->hasOperandBundles()) { - SmallVector<OperandBundleDef, 4> Bundles; - Bundles.reserve(II->getNumOperandBundles() + - PrevAI->getNumOperandBundles()); - for (auto Bundle : PrevAI->operand_bundles()) - Bundles.emplace_back(Bundle); - for (auto Bundle : II->operand_bundles()) - Bundles.emplace_back(Bundle); - Builder.CreateAssumption(Bundles); - eraseInstFromFunction(*PrevAI); - return eraseInstFromFunction(*II); - } - - // If the assume has operand bundles, the folds below will never work, so - // don't bother trying. + // If the assume has operand bundles, the folds below will never work, so + // don't bother trying. + if (II->hasOperandBundles()) break; - } Value *IIOperand = II->getArgOperand(0); diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index ece0b36a15b72..1e24ff8d51057 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -5849,7 +5849,7 @@ bool InstCombinerImpl::run() { // removed. auto II = dyn_cast<IntrinsicInst>(User); if (II->getIntrinsicID() != Intrinsic::assume || - !II->hasOperandBundle(LLVMContext::OB_Dereferenceable)) + !II->getOperandBundle("dereferenceable")) continue; } diff --git a/llvm/test/Transforms/InstCombine/assume-loop-align.ll b/llvm/test/Transforms/InstCombine/assume-loop-align.ll index 2701775f011e8..0c5e403ca54a9 100644 --- a/llvm/test/Transforms/InstCombine/assume-loop-align.ll +++ b/llvm/test/Transforms/InstCombine/assume-loop-align.ll @@ -10,7 +10,8 @@ target triple = "x86_64-unknown-linux-gnu" define void @foo(ptr %a, ptr %b) #0 { ; CHECK-LABEL: @foo( ; CHECK-NEXT: entry: -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 64), "align"(ptr [[B:%.*]], i64 64) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 64) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[B:%.*]], i64 64) ] ; CHECK-NEXT: br label [[FOR_BODY:%.*]] ; CHECK: for.body: ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ] diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll index 8c819ad17a1f3..69220811ac206 100644 --- a/llvm/test/Transforms/InstCombine/assume.ll +++ b/llvm/test/Transforms/InstCombine/assume.ll @@ -134,7 +134,8 @@ define i1 @align_with_offset_on_gep(ptr %base) { define void @align_with_constant_offset_0(ptr %ptr) { ; CHECK-LABEL: @align_with_constant_offset_0( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16), "align"(ptr [[PTR]], i64 8, i64 0) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 0) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 16) ] @@ -144,7 +145,8 @@ define void @align_with_constant_offset_0(ptr %ptr) { define void @align_with_constant_offset_1(ptr %ptr) { ; CHECK-LABEL: @align_with_constant_offset_1( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16), "align"(ptr [[PTR]], i64 8, i64 -8) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 -8) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 16) ] @@ -155,7 +157,8 @@ define void @align_with_constant_offset_1(ptr %ptr) { define void @align_with_constant_offset_4(ptr %ptr) { ; CHECK-LABEL: @align_with_constant_offset_4( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16), "align"(ptr [[PTR]], i64 8, i64 0) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 0) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 16) ] @@ -166,7 +169,8 @@ define void @align_with_constant_offset_4(ptr %ptr) { define void @align_with_constant_offset_8(ptr %ptr) { ; CHECK-LABEL: @align_with_constant_offset_8( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16), "align"(ptr [[PTR]], i64 8, i64 8) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 8) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 16) ] @@ -176,7 +180,8 @@ define void @align_with_constant_offset_8(ptr %ptr) { define void @align_with_variable_offset(ptr %ptr, i64 %offset) { ; CHECK-LABEL: @align_with_variable_offset( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16), "align"(ptr [[PTR]], i64 8, i64 [[OFFSET:%.*]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 [[OFFSET:%.*]]) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 16) ] @@ -622,7 +627,10 @@ define void @redundant_nonnull3(ptr %ptr) { define void @partially_redundant(ptr %ptr, ptr %ptr2, ptr %ptr3, ptr %ptr4, ptr %ptr5) { ; CHECK-LABEL: @partially_redundant( -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[PTR5:%.*]]), "nonnull"(ptr [[PTR4:%.*]]), "nonnull"(ptr [[PTR3:%.*]]), "nonnull"(ptr [[PTR:%.*]]), "nonnull"(ptr [[PTR2:%.*]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[PTR2:%.*]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[PTR:%.*]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[PTR4:%.*]]), "nonnull"(ptr [[PTR3:%.*]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[PTR5:%.*]]) ] ; CHECK-NEXT: ret void ; call void @llvm.assume(i1 true) [ "nonnull"(ptr %ptr), "nonnull"(ptr %ptr2) ] @@ -1384,22 +1392,6 @@ define i32 @assume_noundef_on_load_after_call(ptr %ptr) { ret i32 %val } -define ptr @avoid_get_operand_bundle() { -; CHECK-LABEL: @avoid_get_operand_bundle( -; CHECK-NEXT: bb: -; CHECK-NEXT: [[LOAD:%.*]] = load volatile ptr, ptr null, align 8 -; CHECK-NEXT: [[PTRTOINT_I:%.*]] = ptrtoint ptr [[LOAD]] to i64 -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr null, i64 [[PTRTOINT_I]]), "dereferenceable"(ptr null, i64 [[PTRTOINT_I]]) ] -; CHECK-NEXT: ret ptr null -; -bb: - %load = load volatile ptr, ptr null, align 8 - %ptrtoint.i = ptrtoint ptr %load to i64 - call void @llvm.assume(i1 true) [ "dereferenceable"(ptr null, i64 %ptrtoint.i) ] - call void @llvm.assume(i1 true) [ "dereferenceable"(ptr null, i64 %ptrtoint.i) ] - ret ptr null -} - declare void @use(i1) declare void @block() declare void @llvm.dbg.value(metadata, metadata, metadata) diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll index 4ca7f780cdc5e..69b23200b239b 100644 --- a/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll +++ b/llvm/test/Transforms/PhaseOrdering/AArch64/std-find.ll @@ -244,7 +244,8 @@ define ptr @std_find_caller(ptr noundef %first, ptr noundef %last) { ; CHECK-LABEL: define noundef ptr @std_find_caller( ; CHECK-SAME: ptr noundef [[FIRST:%.*]], ptr noundef [[LAST:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*]]: -; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[FIRST]], i64 2), "align"(ptr [[LAST]], i64 2) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[FIRST]], i64 2) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[LAST]], i64 2) ] ; CHECK-NEXT: [[PRE_I:%.*]] = icmp eq ptr [[FIRST]], [[LAST]] ; CHECK-NEXT: br i1 [[PRE_I]], label %[[STD_FIND_GENERIC_IMPL_EXIT:.*]], label %[[LOOP_HEADER_I_PREHEADER:.*]] ; CHECK: [[LOOP_HEADER_I_PREHEADER]]: _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
