[llvm] [SROA] Rewrite invariant group intrinsics after splitting alloca (PR #107557)
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 1 12:12:39 PDT 2024
================
@@ -3531,8 +3531,19 @@ class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
return true;
}
- if (II.isLaunderOrStripInvariantGroup())
+ if (II.isLaunderOrStripInvariantGroup()) {
+ Value *AdjustedPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
+ Value *New = nullptr;
+ if (II.getIntrinsicID() == Intrinsic::launder_invariant_group)
+ New = IRB.CreateLaunderInvariantGroup(AdjustedPtr);
+ else if (II.getIntrinsicID() == Intrinsic::strip_invariant_group)
+ New = IRB.CreateStripInvariantGroup(AdjustedPtr);
+
+ New->takeName(&II);
+ II.replaceAllUsesWith(New);
----------------
antoniofrighetto wrote:
Isn't this already being done as part of visiting each slice in:
https://github.com/llvm/llvm-project/blob/e03f427196ec67a8a5cfbdd658f9eabe9bce83ce/llvm/lib/Transforms/Scalar/SROA.cpp#L4921-L4924
Or am I mistaking it? It looks like the intrinsic has been rewritten for each part of the alloca (this is before mem2reg for the test case):
```
define void @partial_promotion_of_alloca() {
%struct_ptr.sroa.0 = alloca i32, align 4
%struct_ptr.sroa.2 = alloca i32, align 4
store i32 0, ptr %struct_ptr.sroa.0, align 4
store volatile i32 0, ptr %struct_ptr.sroa.2, align 4
%barr = call ptr @llvm.launder.invariant.group.p0(ptr %struct_ptr.sroa.0)
%1 = call ptr @llvm.launder.invariant.group.p0(ptr %struct_ptr.sroa.2)
%struct_ptr.sroa.2.0.struct_ptr.sroa.2.4.load_val = load volatile i32, ptr %struct_ptr.sroa.2, align 4
ret void
}
```
https://github.com/llvm/llvm-project/pull/107557
More information about the llvm-commits
mailing list