LLVM/project 5a26fe4 — lld/test/MachO cstring-dedup.s

[lld][MachO][NFC] Don't let the output path trip cstring-dedup.s's check-not (#232631)

The __cstring check uses --implicit-check-not foo/bar, but llvm-objdump
prints the input file's full path first. When that path contains "bar"
(e.g. /home/isanbard/...), the test fails. Pass --no-leading-headers so
the path isn't printed. That also suppresses the "Contents of
(__TEXT,__cstring) section" line, so drop that STR check; --section
already restricts the output to __cstring.

Assisted-by: Claude Opus 5.5
DeltaFile
+1-2lld/test/MachO/cstring-dedup.s
+1-21 files

LLVM/project 99121aa — flang/lib/Semantics openmp-utils.cpp, flang/test/Lower/OpenMP metadirective-user.f90

[flang][OpenMP] Don't treat different runtime conditions as subsets

When two METADIRECTIVE candidates have the same score and one selector is
a strict subset of the other, the superset wins. Flang ranks every
runtime condition with the same property, so isStrictSubset saw
different conditions as the same:

  !$omp metadirective &
  !$omp& when(user={condition(a)}, &
  !$omp&      implementation={vendor(score(4): llvm)}: taskyield) &
  !$omp& when(user={condition(b)}, device={kind(host)}, &
  !$omp&      implementation={vendor(score(3): llvm)}: taskwait)

Both candidates score 5, and `b` was tested first, so TASKWAIT ran when
both conditions were true. Neither selector is a subset of the other, so
clause order should decide.

This patch adds a UserCondition key to VariantMatchInfo, and
isStrictSubset requires equal keys when the first selector has a

    [9 lines not shown]
DeltaFile
+77-0flang/test/Lower/OpenMP/metadirective-user.f90
+37-0llvm/unittests/Frontend/OpenMPContextTest.cpp
+13-3flang/lib/Semantics/openmp-utils.cpp
+7-0llvm/lib/Frontend/OpenMP/OMPContext.cpp
+4-0llvm/include/llvm/Frontend/OpenMP/OMPContext.h
+138-35 files

LLVM/project 690d861 — llvm/lib/MC MCLFI.cpp, llvm/test/MC/AArch64/LFI abi-note.s

[LFI][MC] Mark .note.LFI.ABI section with SHF_GNU_RETAIN (#233164)

Sections in a COMDAT group are subject to garbage collection during
linking when `--gc-sections` is enabled (even SHT_NOTE sections).
Because nothing references `.note.LFI.ABI.<arch>`, the deduplicated note
was previously removed by the linker with `-Wl,--gc-sections`.

Add `SHF_GNU_RETAIN` to `.note.LFI.ABI.<arch>` so that linkers recognize
it as a GC root while still deduplicating it via COMDAT.

Fixes #233086.
DeltaFile
+4-3llvm/lib/MC/MCLFI.cpp
+2-2llvm/test/MC/X86/LFI/abi-note.s
+2-2llvm/test/MC/AArch64/LFI/abi-note.s
+8-73 files

LLVM/project 6f63a4f — mlir/lib/Dialect/Arith/IR ArithCanonicalization.td, mlir/test/Dialect/Arith canonicalize.mlir

[mlir][arith] Drop nsw when canonicalizing shifted truncations
DeltaFile
+54-0mlir/test/Dialect/Arith/canonicalize.mlir
+12-2mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
+66-22 files

LLVM/project b921a87 — libc/shared/math/static_rounding exp2f.h, libc/src/__support/math exp2f_integer_eval.h

[libc][math] Add integer-only implementation for exp2f.

- Correctly rounded to all rounding mode (statically).
- Share core computations with expf integer-only static-rounding version
- Optimize for code size.

Assisted-by: Gemini for analysis and refactoring.
DeltaFile
+131-0libc/src/__support/math/exp2f_integer_eval.h
+44-17libc/test/src/math/exp2f_test.cpp
+39-13libc/test/src/math/smoke/exp2f_test.cpp
+32-1utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+30-0libc/shared/math/static_rounding/exp2f.h
+28-0libc/test/shared/shared_math_test.cpp
+304-319 files not shown
+358-3315 files

LLVM/project eefdf40 — libc/src/__support/FPUtil CMakeLists.txt fp_bitwise.h, libc/test/src/__support/FPUtil CMakeLists.txt fp_bitwise_test.cpp

[libc] Add floating-point bitwise operations to FPUtil.

Add `fp_and`, `fp_or`, `fp_xor`, `fp_andnot`, and `fp_not` to
`src/__support/FPUtil/fp_bitwise.h` to perform bitwise operations on
floating-point values directly in FP/SIMD registers when SSE2 or AArch64 NEON
is available, avoiding GPR round-trips.

DeltaFile
+189-0libc/src/__support/FPUtil/fp_bitwise.h
+135-0libc/test/src/__support/FPUtil/fp_bitwise_test.cpp
+13-0utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+13-0libc/test/src/__support/FPUtil/CMakeLists.txt
+13-0libc/src/__support/FPUtil/CMakeLists.txt
+12-0utils/bazel/llvm-project-overlay/libc/test/src/__support/FPUtil/BUILD.bazel
+375-06 files

LLVM/project 4a5df28 — mlir/lib/Dialect/Arith/IR ArithOps.cpp, mlir/test/Dialect/Arith canonicalize.mlir

[mlir][arith] Fix overflow flags when folding nested truncations
DeltaFile
+52-0mlir/test/Dialect/Arith/canonicalize.mlir
+5-3mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+57-32 files

LLVM/project d1c8cef — mlir/lib/Conversion/ArithToLLVM ArithToLLVM.cpp, mlir/test/Conversion/ArithToLLVM arith-to-llvm.mlir

[mlir][ArithToLLVM] Preserve defined signed remainder by -1

Select a zero dividend when the divisor is -1 before emitting llvm.srem.
This preserves arith.remsi(INT_MIN, -1) == 0 without introducing LLVM UB.
Support scalar and vector operands, including multidimensional vectors.

Add regression coverage to the existing ArithToLLVM conversion test.
Tests were not run as requested.
DeltaFile
+85-11mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
+57-2mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+142-132 files

LLVM/project fee4778 — libc/src/__support/mathvec tanpif.h tanhf.h, libc/src/string string_length.h

[libc][NFC] Fix typo 'implemenation' in comments (#233089)

Fix the misspelling "implemenation" -> "implementation" in comments in
   libc/src/__support/mathvec/*.h and libc/src/string/string_length.h.
   No functional change.
DeltaFile
+1-1libc/src/string/string_length.h
+1-1libc/src/__support/mathvec/tanpif.h
+1-1libc/src/__support/mathvec/tanhf.h
+1-1libc/src/__support/mathvec/tanf.h
+1-1libc/src/__support/mathvec/sqrtf.h
+1-1libc/src/__support/mathvec/sinpif.h
+6-626 files not shown
+32-3232 files

LLVM/project ac3816e — lldb/packages/Python/lldbsuite/test/tools/lldb_dap session.py types.py, lldb/test/API/tools/lldb-dap/startDebugging TestDAP_startDebugging.py

[lldb-dap] Migrate the startDebugging tests (#232753)

Port TestDAP_startDebugging to the new test infrastructure
DeltaFile
+43-44lldb/test/API/tools/lldb-dap/startDebugging/TestDAP_startDebugging.py
+25-9lldb/packages/Python/lldbsuite/test/tools/lldb_dap/types.py
+16-0lldb/packages/Python/lldbsuite/test/tools/lldb_dap/session.py
+84-533 files

LLVM/project d42e422 — lldb/test/API lit.cfg.py

[lldb-dap][test] Propagate the LLDBDAP_RUN_AS_SERVER environment (#232792)

It previously only worked when calling `lldb-dotest` directly.
DeltaFile
+4-0lldb/test/API/lit.cfg.py
+4-01 files

LLVM/project 8fa94d0 — llvm/test/tools/llvm-reduce run-ir-passes.ll, llvm/tools/llvm-reduce llvm-reduce.cpp

[llvm-reduce] Parse library options into LLVMContext (#233162)

cl::ParseCommandLineOptions sets library options in T::Global,
no longer read by LibraryOptionsContext::get since #233044.
Switch to cl::parseCommandLineOptions.
DeltaFile
+15-1llvm/test/tools/llvm-reduce/run-ir-passes.ll
+3-3llvm/tools/llvm-reduce/llvm-reduce.cpp
+18-42 files

LLVM/project 8045270 — mlir/lib/Conversion/ArithToLLVM ArithToLLVM.cpp, mlir/test/Conversion/ArithToLLVM arith-to-llvm.mlir

[mlir][ArithToLLVM] Preserve defined signed remainder by -1

Select a zero dividend when the divisor is -1 before emitting llvm.srem.
This preserves arith.remsi(INT_MIN, -1) == 0 without introducing LLVM UB.
Support scalar and vector operands, including multidimensional vectors.

Add regression coverage to the existing ArithToLLVM conversion test.
Tests were not run as requested.
DeltaFile
+85-11mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
+57-2mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+142-132 files

LLVM/project 88787ac — libcxx/include CMakeLists.txt module.modulemap.in, libcxx/include/__execution is_execution_policy.h execution_policies.h

[libc++] Granularize <execution> (#229315)

Move execution policies into `__execution/execution_policies.h`
to separate them from upcoming C++26 sender/receiver components.

Also move `__type_traits/is_execution_policy.h` into `__execution`
directory.

This is a prerequisite for #229095.
DeltaFile
+131-0libcxx/include/__execution/execution_policies.h
+7-112libcxx/include/execution
+0-59libcxx/include/__type_traits/is_execution_policy.h
+59-0libcxx/include/__execution/is_execution_policy.h
+2-4libcxx/include/module.modulemap.in
+2-1libcxx/include/CMakeLists.txt
+201-17621 files not shown
+222-19727 files

LLVM/project 8edfb8e — clang/test/OpenMP declare_variant_construct_target.c, flang/test/Lower/OpenMP metadirective-construct.f90

[OpenMP] Fix construct context at TARGET and repeated-construct subsets

OMPContext has two bugs in how construct selectors are matched. Both can
select the wrong variant:

- The construct context should start at the innermost enclosing TARGET,
  but Clang and Flang add every enclosing construct. Inside a TARGET
  region nested in a PARALLEL, construct={parallel} matched the outer
  PARALLEL. OMPContext::addTrait now drops the constructs recorded before
  a target trait.
- A selector that only repeats a construct, such as
  construct={parallel do, parallel} over construct={parallel do}, adds no
  property. isStrictSubset required fewer properties, so a score tie
  between the two fell back to clause order. A shorter ordered construct
  sequence now also makes a strict subset. If the shorter selector has a
  user condition, or an ISA name the longer one lacks, the tie still falls
  back to clause order, since different conditions or ISA names share one
  property.


    [9 lines not shown]
DeltaFile
+163-0llvm/unittests/Frontend/OpenMPContextTest.cpp
+131-0flang/test/Lower/OpenMP/metadirective-construct.f90
+27-16llvm/lib/Frontend/OpenMP/OMPContext.cpp
+31-0clang/test/OpenMP/declare_variant_construct_target.c
+6-0llvm/include/llvm/Frontend/OpenMP/OMPContext.h
+358-165 files

LLVM/project 11bf324 — libc/src/__support/math CMakeLists.txt expf_double_eval.h, utils/bazel/llvm-project-overlay/libc BUILD.bazel

Fix overflow bounds for expf float and double eval.
DeltaFile
+12-7libc/src/__support/math/expf_float_eval.h
+7-4libc/src/__support/math/expf_double_eval.h
+2-0utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+2-0libc/src/__support/math/CMakeLists.txt
+23-114 files

LLVM/project c77b3fd — mlir/lib/Dialect/Arith/IR ArithCanonicalization.td ArithOps.cpp, mlir/test/Dialect/Arith canonicalize.mlir

[mlir][arith] Check overflow when reassociating integer constants

Folding (x + 100 nsw) + 100 nsw to x + (-56) nsw in i8 introduces
poison for inputs such as x = -100 that were previously defined.

Check signed and unsigned overflow when folding constants in the
add/sub/mul reassociation patterns. Retain each common nsw/nuw flag
only when its constant arithmetic does not overflow. Keep index
behavior unchanged for a separate fix.

Add regression coverage for invalid and preserved overflow flags.
DeltaFile
+269-0mlir/test/Dialect/Arith/canonicalize.mlir
+37-1mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+25-10mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
+331-113 files

LLVM/project 242af47 — mlir/lib/Dialect/Arith/IR ArithCanonicalization.td ArithOps.cpp, mlir/test/Dialect/Arith canonicalize.mlir

[mlir][arith] Check overflow when reassociating integer constants

Folding (x + 100 nsw) + 100 nsw to x + (-56) nsw in i8 introduces
poison for inputs such as x = -100 that were previously defined.

Check signed and unsigned overflow when folding constants in the
add/sub/mul reassociation patterns. Retain each common nsw/nuw flag
only when its constant arithmetic does not overflow. Keep index
behavior unchanged for a separate fix.

Add regression coverage for invalid and preserved overflow flags.
DeltaFile
+269-0mlir/test/Dialect/Arith/canonicalize.mlir
+37-1mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+25-10mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
+331-113 files

LLVM/project 2a7e35d — llvm/lib/Target/AArch64 AArch64ISelLowering.cpp, llvm/test/CodeGen/AArch64 smull-uzp1-be.ll

[SelectionDAG][AArch64]Use NVCAST instead of BITCAST in tryCombineMULLWithUZP1  (#231584)

```
t67: v2i32 = truncate t15
t54: v2i32 = extract_subvector t7, Constant:i64<2>
t68: v2i64 = AArch64ISD::SMULL t67, t54
=>
t75: v4i32 = bitcast t15
t76: v4i32 = AArch64ISD::UZP1 undef:v4i32, t75
t77: v2i32 = extract_subvector t76, Constant:i64<2>
t68: v2i64 = AArch64ISD::SMULL t77, t54
```

This pattern is not correct in big endian.

Fix https://github.com/llvm/llvm-project/issues/231574
DeltaFile
+138-0llvm/test/CodeGen/AArch64/smull-uzp1-be.ll
+2-2llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+140-22 files

LLVM/project eb0f076 — clang/lib/AST StmtProfile.cpp, clang/test/OpenMP condition_identity.c condition_identity.cpp

Fix remaining condition identity collisions and mismatches

Follow up on #233038 by preserving Clang's substituted template bindings
when normalizing condition roots. Profile written array bounds through
TypeLoc, including typedef definitions and adjusted function parameters.
Retain bindings in function types and qualified member references, and
include template-specialization qualifiers and array-trait dimensions.
Use the same type normalization for qualified references and aliases.

Normalize Flang intrinsic declarations and implied-DO indices independently
of their scope-local symbol addresses. Preserve resolved procedure identity
and distinguish implied-DO bindings by nesting and type, allowing identical
conditions to participate in the strict-subset tie-break again.

Correct the Clang runtime symbol checks and declare-variant candidate
order. Exercise fresh matching after PCH loading, and add paired distinct
and identical expression controls. Update the implicit-NOTHING test to
check its guarded selection and barrier fallback under source-selector
subset comparison.
DeltaFile
+254-5clang/test/OpenMP/condition_identity.cpp
+140-18clang/lib/AST/StmtProfile.cpp
+68-27clang/test/OpenMP/condition_identity.c
+28-3flang/lib/Semantics/openmp-utils.cpp
+29-0flang/test/Lower/OpenMP/metadirective-condition-identity.f90
+12-4flang/test/Lower/OpenMP/metadirective-user.f90
+531-571 files not shown
+535-597 files

LLVM/project 5d53d8d — llvm/tools/dsymutil DebugMap.cpp DebugMap.h

[dsymutil] Adjust the debug map object filter (#219846)
DeltaFile
+14-30llvm/tools/dsymutil/DebugMap.h
+4-5llvm/tools/dsymutil/DebugMap.cpp
+18-352 files

LLVM/project f5a8439 — llvm/lib/Transforms/Vectorize LoopVectorizationLegality.cpp, llvm/test/Transforms/LoopVectorize/AArch64 sve2-histcnt.ll

[LV] Check stores to invariant addresses before handling unsafe deps (#233142)

canVectorizeMemory validates stores to loop-invariant addresses only
after handling the case where LAA reports the loop as unsafe. The early
exit checking canVectorizeIndirectUnsafeDependences account for
histograms skipped the invariant address checks.

Reorder checks to make sure such accesses are checked even if there
histograms to fix miscompile.
DeltaFile
+4-92llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll
+22-22llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+26-1142 files

LLVM/project d594278 — clang/lib/AST StmtProfile.cpp, clang/test/OpenMP condition_identity.cpp condition_identity.c

[OpenMP] Preserve condition identity in subset ties (partial #233038)

Subset comparisons previously treated unrelated user conditions with the
same applicability trait as equal. This could select the wrong directive
when candidate scores tied. Add frontend-produced condition keys and
compare source selectors separately from their effective ranking traits.

The standalone Flang reproducer in #233038 now tests a before b and selects
TASKYIELD when both are true. The shared matcher retains the expected
strict-superset result for identical conditions and preserves precedence
when the first candidate has a higher score. This is a partial fix: known
identity defects and failing regression tests remain.

Implemented:

- Add owned condition keys and optional immutable original-selector
  snapshots to VariantMatchInfo. Normalize condition truth bits only for
  subset comparison, count condition presence once, and require matching
  known keys when a prospective subset contains a condition. Keep the

    [51 lines not shown]
DeltaFile
+211-0flang/test/Lower/OpenMP/metadirective-condition-identity.f90
+155-2flang/lib/Semantics/openmp-utils.cpp
+136-0flang/test/Lower/OpenMP/declare-variant-condition-identity.f90
+126-0clang/test/OpenMP/condition_identity.c
+91-3clang/lib/AST/StmtProfile.cpp
+93-0clang/test/OpenMP/condition_identity.cpp
+812-58 files not shown
+983-914 files

LLVM/project 22a203c — llvm/lib/Transforms/Vectorize VPlanUtils.cpp, llvm/test/Transforms/LoopVectorize/AArch64 gather-do-not-vectorize-addressing.ll

[VPlan] Don't look through FOR splices in isUsedByLoadStoreAddress. (#233141)

isUsedByLoadStoreAddress incorrectly looked through recurrence splices.
This lead to makeVPlanMemOpDecision incorrectly replicating loads
(instead of widening), while the address is converted to a single-scalar
by legacy decision.

This fixes a miscompile in the added test.
DeltaFile
+3-5llvm/test/Transforms/LoopVectorize/AArch64/gather-do-not-vectorize-addressing.ll
+4-2llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+7-72 files

LLVM/project 69547b1 — flang/lib/Semantics canonicalize-omp.cpp, flang/test/Parser/OpenMP metadirective-dirspec.f90

[flang][OpenMP] Make sure that exec METADIRECTIVE is in execution part

A METADIRECTIVE can be in either the specification part or the execution
part, depending on whether the variant directives contained in it are
declarative or executable. The OmpMetadirectiveDirective AST node can
hold any combination of variants, that is it can represent both kinds.
When the parser builds the specification part and attempts to create
an OmpMetadirectiveDirective, once it gets one it puts it in the
specification part regardless of the contents.

When an executable METADIRECTIVE is the first statement of the execution
part, it will end up in the specification part. This is an identical
situation as that for utility directives.

Recognize executable METADIRECTIVEs at the end of the specification
part and move them over to the beginning of the execution part.
DeltaFile
+55-13flang/lib/Semantics/canonicalize-omp.cpp
+4-2flang/test/Parser/OpenMP/metadirective-dirspec.f90
+59-152 files

LLVM/project bcc6ac1 — clang/lib/AST StmtProfile.cpp, clang/test/OpenMP condition_identity.cpp condition_identity.c

Create an isolated implementation branch from refreshed main and record its
base. Preserve existing local files. Keep B's diff separate from A's TARGET
normalization and construct-subset changes, and from C's scoring changes.

**Implementation approach.** Give the original condition an explicit,
frontend-produced structural identity. Preserve it across candidate copies
and transformations. Compare source selector identity separately from the
effective traits used for applicability and scoring.

Prefer an owned structural key with exact equality, or an interned equivalent
whose owner demonstrably outlives every comparison. LLVM should not depend
on Clang or Flang AST types. A hash can accelerate lookup, but hash equality
alone must never prove expression equality.

The largest design work is producing correct keys. Neither a raw source
string, a folded expression, nor the current generic Clang profile satisfies
the required contract. Complete the capture and equivalence checkpoint below
before treating a proposed key format as ready for integration.


    [266 lines not shown]
DeltaFile
+211-0flang/test/Lower/OpenMP/metadirective-condition-identity.f90
+155-2flang/lib/Semantics/openmp-utils.cpp
+136-0flang/test/Lower/OpenMP/declare-variant-condition-identity.f90
+126-0clang/test/OpenMP/condition_identity.c
+91-3clang/lib/AST/StmtProfile.cpp
+93-0clang/test/OpenMP/condition_identity.cpp
+812-58 files not shown
+983-914 files

LLVM/project 1ae7172 — llvm/test/tools/gold/X86 vectorize.ll, llvm/tools/gold gold-plugin.cpp

LLVMgold: Parse -plugin-opt options into LibraryOptionsContext (#233144)

Since #233044, the LLVMContexts that LTO creates read the defaults
instead, so passes ignore options like -vectorize-loops.

Parse them into a cl::LibraryOptionsContext and set it as
lto::Config::LibraryOptions and the PipelineTuningOptions' context, as
lld does.
DeltaFile
+13-6llvm/tools/gold/gold-plugin.cpp
+4-0llvm/test/tools/gold/X86/vectorize.ll
+17-62 files

LLVM/project 3d7d2e9 — llvm/lib/Transforms/Vectorize VPlanTransforms.h LoopVectorize.cpp

[VPlan] Only hoist from blocks guaranteed to execute in licm (NFC). (#232512)

When hoisting, licm assumes that all top-level blocks of the vector loop
region execute on every iteration, which holds as long as the region is
linearized. Check it explicitly, by only hoisting from blocks that
dominate the region's exiting block.

Currently NFC, but preparation to run LICM before linearization and
support partially linearized CFG.

PR: https://github.com/llvm/llvm-project/pull/232512
DeltaFile
+12-12llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+1-1llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+1-1llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+14-143 files

LLVM/project 25fc6f0 — llvm/test/Transforms/LoopVectorize/AArch64 gather-do-not-vectorize-addressing.ll sve2-histcnt.ll

[LV] Add test for miscompiles with histograms and scalarization. (#233135)

Add 2 additional tests for miscompile with stores to invariant addresses
and histograms and incorrectly scalarizing loads feeding a first-order
recurrence.

Also modernize check lines while touching the tests.
DeltaFile
+520-324llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll
+335-71llvm/test/Transforms/LoopVectorize/AArch64/gather-do-not-vectorize-addressing.ll
+855-3952 files

LLVM/project fab00c4 — llvm/lib/Transforms/Utils LoopUtils.cpp, llvm/test/Transforms/LoopVectorize runtime-checks-hoist.ll

[LV] Don't emit duplicate negative stride runtime checks

This speeds up x264 by 2.15% on RISC-V by avoiding a duplicate hoisted runtime check.

When hoisting runtime checks we need to check that any strides are non negative. But for a loop like

```c
for (int i = 0; i < m; i++)
  for (int j = 0; j < n; j++)
    dst[(i * stride1) + j] = src1[(i * stride2) + j] + src2[(i * stride2) + j];
```

We have the pairs [dst, src1] and [dst, src2]. Both pairs end up checking that stride1 and stride2 are non-negative in IsConflict, and because there's other values between the two checks in the chain of ors InstCombine can't deduplicate it. This PR deduplicates the stride checks.

I'm aware some of this memory check stuff is being moved into VPlan but I'm not sure what the plan is with hoisted runtime checks, so it seemed better to just fix it here first.

This helps all targets but the motivating case is this loop in x264:

```c

    [82 lines not shown]
DeltaFile
+10-10llvm/test/Transforms/LoopVectorize/AArch64/low_trip_memcheck_cost.ll
+1-5llvm/test/Transforms/LoopVectorize/runtime-checks-hoist.ll
+3-2llvm/lib/Transforms/Utils/LoopUtils.cpp
+14-173 files