[llvm] [SROA] Rewrite invariant group intrinsics after splitting alloca (PR #107557)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 7 03:51:37 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);
----------------
nikic wrote:

```llvm
define void @test(ptr %ptr) {
  %alloca = alloca { [16 x i8], i64, [16 x i8] }, align 8
  %launder = call ptr @llvm.launder.invariant.group.p0(ptr %alloca)
  %gep = getelementptr i8, ptr %launder, i64 16
  store i64 0, ptr %gep
  call void @llvm.memcpy.p0.p0.i64(ptr %launder, ptr %ptr, i64 40, i1 false)
  ret void
}
```

With your patch this produces:
```
define void @test(ptr %ptr) {
  %alloca.sroa.0 = alloca [16 x i8], align 8
  %alloca.sroa.3 = alloca [16 x i8], align 8
  %1 = call ptr @llvm.launder.invariant.group.p0(ptr %alloca.sroa.3)
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %alloca.sroa.0, ptr align 1 %ptr, i64 16, i1 false)
  %alloca.sroa.2.0.ptr.sroa_idx = getelementptr inbounds i8, ptr %ptr, i64 16
  %alloca.sroa.2.0.copyload = load i64, ptr %alloca.sroa.2.0.ptr.sroa_idx, align 1
  %alloca.sroa.3.0.ptr.sroa_idx = getelementptr inbounds i8, ptr %ptr, i64 24
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %alloca.sroa.3, ptr align 1 %alloca.sroa.3.0.ptr.sroa_idx, i64 16, i1 false)
  ret void
}
```
Note that the `launder.invariant` intrinsic here is unused.

https://github.com/llvm/llvm-project/pull/107557


More information about the llvm-commits mailing list