[llvm] dce55a9 - [InstCombine] Remove knowledge retention folding (#202890)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 01:57:10 PDT 2026
Author: Nikolas Klauser
Date: 2026-06-10T08:57:05Z
New Revision: dce55a9f6cfce57e922e0e8f4583da781628e234
URL: https://github.com/llvm/llvm-project/commit/dce55a9f6cfce57e922e0e8f4583da781628e234
DIFF: https://github.com/llvm/llvm-project/commit/dce55a9f6cfce57e922e0e8f4583da781628e234.diff
LOG: [InstCombine] Remove knowledge retention folding (#202890)
The knowledge retention API for simplifying assumes isn't that useful
anymore, since most simplifications done by it are now done
unconditionally directly in InstCombine. It's also known to miscompoile
multiple patterns.
Added:
Modified:
llvm/include/llvm/Transforms/Utils/AssumeBundleBuilder.h
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp
llvm/test/Transforms/InstCombine/assume.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/Utils/AssumeBundleBuilder.h b/llvm/include/llvm/Transforms/Utils/AssumeBundleBuilder.h
index 1c0c318c8b0f2..501807ae57999 100644
--- a/llvm/include/llvm/Transforms/Utils/AssumeBundleBuilder.h
+++ b/llvm/include/llvm/Transforms/Utils/AssumeBundleBuilder.h
@@ -58,15 +58,6 @@ struct AssumeSimplifyPass : public OptionalPassInfoMixin<AssumeSimplifyPass> {
struct AssumeBuilderPass : public OptionalPassInfoMixin<AssumeBuilderPass> {
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
-
-/// canonicalize the RetainedKnowledge RK. it is assumed that RK is part of
-/// Assume. This will return an empty RetainedKnowledge if the knowledge is
-/// useless.
-LLVM_ABI RetainedKnowledge simplifyRetainedKnowledge(AssumeInst *Assume,
- RetainedKnowledge RK,
- AssumptionCache *AC,
- DominatorTree *DT);
-
} // namespace llvm
#endif
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 19d896227e69a..48a2c6a033c0f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3799,41 +3799,6 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
}
- /// Canonicalize Knowledge in operand bundles.
- if (EnableKnowledgeRetention && II->hasOperandBundles()) {
- for (unsigned Idx = 0; Idx < II->getNumOperandBundles(); Idx++) {
- auto &BOI = II->bundle_op_info_begin()[Idx];
- RetainedKnowledge RK =
- llvm::getKnowledgeFromBundle(cast<AssumeInst>(*II), BOI);
- if (BOI.End - BOI.Begin > 2)
- continue; // Prevent reducing knowledge in an align with offset since
- // extracting a RetainedKnowledge from them looses offset
- // information
- RetainedKnowledge CanonRK =
- llvm::simplifyRetainedKnowledge(cast<AssumeInst>(II), RK,
- &getAssumptionCache(),
- &getDominatorTree());
- if (CanonRK == RK)
- continue;
- if (!CanonRK) {
- if (BOI.End - BOI.Begin > 0) {
- Worklist.pushValue(II->op_begin()[BOI.Begin]);
- Value::dropDroppableUse(II->op_begin()[BOI.Begin]);
- }
- continue;
- }
- assert(RK.AttrKind == CanonRK.AttrKind);
- if (BOI.End - BOI.Begin > 0)
- II->op_begin()[BOI.Begin].set(CanonRK.WasOn);
- if (BOI.End - BOI.Begin > 1)
- II->op_begin()[BOI.Begin + 1].set(ConstantInt::get(
- Type::getInt64Ty(II->getContext()), CanonRK.ArgValue));
- if (RK.WasOn)
- Worklist.pushValue(RK.WasOn);
- return II;
- }
- }
-
// If there is a dominating assume with the same condition as this one,
// then this one is redundant, and should be removed.
KnownBits Known(1);
diff --git a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp
index 722d04c9ae957..a1176762f6768 100644
--- a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp
+++ b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp
@@ -304,21 +304,6 @@ bool llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC,
return Changed;
}
-RetainedKnowledge llvm::simplifyRetainedKnowledge(AssumeInst *Assume,
- RetainedKnowledge RK,
- AssumptionCache *AC,
- DominatorTree *DT) {
- AssumeBuilderState Builder(Assume->getModule(), Assume, AC, DT);
- RK = canonicalizedKnowledge(RK, Assume->getDataLayout());
-
- if (!Builder.isKnowledgeWorthPreserving(RK))
- return RetainedKnowledge::none();
-
- if (Builder.tryToPreserveWithoutAddingAssume(RK))
- return RetainedKnowledge::none();
- return RK;
-}
-
namespace {
struct AssumeSimplify {
diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll
index f191dfb4f0d93..bf073b8d7ce70 100644
--- a/llvm/test/Transforms/InstCombine/assume.ll
+++ b/llvm/test/Transforms/InstCombine/assume.ll
@@ -1,7 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -passes=instcombine -S | FileCheck --check-prefixes=CHECK,DEFAULT %s
-; RUN: opt < %s -passes=instcombine --enable-knowledge-retention -S | FileCheck --check-prefixes=CHECK,BUNDLES %s
-
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -122,14 +120,10 @@ entry:
}
define void @align_with_constant_offset_0(ptr %ptr) {
-; DEFAULT-LABEL: @align_with_constant_offset_0(
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ]
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 0) ]
-; DEFAULT-NEXT: ret void
-;
-; BUNDLES-LABEL: @align_with_constant_offset_0(
-; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16, i64 0) ]
-; BUNDLES-NEXT: ret void
+; CHECK-LABEL: @align_with_constant_offset_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) ]
call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 8, i64 0) ]
@@ -163,14 +157,10 @@ define void @align_with_constant_offset_4(ptr %ptr) {
}
define void @align_with_constant_offset_8(ptr %ptr) {
-; DEFAULT-LABEL: @align_with_constant_offset_8(
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ]
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 8) ]
-; DEFAULT-NEXT: ret void
-;
-; BUNDLES-LABEL: @align_with_constant_offset_8(
-; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16, i64 8) ]
-; BUNDLES-NEXT: ret void
+; CHECK-LABEL: @align_with_constant_offset_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) ]
call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 8, i64 8) ]
@@ -178,14 +168,10 @@ define void @align_with_constant_offset_8(ptr %ptr) {
}
define void @align_with_variable_offset(ptr %ptr, i64 %offset) {
-; DEFAULT-LABEL: @align_with_variable_offset(
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16) ]
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i64 8, i64 [[OFFSET:%.*]]) ]
-; DEFAULT-NEXT: ret void
-;
-; BUNDLES-LABEL: @align_with_variable_offset(
-; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 16, i64 [[OFFSET:%.*]]) ]
-; BUNDLES-NEXT: ret void
+; CHECK-LABEL: @align_with_variable_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) ]
call void @llvm.assume(i1 true) [ "align"(ptr %ptr, i64 8, i64 %offset) ]
@@ -770,14 +756,10 @@ define void @nonnull_gep_inbounds_bundle(ptr %p, i64 %i) {
}
define void @nonnull_gep_inbounds_bundle_null_is_valid(ptr %p, i64 %i) null_pointer_is_valid {
-; DEFAULT-LABEL: @nonnull_gep_inbounds_bundle_null_is_valid(
-; DEFAULT-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 [[I:%.*]]
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[P2]]) ]
-; DEFAULT-NEXT: ret void
-;
-; BUNDLES-LABEL: @nonnull_gep_inbounds_bundle_null_is_valid(
-; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[P:%.*]]) ]
-; BUNDLES-NEXT: ret void
+; CHECK-LABEL: @nonnull_gep_inbounds_bundle_null_is_valid(
+; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 [[I:%.*]]
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[P2]]) ]
+; CHECK-NEXT: ret void
;
%p2 = getelementptr inbounds i8, ptr %p, i64 %i
call void @llvm.assume(i1 true) ["nonnull"(ptr %p2)]
@@ -1020,14 +1002,10 @@ exit:
}
define void @canonicalize_assume(ptr %0) {
-; DEFAULT-LABEL: @canonicalize_assume(
-; DEFAULT-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0:%.*]], i64 8
-; DEFAULT-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP2]], i64 16) ]
-; DEFAULT-NEXT: ret void
-;
-; BUNDLES-LABEL: @canonicalize_assume(
-; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP0:%.*]], i64 8) ]
-; BUNDLES-NEXT: ret void
+; CHECK-LABEL: @canonicalize_assume(
+; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0:%.*]], i64 8
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP2]], i64 16) ]
+; CHECK-NEXT: ret void
;
%2 = getelementptr inbounds i32, ptr %0, i64 2
call void @llvm.assume(i1 true) [ "align"(ptr %2, i64 16) ]
More information about the llvm-commits
mailing list