[llvm] [mlir] [IR] Remove llvm.strip.invariant.group intrinsic (PR #225399)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 06:44:12 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-compiler-rt-sanitizer
@llvm/pr-subscribers-backend-amdgpu
Author: Nikita Popov (nikic)
<details>
<summary>Changes</summary>
This intrinsic was originally introduced to make sure that if we have a dominating condition like `a == launder.invariant.group(a)`, we don't end up replacing the latter with the former, as that would allow the optimizer to assume that the memory stays invariant, despite going through a launder operation. Wrapping both comparison operands in strip.invariant.group avoids the issue, because replacing one stripped pointer with another is safe.
The underlying issue was fixed in https://github.com/llvm/llvm-project/pull/224281 (and prior work), which ensures that the problematic replacement cannot happen in the first place.
https://github.com/llvm/llvm-project/pull/225072 stopped emitting llvm.strip.invariant.group on the clang side.
This PR now removes the intrinsic entirely. To be on the safe side, it is upgraded to llvm.launder.invariant.group. For Clang's specific usage, just dropping it would be fine.
---
Patch is 94.64 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/225399.diff
47 Files Affected:
- (modified) llvm/docs/LangRef.md (-30)
- (modified) llvm/docs/ReleaseNotes.md (+4)
- (modified) llvm/include/llvm/Analysis/TargetTransformInfoImpl.h (-1)
- (modified) llvm/include/llvm/IR/IRBuilder.h (-5)
- (modified) llvm/include/llvm/IR/Instruction.h (-4)
- (modified) llvm/include/llvm/IR/Intrinsics.td (-5)
- (modified) llvm/lib/Analysis/ConstantFolding.cpp (+3-6)
- (modified) llvm/lib/Analysis/InlineCost.cpp (-1)
- (modified) llvm/lib/Analysis/ValueTracking.cpp (-1)
- (modified) llvm/lib/CodeGen/CodeGenPrepare.cpp (+1-2)
- (modified) llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp (-1)
- (modified) llvm/lib/CodeGen/SelectionDAG/FastISel.cpp (-1)
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (-1)
- (modified) llvm/lib/IR/AutoUpgrade.cpp (+9)
- (modified) llvm/lib/IR/IRBuilder.cpp (-17)
- (modified) llvm/lib/IR/Instruction.cpp (-9)
- (modified) llvm/lib/IR/Value.cpp (+3-3)
- (modified) llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp (+1-3)
- (modified) llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp (+1-3)
- (modified) llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp (+5-18)
- (modified) llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp (+6-6)
- (modified) llvm/lib/Transforms/InstCombine/InstructionCombining.cpp (-1)
- (modified) llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp (-1)
- (modified) llvm/test/Analysis/CostModel/X86/free-intrinsics.ll (-4)
- (modified) llvm/test/Analysis/CostModel/free-intrinsics-datalayout.ll (-4)
- (modified) llvm/test/Analysis/CostModel/free-intrinsics-no_info.ll (-4)
- (modified) llvm/test/Analysis/ValueTracking/invariant.group.ll (-15)
- (added) llvm/test/Bitcode/upgrade-strip-invariant-group.ll (+22)
- (modified) llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-pointer-ops.ll (+2-5)
- (modified) llvm/test/CodeGen/AMDGPU/promote-alloca-invariant-markers.ll (+6-11)
- (modified) llvm/test/Other/invariant.group.ll (-9)
- (modified) llvm/test/Transforms/Attributor/nocapture-1.ll (+42-92)
- (modified) llvm/test/Transforms/DeadStoreElimination/launder.invariant.group.ll (-34)
- (modified) llvm/test/Transforms/FunctionAttrs/nocapture.ll (+37-81)
- (modified) llvm/test/Transforms/GVN/assume-equal.ll (-14)
- (modified) llvm/test/Transforms/GVN/invariant.group.ll (-15)
- (removed) llvm/test/Transforms/Inline/inline_inv_group.ll (-27)
- (modified) llvm/test/Transforms/InstCombine/invariant.group.ll (-123)
- (modified) llvm/test/Transforms/NewGVN/invariant.group.ll (-12)
- (modified) llvm/test/Transforms/SROA/invariant-group.ll (+3-4)
- (modified) llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-free-cost.ll (+5-5)
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td (-9)
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMMemorySlot.cpp (-12)
- (modified) mlir/test/Dialect/LLVMIR/mem2reg.mlir (-1)
- (modified) mlir/test/Dialect/LLVMIR/roundtrip.mlir (-2)
- (modified) mlir/test/Target/LLVMIR/Import/intrinsic.ll (-2)
- (modified) mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir (-2)
``````````diff
diff --git a/llvm/docs/LangRef.md b/llvm/docs/LangRef.md
index a4816d337e02b..3d906ee36a997 100644
--- a/llvm/docs/LangRef.md
+++ b/llvm/docs/LangRef.md
@@ -24340,36 +24340,6 @@ Returns another pointer that aliases its argument but which is considered differ
for the purposes of `load`/`store` `invariant.group` metadata.
It does not read any accessible memory and the execution can be speculated.
-#### '`llvm.strip.invariant.group`' Intrinsic
-
-##### Syntax:
-This is an overloaded intrinsic. The {ref}`allocated object<allocatedobjects>`
-can belong to any address space. The returned pointer must belong to the same
-address space as the argument.
-
-```
-declare ptr @llvm.strip.invariant.group.p0(ptr <ptr>)
-```
-
-##### Overview:
-
-The '`llvm.strip.invariant.group`' intrinsic can be used when an invariant
-established by `invariant.group` metadata no longer holds, to obtain a new pointer
-value that does not carry the invariant information. It is an experimental
-intrinsic, which means that its semantics might change in the future.
-
-
-##### Arguments:
-
-The `llvm.strip.invariant.group` takes only one argument, which is a pointer
-to the memory.
-
-##### Semantics:
-
-Returns another pointer that aliases its argument but which has no associated
-`invariant.group` metadata.
-It does not read any memory and can be speculated.
-
(constrainedfp)=
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index caa8dd6fe4357..739c9ba22cabf 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -161,6 +161,10 @@ Makes programs 10x faster by doing Special New Thing.
The `llvm.vp.merge` will be folded away but the `%evl` will be propagated to
the add instruction.
+* The `llvm.strip.invariant.group` intrinsic has been removed. It existed to
+ work around a bug relating to replacement of pointers with different
+ provenance based on dominating equality conditions, and is no longer needed.
+
* Introduced the generic `!atomic.ignore.denormal.mode` metadata for
floating-point `atomicrmw` instructions, generalizing the previously
AMDGPU-specific `!amdgpu.ignore.denormal.mode`.
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
index 5103d3dce25b2..8da91cc38c349 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -936,7 +936,6 @@ class LLVM_ABI TargetTransformInfoImplBase {
case Intrinsic::invariant_start:
case Intrinsic::invariant_end:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::is_constant:
case Intrinsic::lifetime_start:
case Intrinsic::lifetime_end:
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index 8b5fa73c9c3e9..6634cf4116bb4 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -2789,11 +2789,6 @@ class IRBuilderBase {
/// address space before call and casted back to Ptr type after call.
LLVM_ABI Value *CreateLaunderInvariantGroup(Value *Ptr);
- /// \brief Create a strip.invariant.group intrinsic call. If Ptr type is
- /// different from pointer to i8, it's casted to pointer to i8 in the same
- /// address space before call and casted back to Ptr type after call.
- LLVM_ABI Value *CreateStripInvariantGroup(Value *Ptr);
-
/// Return a vector value that contains the vector V reversed
LLVM_ABI Value *CreateVectorReverse(Value *V, const Twine &Name = "");
diff --git a/llvm/include/llvm/IR/Instruction.h b/llvm/include/llvm/IR/Instruction.h
index 8a37f25238de7..0ad9e4ff47b66 100644
--- a/llvm/include/llvm/IR/Instruction.h
+++ b/llvm/include/llvm/IR/Instruction.h
@@ -951,10 +951,6 @@ class Instruction : public User,
/// llvm.lifetime.end marker.
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY;
- /// Return true if the instruction is a llvm.launder.invariant.group or
- /// llvm.strip.invariant.group.
- LLVM_ABI bool isLaunderOrStripInvariantGroup() const LLVM_READONLY;
-
/// Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
LLVM_ABI bool isDebugOrPseudoInst() const LLVM_READONLY;
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 26b7c772eb244..fa1ab702873d2 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1918,11 +1918,6 @@ def int_launder_invariant_group : DefaultAttrsIntrinsic<[llvm_anyptr_ty],
[IntrInaccessibleMemOnly,
IntrSpeculatable]>;
-
-def int_strip_invariant_group : DefaultAttrsIntrinsic<[llvm_anyptr_ty],
- [LLVMMatchType<0>],
- [IntrSpeculatable, IntrNoMem]>;
-
//===------------------------ Stackmap Intrinsics -------------------------===//
//
def int_experimental_stackmap : DefaultAttrsIntrinsic<[],
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index b83c9bb13ecb4..bd803f8c5ac78 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -1744,7 +1744,6 @@ static bool canConstantFoldIntrinsic(Intrinsic::ID ID, bool IsStrictFP) {
case Intrinsic::pdep:
case Intrinsic::pext:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::masked_load:
case Intrinsic::get_active_lane_mask:
case Intrinsic::abs:
@@ -2632,15 +2631,13 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
return Constant::getNullValue(Ty);
if (IntrinsicID == Intrinsic::bswap ||
IntrinsicID == Intrinsic::bitreverse ||
- IntrinsicID == Intrinsic::launder_invariant_group ||
- IntrinsicID == Intrinsic::strip_invariant_group)
+ IntrinsicID == Intrinsic::launder_invariant_group)
return Operands[0];
}
if (isa<ConstantPointerNull>(Operands[0])) {
- // launder(null) == null == strip(null) iff in addrspace 0
- if (IntrinsicID == Intrinsic::launder_invariant_group ||
- IntrinsicID == Intrinsic::strip_invariant_group) {
+ // launder(null) == null iff in addrspace 0
+ if (IntrinsicID == Intrinsic::launder_invariant_group) {
// If instruction is not yet put in a basic block (e.g. when cloning
// a function during inlining), Call's caller may not be available.
// So check Call's BB first before querying Call->getCaller.
diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp
index d4f4d937aa06a..0a540c1b8fb67 100644
--- a/llvm/lib/Analysis/InlineCost.cpp
+++ b/llvm/lib/Analysis/InlineCost.cpp
@@ -2535,7 +2535,6 @@ bool CallAnalyzer::visitCallBase(CallBase &Call) {
InitsVargArgs = true;
return false;
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
if (auto *SROAArg = getSROAArgForValueOrNull(II->getOperand(0)))
SROAArgValues[II] = SROAArg;
return true;
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 1286130cf5d94..9b5d0d515eb8d 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -7243,7 +7243,6 @@ bool llvm::isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(
bool MustPreserveProvenance) {
switch (Call->getIntrinsicID()) {
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::aarch64_irg:
case Intrinsic::aarch64_tagp:
// The amdgcn_make_buffer_rsrc function does not alter the address of the
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 3e0b8a956ca81..ff40f210c5790 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -2817,8 +2817,7 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, ModifyDT &ModifiedDT) {
return true;
}
- case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group: {
+ case Intrinsic::launder_invariant_group: {
Value *ArgVal = II->getArgOperand(0);
auto it = LargeOffsetGEPMap.find(II);
if (it != LargeOffsetGEPMap.end()) {
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index d9e88f22ac2ca..cac3963b08a90 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3287,7 +3287,6 @@ bool IRTranslatorImpl::translateKnownIntrinsic(const CallInst &CI,
case Intrinsic::annotation:
case Intrinsic::ptr_annotation:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::threadlocal_address: {
// Drop the intrinsic, but forward the value.
MIRBuilder.buildCopy(getOrCreateVReg(CI),
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
index 8f1869b5e03a1..5fc4611d077b0 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -1413,7 +1413,6 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {
}
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::expect:
case Intrinsic::expect_with_probability: {
Register ResultReg = getRegForValue(II->getArgOperand(0));
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 065347d903033..eea69e41b26eb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7781,7 +7781,6 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
case Intrinsic::annotation:
case Intrinsic::ptr_annotation:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
// Drop the intrinsic, but forward the value
setValue(&I, getValue(I.getOperand(0)));
return;
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 16ff20a3d9946..ad1d66c3cdd2e 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -2325,6 +2325,15 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn,
NewFn = nullptr;
return true;
}
+ if (Name.starts_with("strip.invariant.group")) {
+ // For clang's usage it would be safe to just drop the
+ // strip.invariant.group, but to be conservative replace with the
+ // stronger launder.invariant.group instead.
+ NewFn = Intrinsic::getOrInsertDeclaration(
+ F->getParent(), Intrinsic::launder_invariant_group,
+ F->getReturnType());
+ return true;
+ }
break;
case 't':
diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
index 52cb9daba6582..fbf902654403a 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -1211,23 +1211,6 @@ Value *IRBuilderBase::CreateLaunderInvariantGroup(Value *Ptr) {
return CreateCall(FnLaunderInvariantGroup, {Ptr});
}
-Value *IRBuilderBase::CreateStripInvariantGroup(Value *Ptr) {
- assert(isa<PointerType>(Ptr->getType()) &&
- "strip.invariant.group only applies to pointers.");
-
- auto *PtrType = Ptr->getType();
- Module *M = BB->getParent()->getParent();
- Function *FnStripInvariantGroup = Intrinsic::getOrInsertDeclaration(
- M, Intrinsic::strip_invariant_group, {PtrType});
-
- assert(FnStripInvariantGroup->getReturnType() == PtrType &&
- FnStripInvariantGroup->getFunctionType()->getParamType(0) ==
- PtrType &&
- "StripInvariantGroup should take and return the same type");
-
- return CreateCall(FnStripInvariantGroup, {Ptr});
-}
-
Value *IRBuilderBase::CreateVectorReverse(Value *V, const Twine &Name) {
auto *Ty = cast<VectorType>(V->getType());
if (isa<ScalableVectorType>(Ty)) {
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index 60e4f353585db..4e819c8a00ca0 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -1382,15 +1382,6 @@ bool Instruction::isLifetimeStartOrEnd() const {
return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
}
-bool Instruction::isLaunderOrStripInvariantGroup() const {
- auto *II = dyn_cast<IntrinsicInst>(this);
- if (!II)
- return false;
- Intrinsic::ID ID = II->getIntrinsicID();
- return ID == Intrinsic::launder_invariant_group ||
- ID == Intrinsic::strip_invariant_group;
-}
-
bool Instruction::isDebugOrPseudoInst() const {
return isa<DbgInfoIntrinsic>(this) || isa<PseudoProbeInst>(this);
}
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp
index 50882ec0d7b10..2737192307b99 100644
--- a/llvm/lib/IR/Value.cpp
+++ b/llvm/lib/IR/Value.cpp
@@ -696,8 +696,7 @@ static const Value *stripPointerCastsAndOffsets(
// but it can't be marked with returned attribute, that's why it needs
// special case.
if (StripKind == PSK_ForAliasAnalysis &&
- (Call->getIntrinsicID() == Intrinsic::launder_invariant_group ||
- Call->getIntrinsicID() == Intrinsic::strip_invariant_group)) {
+ Call->getIntrinsicID() == Intrinsic::launder_invariant_group) {
V = Call->getArgOperand(0);
continue;
}
@@ -797,7 +796,8 @@ const Value *Value::stripAndAccumulateConstantOffsets(
} else if (const auto *Call = dyn_cast<CallBase>(V)) {
if (const Value *RV = Call->getReturnedArgOperand())
V = RV;
- if (AllowInvariantGroup && Call->isLaunderOrStripInvariantGroup())
+ if (AllowInvariantGroup &&
+ Call->getIntrinsicID() == Intrinsic::launder_invariant_group)
V = Call->getArgOperand(0);
} else if (auto *Int2Ptr = dyn_cast<Operator>(V)) {
// Try to accumulate across (inttoptr (add (ptrtoint p), off)).
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp
index 81b7d4360e967..a00f3372c1f60 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp
@@ -2468,7 +2468,6 @@ static bool isRemovablePointerIntrinsic(Intrinsic::ID IID) {
case Intrinsic::invariant_start:
case Intrinsic::invariant_end:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::memcpy:
case Intrinsic::memcpy_inline:
case Intrinsic::memmove:
@@ -2553,8 +2552,7 @@ PtrParts SplitPtrStructs::visitIntrinsicInst(IntrinsicInst &I) {
I.replaceAllUsesWith(NewRsrc);
return {nullptr, nullptr};
}
- case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group: {
+ case Intrinsic::launder_invariant_group: {
Value *Ptr = I.getArgOperand(0);
if (!isSplitFatPtr(Ptr->getType()))
return {nullptr, nullptr};
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp
index 4f54ca98bd5fc..aefcabd0d3bf1 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp
@@ -1342,7 +1342,6 @@ static bool isCallPromotable(CallInst *CI) {
case Intrinsic::invariant_start:
case Intrinsic::invariant_end:
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
case Intrinsic::objectsize:
return true;
default:
@@ -1749,8 +1748,7 @@ bool AMDGPUPromoteAllocaImpl::tryPromoteAllocaToLDS(
}
case Intrinsic::invariant_start:
case Intrinsic::invariant_end:
- case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group: {
+ case Intrinsic::launder_invariant_group: {
assert(Intr->getArgOperand(Intr->arg_size() - 1)->getType() == NewPtrTy &&
"pointer operand should already have been promoted");
Function *NewF = Intrinsic::getOrInsertDeclaration(
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 86dd4397f22c9..c00f4a7a1b820 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -447,12 +447,8 @@ Instruction *InstCombinerImpl::simplifyMaskedScatter(IntrinsicInst &II) {
return nullptr;
}
-/// This function transforms launder.invariant.group and strip.invariant.group
-/// like:
+/// This function transforms launder.invariant.group like:
/// launder(launder(%x)) -> launder(%x) (the result is not the argument)
-/// launder(strip(%x)) -> launder(%x)
-/// strip(strip(%x)) -> strip(%x) (the result is not the argument)
-/// strip(launder(%x)) -> strip(%x)
/// This is legal because it preserves the most recent information about
/// the presence or absence of invariant.group.
static Instruction *simplifyInvariantGroupIntrinsic(IntrinsicInst &II,
@@ -461,23 +457,15 @@ static Instruction *simplifyInvariantGroupIntrinsic(IntrinsicInst &II,
auto *StrippedArg = Arg->stripPointerCasts();
auto *StrippedInvariantGroupsArg = StrippedArg;
while (auto *Intr = dyn_cast<IntrinsicInst>(StrippedInvariantGroupsArg)) {
- if (Intr->getIntrinsicID() != Intrinsic::launder_invariant_group &&
- Intr->getIntrinsicID() != Intrinsic::strip_invariant_group)
+ if (Intr->getIntrinsicID() != Intrinsic::launder_invariant_group)
break;
StrippedInvariantGroupsArg = Intr->getArgOperand(0)->stripPointerCasts();
}
if (StrippedArg == StrippedInvariantGroupsArg)
- return nullptr; // No launders/strips to remove.
+ return nullptr; // No launders to remove.
- Value *Result = nullptr;
-
- if (II.getIntrinsicID() == Intrinsic::launder_invariant_group)
- Result = IC.Builder.CreateLaunderInvariantGroup(StrippedInvariantGroupsArg);
- else if (II.getIntrinsicID() == Intrinsic::strip_invariant_group)
- Result = IC.Builder.CreateStripInvariantGroup(StrippedInvariantGroupsArg);
- else
- llvm_unreachable(
- "simplifyInvariantGroupIntrinsic only handles launder and strip");
+ Value *Result =
+ IC.Builder.CreateLaunderInvariantGroup(StrippedInvariantGroupsArg);
if (Result->getType()->getPointerAddressSpace() !=
II.getType()->getPointerAddressSpace())
Result = IC.Builder.CreateAddrSpaceCast(Result, II.getType());
@@ -2644,7 +2632,6 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
case Intrinsic::masked_scatter:
return simplifyMaskedScatter(*II);
case Intrinsic::launder_invariant_group:
- case Intrinsic::strip_invariant_group:
if (auto *SkippedBarrier = simplifyInvariantGroupIntrinsic(*II, *this))
return replaceInstUsesWith(*II, SkippedBarrier);
break;
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index d0c9c159a335d..e15708ce31b17 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -7694,12 +7694,12 @@ static Instruction *foldICmpInvariantGroup(ICmpInst &I) {
I.getOperand(0)->getType()->getPointerAddressSpace())) {
return nullptr;
}
- Instruction *Op;
- if (match(I.getOperand(0), m_Instruction(Op)) &&
- match(I.getOperand(1), m_Zero()) &&
- Op->isLaunderOrStripInvariantGroup()) {
- return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
- Op->getOperand(0), I.getOperand(1));
+ Value *Ptr;
+ if (match(I.getOperand(0),
+ m_Intrinsic<Intrinsic::launder_invariant_group>(m_Value(Ptr))) &&
+ match(I.getOperand(1), m_Zero())) {
+ return ICmpInst::Create(Instruction::ICmp, I.getPredicate(), Ptr,
+ I.getOperand(1));
}
return nullptr;
}
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 4b09510933d0c..4254a82c7c819 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3810,7 +3810,6 @@ isAllocSiteRemovable(Instruction *AI, SmallVectorImpl<Instruction *> &Users,
Users.emplace_back(I);
con...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/225399
More information about the llvm-commits
mailing list