[llvm] [LAA] Improve convergent tests (PR #136758)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 22 13:27:38 PDT 2025
https://github.com/artagnon created https://github.com/llvm/llvm-project/pull/136758
None
>From e963f5bf9f420b513444426c5bc2162fb67d65ae Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Tue, 22 Apr 2025 21:24:23 +0100
Subject: [PATCH] [LAA] Improve convergent tests
---
.../unsafe-and-rt-checks-convergent.ll | 134 +++++++++++++-----
1 file changed, 99 insertions(+), 35 deletions(-)
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks-convergent.ll b/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks-convergent.ll
index 4876c5c4b26f8..8a0557fb17fd4 100644
--- a/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks-convergent.ll
+++ b/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks-convergent.ll
@@ -1,41 +1,51 @@
-; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
; Analyze this loop:
; for (i = 0; i < n; i++)
; A[i + 1] = A[i] * B[i] * C[i];
-target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
-
-; CHECK: for.body:
-; CHECK: Has convergent operation in loop
-; CHECK: Report: cannot add control dependency to convergent operation
-; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Backward:
-; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 2 ->
-; CHECK-NEXT: store i16 %mul1, ptr %arrayidxA_plus_2, align 2
-; CHECK: Run-time memory checks:
-; CHECK-NEXT: 0:
-; CHECK-NEXT: Comparing group
-; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
-; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
-; CHECK-NEXT: Against group
-; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, ptr %b, i64 %storemerge3
-; CHECK-NEXT: 1:
-; CHECK-NEXT: Comparing group
-; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
-; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
-; CHECK-NEXT: Against group
-; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, ptr %c, i64 %storemerge3
-
- at B = common global ptr null, align 8
- at A = common global ptr null, align 8
- at C = common global ptr null, align 8
-
-define void @f() #1 {
+define void @rtchecks_needed(ptr %a, ptr %b, ptr %c) {
+; CHECK-LABEL: 'rtchecks_needed'
+; CHECK-NEXT: for.body:
+; CHECK-NEXT: Has convergent operation in loop
+; CHECK-NEXT: Report: cannot add control dependency to convergent operation
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Backward:
+; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 2 ->
+; CHECK-NEXT: store i16 %mul1, ptr %arrayidxA_plus_2, align 2
+; CHECK-EMPTY:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Check 0:
+; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
+; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
+; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
+; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
+; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, ptr %b, i64 %storemerge3
+; CHECK-NEXT: Check 1:
+; CHECK-NEXT: Comparing group ([[GRP1]]):
+; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %storemerge3
+; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, ptr %a, i64 %add
+; CHECK-NEXT: Against group ([[GRP3:0x[0-9a-f]+]]):
+; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, ptr %c, i64 %storemerge3
+; CHECK-NEXT: Grouped accesses:
+; CHECK-NEXT: Group [[GRP1]]:
+; CHECK-NEXT: (Low: %a High: (42 + %a))
+; CHECK-NEXT: Member: {%a,+,2}<nuw><%for.body>
+; CHECK-NEXT: Member: {(2 + %a),+,2}<nw><%for.body>
+; CHECK-NEXT: Group [[GRP2]]:
+; CHECK-NEXT: (Low: %b High: (40 + %b))
+; CHECK-NEXT: Member: {%b,+,2}<nuw><%for.body>
+; CHECK-NEXT: Group [[GRP3]]:
+; CHECK-NEXT: (Low: %c High: (40 + %c))
+; CHECK-NEXT: Member: {%c,+,2}<nuw><%for.body>
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
entry:
- %a = load ptr, ptr @A, align 8
- %b = load ptr, ptr @B, align 8
- %c = load ptr, ptr @C, align 8
br label %for.body
for.body: ; preds = %for.body, %entry
@@ -50,7 +60,7 @@ for.body: ; preds = %for.body, %entry
%arrayidxC = getelementptr inbounds i16, ptr %c, i64 %storemerge3
%loadC = load i16, ptr %arrayidxC, align 2
- call void @llvm.convergent()
+ call i16 @llvm.convergent(i16 %loadC)
%mul = mul i16 %loadB, %loadA
%mul1 = mul i16 %mul, %loadC
@@ -66,7 +76,61 @@ for.end: ; preds = %for.body
ret void
}
-declare void @llvm.convergent() #0
+define void @no_rtchecks(ptr noalias %a, ptr noalias %b, ptr noalias %c, ptr noalias %d, ptr noalias %e) {
+; CHECK-LABEL: 'no_rtchecks'
+; CHECK-NEXT: for.body:
+; CHECK-NEXT: Has convergent operation in loop
+; CHECK-NEXT: Report: cannot add control dependency to convergent operation
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Backward:
+; CHECK-NEXT: %loadA = load i16, ptr %arrayidxA, align 4 ->
+; CHECK-NEXT: store i16 %mulA, ptr %arrayidxA_plus_4, align 4
+; CHECK-EMPTY:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
+entry:
+ br label %for.body
+
+for.body: ; preds = %for.body, %entry
+ %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
+
+ %arrayidxA = getelementptr inbounds i16, ptr %a, i64 %ind
+ %loadA = load i16, ptr %arrayidxA, align 4
+
+ %arrayidxB = getelementptr inbounds i16, ptr %b, i64 %ind
+ %loadB = load i16, ptr %arrayidxB, align 4
+
+ %mulA = mul i16 %loadB, %loadA
+
+ %add = add nuw nsw i64 %ind, 1
+ %arrayidxA_plus_4 = getelementptr inbounds i16, ptr %a, i64 %add
+ store i16 %mulA, ptr %arrayidxA_plus_4, align 4
+
+ %arrayidxD = getelementptr inbounds i16, ptr %d, i64 %ind
+ %loadD = load i16, ptr %arrayidxD, align 4
+
+ %arrayidxE = getelementptr inbounds i16, ptr %e, i64 %ind
+ %loadE = load i16, ptr %arrayidxE, align 4
+
+ %convergentD = call i16 @llvm.convergent(i16 %loadD)
+ %mulC = mul i16 %convergentD, %loadE
+
+ %arrayidxC = getelementptr inbounds i16, ptr %c, i64 %ind
+ store i16 %mulC, ptr %arrayidxC, align 4
+
+ %exitcond = icmp eq i64 %add, 20
+ br i1 %exitcond, label %for.end, label %for.body
+
+for.end: ; preds = %for.body
+ ret void
+}
+
+declare i16 @llvm.convergent(i16) #0
attributes #0 = { nounwind readnone convergent }
-attributes #1 = { nounwind convergent }
More information about the llvm-commits
mailing list