https://github.com/kasuga-fj created 
https://github.com/llvm/llvm-project/pull/200828

None

>From c0f8fa3543acae89efaafdae811e3fc2186e3bba Mon Sep 17 00:00:00 2001
From: Ryotaro Kasuga <[email protected]>
Date: Mon, 1 Jun 2026 14:03:06 +0000
Subject: [PATCH] [LoopInterchange] Prevent to interchange when memory-related
 calls exist

---
 .../lib/Transforms/Scalar/LoopInterchange.cpp |  6 +++--
 .../Transforms/LoopInterchange/memory-attr.ll | 26 +++++--------------
 2 files changed, 11 insertions(+), 21 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp 
b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
index 9d424ae13e28a..1af873cb6ecfe 100644
--- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
@@ -1474,8 +1474,10 @@ bool 
LoopInterchangeLegality::canInterchangeLoops(unsigned InnerLoopId,
   for (auto *BB : OuterLoop->blocks())
     for (Instruction &I : *BB)
       if (CallInst *CI = dyn_cast<CallInst>(&I)) {
-        // readnone functions do not prevent interchanging.
-        if (CI->onlyWritesMemory() || isa<PseudoProbeInst>(CI))
+        if (isa<PseudoProbeInst>(CI))
+          continue;
+        // Functions which don't access memories do not prevent interchanging.
+        if (CI->doesNotAccessMemory())
           continue;
         LLVM_DEBUG(
             dbgs() << "Loops with call instructions cannot be interchanged "
diff --git a/llvm/test/Transforms/LoopInterchange/memory-attr.ll 
b/llvm/test/Transforms/LoopInterchange/memory-attr.ll
index c32f48ef63694..c2f0c74167b5e 100644
--- a/llvm/test/Transforms/LoopInterchange/memory-attr.ll
+++ b/llvm/test/Transforms/LoopInterchange/memory-attr.ll
@@ -8,36 +8,24 @@
 ; The writeonly call may write to `%A` at some unknown index, so we cannot
 ; interchange the loops.
 ;
-; FIXME: These loops are now interchanged.
-;
 define void @call_writeonly(ptr %A) {
 ; CHECK-LABEL: define void @call_writeonly(
 ; CHECK-SAME: ptr [[A:%.*]]) {
-; CHECK-NEXT:  [[INNER_PREHEADER:.*:]]
-; CHECK-NEXT:    br label %[[INNER:.*]]
-; CHECK:       [[OUTER_HEADER_PREHEADER1:.*]]:
-; CHECK-NEXT:    br label %[[OUTER_HEADER_PREHEADER:.*]]
-; CHECK:       [[OUTER_HEADER_PREHEADER]]:
-; CHECK-NEXT:    [[I:%.*]] = phi i64 [ [[I_NEXT:%.*]], %[[OUTER_LATCH:.*]] ], 
[ 0, %[[OUTER_HEADER_PREHEADER1]] ]
-; CHECK-NEXT:    br label %[[INNER_SPLIT1:.*]]
-; CHECK:       [[INNER]]:
+; CHECK-NEXT:  [[INNER:.*]]:
 ; CHECK-NEXT:    br label %[[INNER1:.*]]
 ; CHECK:       [[INNER1]]:
-; CHECK-NEXT:    [[J:%.*]] = phi i64 [ [[TMP2:%.*]], %[[INNER_SPLIT:.*]] ], [ 
0, %[[INNER]] ]
-; CHECK-NEXT:    br label %[[OUTER_HEADER_PREHEADER1]]
-; CHECK:       [[INNER_SPLIT1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i64 [ 0, %[[INNER]] ], [ [[I_NEXT:%.*]], 
%[[OUTER_LATCH:.*]] ]
+; CHECK-NEXT:    br label %[[OUTER_HEADER_PREHEADER1:.*]]
+; CHECK:       [[OUTER_HEADER_PREHEADER1]]:
+; CHECK-NEXT:    [[J:%.*]] = phi i64 [ 0, %[[INNER1]] ], [ [[TMP2:%.*]], 
%[[OUTER_HEADER_PREHEADER1]] ]
 ; CHECK-NEXT:    call void @writeonly(ptr [[A]])
-; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[J]], 1
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 100
-; CHECK-NEXT:    br label %[[OUTER_LATCH]]
-; CHECK:       [[INNER_SPLIT]]:
 ; CHECK-NEXT:    [[TMP2]] = add i64 [[J]], 1
 ; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[TMP2]], 100
-; CHECK-NEXT:    br i1 [[TMP3]], label %[[EXIT:.*]], label %[[INNER1]]
+; CHECK-NEXT:    br i1 [[TMP3]], label %[[OUTER_LATCH]], label 
%[[OUTER_HEADER_PREHEADER1]]
 ; CHECK:       [[OUTER_LATCH]]:
 ; CHECK-NEXT:    [[I_NEXT]] = add i64 [[I]], 1
 ; CHECK-NEXT:    [[EC_OUTER:%.*]] = icmp eq i64 [[I_NEXT]], 100
-; CHECK-NEXT:    br i1 [[EC_OUTER]], label %[[INNER_SPLIT]], label 
%[[OUTER_HEADER_PREHEADER]]
+; CHECK-NEXT:    br i1 [[EC_OUTER]], label %[[EXIT:.*]], label %[[INNER1]]
 ; CHECK:       [[EXIT]]:
 ; CHECK-NEXT:    ret void
 ;

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to