[llvm] [LICM] Improve LICM when calls only change Inaccessible memory (PR #169379)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 11:46:30 PDT 2026


================
@@ -0,0 +1,163 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes='loop-mssa(licm)' < %s -S | FileCheck %s
+
+;; It should hoist fn_write_inaccessible_mem
+;; because there is no conflict between inaccessible memory
+;; fn_read_inaccessible_mem is a nice side effect
+define i32 @loop_alias(i64 %x) {
+; CHECK-LABEL: define i32 @loop_alias(
+; CHECK-SAME: i64 [[X:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*]]:
+; CHECK-NEXT:    call void @fn_write_inaccessible_mem()
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    [[PHI:%.*]] = phi ptr [ null, %[[ENTRY]] ], [ [[GEP:%.*]], %[[LOOP]] ]
+; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[PHI]], align 16
+; CHECK-NEXT:    [[VAL:%.*]] = call i32 @fn_args(i32 [[LOAD]])
+; CHECK-NEXT:    call void @fn_read_inaccessible_mem(i32 [[LOAD]])
+; CHECK-NEXT:    [[GEP]] = getelementptr inbounds nuw i32, ptr [[PHI]], i64 [[X]]
+; CHECK-NEXT:    [[ACC:%.*]] = add nuw nsw i32 [[VAL]], 1
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[ACC]], 10
+; CHECK-NEXT:    br i1 [[CMP]], label %[[LOOP]], label %[[AFTER_LOOP:.*]]
+; CHECK:       [[AFTER_LOOP]]:
+; CHECK-NEXT:    [[ACC_LCSSA:%.*]] = phi i32 [ [[ACC]], %[[LOOP]] ]
+; CHECK-NEXT:    ret i32 [[ACC_LCSSA]]
+;
+entry:
+  br label %loop
+loop:
+  %phi = phi ptr [ null, %entry ], [ %gep, %loop ]
+  %load = load i32, ptr %phi, align 16
----------------
nikic wrote:

```suggestion
  %load = load i32, ptr %phi
```
Not that it really matters, but align 16 on an i32 load is odd.

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


More information about the llvm-commits mailing list