[llvm-branch-commits] [llvm] [DA] Remove calls to the GCD MIV test from `testSIV` (PR #186388)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Mar 13 07:02:22 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-analysis

Author: Ryotaro Kasuga (kasuga-fj)

<details>
<summary>Changes</summary>

This patch removes all invocations of the GCD MIV test in `testSIV` function, specifically:

- If both the source and destination are addrecs, replace the call to the GCD MIV test with the Exact SIV test. Generally, the Exact SIV test has a narrower applicability than the GCD MIV test (both the source and destination must be affine addrecs), while the former likely yields a more precise result. Therefore, in this case, there's no reason to use the GCD MIV test. This replacement also means that previously the Exact SIV test was called conditionally (only when the Strong and Weak Crossing SIV tests are not applicable), but now it will be called unconditionally when both the source and destination are addrecs.
- If either the source or the destination is loop-invariant, simply remove the call to the GCD MIV test without replacing it with anything. In this case, the Weak Zero SIV test will be invoked, and part of that test performs almost the same analysis as the GCD MIV test. Therefore, the GCD MIV test should be redundant in nearly all cases.

This patch introduces two types of changes to the analysis results. First, it fixes several correctness issues that were caused by defects in the GCD MIV test. Second, it makes the analysis more precise in some cases. This improvement comes from the fact that, when both the source and destination are affine addrecs, the Exact SIV test is now invoked unconditionally, whereas previously it was only invoked conditionally.

---
Full diff: https://github.com/llvm/llvm-project/pull/186388.diff


6 Files Affected:

- (modified) llvm/lib/Analysis/DependenceAnalysis.cpp (+4-8) 
- (modified) llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll (+9-19) 
- (modified) llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll (+2-2) 
- (modified) llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll (+9-16) 
- (modified) llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll (+12-12) 
- (modified) llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll (+9-19) 


``````````diff
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index 968339fb3db4d..171ff56311172 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -2296,30 +2296,26 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
            "Loops in the SIV test should have the same iteration space and "
            "depth");
     Level = mapSrcLoop(CurSrcLoop);
-    bool disproven;
+    bool disproven = false;
     if (SrcCoeff == DstCoeff)
       disproven = strongSIVtest(SrcAddRec, DstAddRec, Level, Result,
                                 UnderRuntimeAssumptions);
     else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))
       disproven = weakCrossingSIVtest(SrcCoeff, SrcConst, DstConst, CurSrcLoop,
                                       CurDstLoop, Level, Result);
-    else
-      disproven = exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
-    return disproven || gcdMIVtest(Src, Dst, Result) ||
+    return disproven || exactSIVtest(SrcAddRec, DstAddRec, Level, Result) ||
            symbolicRDIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, CurSrcLoop,
                             CurDstLoop);
   }
   if (SrcAddRec) {
     const Loop *CurSrcLoop = SrcAddRec->getLoop();
     Level = mapSrcLoop(CurSrcLoop);
-    return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result) ||
-           gcdMIVtest(Src, Dst, Result);
+    return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result);
   }
   if (DstAddRec) {
     const Loop *CurDstLoop = DstAddRec->getLoop();
     Level = mapDstLoop(CurDstLoop);
-    return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result) ||
-           gcdMIVtest(Src, Dst, Result);
+    return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
   }
   llvm_unreachable("SIV test expected at least one AddRec");
   return false;
diff --git a/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
index 3a5be74f93091..492063c694606 100644
--- a/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
@@ -20,25 +20,14 @@
 ;  A[a*i]        |        | A[14]
 ;  A[5*i + 14]   | A[14]  |
 ;
-; FIXME: DependenceAnalysis fails to detect the dependency between the two
-; stores.
-;
 define void @exact_siv_no_nsw(ptr %A) {
-; CHECK-ALL-LABEL: 'exact_siv_no_nsw'
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-ALL-NEXT:    da analyze - output [*]!
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - none!
-; CHECK-ALL-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - none!
-;
-; CHECK-EXACT-SIV-LABEL: 'exact_siv_no_nsw'
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-LABEL: 'exact_siv_no_nsw'
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT:    da analyze - output [*]!
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - output [*|<]!
+; CHECK-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - none!
 ;
 entry:
   br label %loop.header
@@ -68,4 +57,5 @@ exit:
   ret void
 }
 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-EXACT-SIV: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll b/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
index ba6e0f043b528..7e0b3076e71f4 100644
--- a/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
@@ -34,11 +34,11 @@ define void @exactsiv_const_ovfl(ptr %A) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'exactsiv_const_ovfl'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
 ; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 entry:
   br label %loop.header
diff --git a/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll b/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
index 9e3b5c05ab922..138aab7f5146f 100644
--- a/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
@@ -17,21 +17,13 @@
 ;  A[2^61*i - 2^63] |        | A[0]
 
 define void @infer_affine_domain_ovfl(ptr %A) {
-; CHECK-ALL-LABEL: 'infer_affine_domain_ovfl'
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-ALL-NEXT:    da analyze - none!
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - output [<>]!
-; CHECK-ALL-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - none!
-;
-; CHECK-EXACT-SIV-LABEL: 'infer_affine_domain_ovfl'
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
-; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-LABEL: 'infer_affine_domain_ovfl'
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT:    da analyze - none!
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - output [*|<]!
+; CHECK-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - none!
 ;
 entry:
   br label %loop.header
@@ -59,4 +51,5 @@ exit:
   ret void
 }
 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-EXACT-SIV: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll b/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
index 59f60c43fee2b..f44159ee94eb7 100644
--- a/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
@@ -35,7 +35,7 @@ define void @strong_siv(ptr %a) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'strong_siv'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'strong_siv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1
@@ -103,11 +103,11 @@ define void @weak_crossing_siv(ptr %a) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'weak_crossing_siv'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
 ; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_crossing_siv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -198,11 +198,11 @@ define void @exact_siv(ptr %a) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'exact_siv'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_siv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -232,7 +232,7 @@ define void @exact_siv(ptr %a) {
 ; CHECK-GCD-MIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
 ; CHECK-GCD-MIV-NEXT:    da analyze - output [*]!
 ; CHECK-GCD-MIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-GCD-MIV-NEXT:    da analyze - none!
+; CHECK-GCD-MIV-NEXT:    da analyze - output [*|<]!
 ; CHECK-GCD-MIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
 ; CHECK-GCD-MIV-NEXT:    da analyze - output [*]!
 ;
@@ -298,7 +298,7 @@ define void @weak_zero_siv(ptr %a) {
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
 ; CHECK-EXACT-SIV-NEXT:    da analyze - output [*|<]!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_zero_siv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -388,11 +388,11 @@ define void @exact_rdiv(ptr %a) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'exact_rdiv'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
 ; CHECK-EXACT-SIV-NEXT:    da analyze - output [|<]!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_rdiv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -492,11 +492,11 @@ define void @symbolic_rdiv(ptr %a) {
 ;
 ; CHECK-EXACT-SIV-LABEL: 'symbolic_rdiv'
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
 ; CHECK-EXACT-SIV-NEXT:    da analyze - output [|<]!
 ; CHECK-EXACT-SIV-NEXT:  Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT:    da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT:    da analyze - none!
 ;
 ; CHECK-WEAK-ZERO-SIV-LABEL: 'symbolic_rdiv'
 ; CHECK-WEAK-ZERO-SIV-NEXT:  Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
diff --git a/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
index 721fdeeb31624..8ae5305c3b97b 100644
--- a/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
@@ -20,25 +20,14 @@
 ;  A[(2^62+1)*i]     |        | A[4]
 ;  A[(2^62+1)*i + 4] | A[4]   |
 ;
-; FIXME: DependenceAnalysis fails to detect the dependency between the two
-; stores.
-;
 define void @strong_siv_no_nsw(ptr %A) {
-; CHECK-ALL-LABEL: 'strong_siv_no_nsw'
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-ALL-NEXT:    da analyze - output [*]!
-; CHECK-ALL-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - none!
-; CHECK-ALL-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT:    da analyze - output [*]!
-;
-; CHECK-STRONG-SIV-LABEL: 'strong_siv_no_nsw'
-; CHECK-STRONG-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-STRONG-SIV-NEXT:    da analyze - output [*]!
-; CHECK-STRONG-SIV-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-STRONG-SIV-NEXT:    da analyze - output [*|<]!
-; CHECK-STRONG-SIV-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-STRONG-SIV-NEXT:    da analyze - output [*]!
+; CHECK-LABEL: 'strong_siv_no_nsw'
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT:    da analyze - output [*]!
+; CHECK-NEXT:  Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - output [*|<]!
+; CHECK-NEXT:  Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT:    da analyze - output [*]!
 ;
 entry:
   br label %loop.header
@@ -75,4 +64,5 @@ exit:
   ret void
 }
 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-STRONG-SIV: {{.*}}

``````````

</details>


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


More information about the llvm-branch-commits mailing list