https://github.com/kasuga-fj updated https://github.com/llvm/llvm-project/pull/187220
>From 3bb83cd3f02a4c0564c8b0f2fb2152fdec2ed1ec Mon Sep 17 00:00:00 2001 From: Ryotaro Kasuga <[email protected]> Date: Fri, 13 Mar 2026 10:36:45 +0000 Subject: [PATCH] [DA] Remove calls to the GCD MIV test from `testSIV` --- llvm/lib/Analysis/DependenceAnalysis.cpp | 12 +++----- .../exact-siv-addrec-wrap.ll | 28 ++++++------------- .../DependenceAnalysis/exact-siv-overflow.ll | 4 +-- .../infer_affine_domain_ovlf.ll | 25 ++++++----------- .../DependenceAnalysis/non-monotonic.ll | 2 +- .../run-specific-dependence-test.ll | 24 ++++++++-------- .../strong-siv-addrec-wrap.ll | 28 ++++++------------- .../symbolic-rdiv-addrec-wrap.ll | 2 +- 8 files changed, 47 insertions(+), 78 deletions(-) diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index 83777fe82afe2..a3882fb152df8 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -2223,29 +2223,25 @@ 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(SrcAddRec, DstAddRec); } 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 e982e113231a5..3a43786691aa3 100644 --- a/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll +++ b/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll @@ -33,11 +33,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/non-monotonic.ll b/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll index 5ae51056e71da..50e001a476501 100644 --- a/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll +++ b/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll @@ -46,7 +46,7 @@ define void @f(ptr %A) { ; DISABLE-CHECK-NEXT: Src: store i8 1, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.0, align 1 ; DISABLE-CHECK-NEXT: da analyze - none! ; DISABLE-CHECK-NEXT: Src: store i8 1, ptr %idx.0, align 1 --> Dst: store i8 2, ptr %idx.1, align 1 -; DISABLE-CHECK-NEXT: da analyze - output [<>]! +; DISABLE-CHECK-NEXT: da analyze - output [*|<]! ; DISABLE-CHECK-NEXT: Src: store i8 2, ptr %idx.1, align 1 --> Dst: store i8 2, ptr %idx.1, align 1 ; DISABLE-CHECK-NEXT: da analyze - output [*]! ; 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: {{.*}} diff --git a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll index b20f1c8d55f18..869de0f5ab312 100644 --- a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll +++ b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll @@ -23,7 +23,7 @@ define void @symbolic_rdiv_addrec_wrap(ptr %A) { ; 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: 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 - output [*]! ; _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
