LLVM/project b9d70a5 — llvm/lib/Transforms/Scalar GVNHoist.cpp, llvm/test/Transforms/GVNHoist pr30216.ll hoist.ll

[GVNHoist] Replace getDefiningAccess with getClobberingMemoryAccess (#240217)

getDefiningAccess in safeToHoistLdSt returns the nearest stores if we
don't query AA result by using getClobberingMemoryAccess. This reduce
the opportunity for optimization as isLiveOnEntryDef returns false
without updating in safeToHoistLdSt.

In the example (See Closes item): after hoisting left.a and left.b,
getDefiningAccess returns `store q` before.

As a result, we replace getDefiningAccess with getClobberingMemoryAccess
and then we can safely remove ensureOptimizedUses now.

Assisted-by: Claude # Test
Closes: #221578
DeltaFile
+47-0llvm/test/Transforms/GVNHoist/hoist.ll
+9-7llvm/test/Transforms/GVNHoist/pr30216.ll
+1-4llvm/lib/Transforms/Scalar/GVNHoist.cpp
+57-113 files

LLVM/project 27a96b3 — clang/include/clang/AST HLSLResource.h, clang/lib/CodeGen CodeGenModule.cpp

[Hlsl][Spirv] Don't emit global variables for structs containing just resources (#234797)

For global, non-static instances of a struct containing resources, we
end up splitting these recursively into separate global variables for
each resource, and for numeric members these go into the default
$globals cbuffer.

For this change, when there's a instance of a struct (or array of)
containing only resources, skip emitting a global variable for the
struct. Before, it would emit external linkage globals of these which
would not get removed.

based on
https://github.com/llvm/wg-hlsl/blob/main/proposals/0038-resources-in-structs.md

improves #194435

assisted by: codex
DeltaFile
+28-0clang/test/CodeGenHLSL/resources/resources-in-structs-no-global.hlsl
+23-0clang/test/CodeGenHLSL/resources/resources-in-structs-static-global.hlsl
+9-3clang/lib/CodeGen/CodeGenModule.cpp
+2-3clang/lib/Sema/SemaHLSL.cpp
+5-0clang/include/clang/AST/HLSLResource.h
+67-65 files

LLVM/project 6af7d8c — utils/bazel/llvm-project-overlay/llvm BUILD.bazel

[bazel][llvm] Add SelectionDAGOptionsTableGen to CodeGen deps (#240498)

Fixes build failure introduced by commit 3e3ca055b0bb ("[SelectionDAG]
Declare command line options in TableGen (Part 1) (#240033)"), which
generated SelectionDAGOptions.inc from SelectionDAGOptions.td.

Add gentbl_cc_library target SelectionDAGOptionsTableGen and add it to
CodeGen deps.

LLM-aided
DeltaFile
+10-0utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
+10-01 files

LLVM/project e79250d — lldb/packages/Python/lldbsuite/test lldbtest.py

[lldb][test] Lazily generate ValueCheck error messages (#240484)

We spend a large amount of time in the test suite preparing the error
messages for failed asserts. All of this time is spent on formatting
SBValue objects that we are checking, so we can print their textual
representation in the assert error.

This patch uses the typical Python lazy string class trick to make this
evaluation lazy. This speeds up several tests by a small amount, and
some tests like `TestDataFormatterGenericDeque.py` get their runtime cut
from 30s to 7s.
DeltaFile
+13-4lldb/packages/Python/lldbsuite/test/lldbtest.py
+13-41 files

LLVM/project 50e726e — lldb/source/Register/Arch RegisterInfos_ppc64le.h

[lldb] Correct the PowerPC VSX register 60 description (#240092)
DeltaFile
+1-1lldb/source/Register/Arch/RegisterInfos_ppc64le.h
+1-11 files

LLVM/project 1da136e — lldb/source/Register/Arch RegisterContext_mips.h RegisterInfos_mips64.h

[lldb] Remove unused MIPS register descriptions (#239081)

Remove the unused MIPS and MIPS64 register-info tables and Linux
register-buffer structures. Keep the numbering definitions used by the
instruction emulators.
DeltaFile
+0-305lldb/source/Register/Arch/RegisterInfos_mips.h
+0-223lldb/source/Register/Arch/RegisterInfos_mips64.h
+0-131lldb/source/Register/Arch/RegisterContext_mips.h
+0-6593 files

LLVM/project 6ccbbe6 — libc/cmake/modules LLVMLibCTestRules.cmake, libc/src/__support/math CMakeLists.txt

[libc][cmake] Collapse extra blank lines in cmake_format (#240295)

Updated cmake_format.py to collapse consecutive blank lines to a single
blank line and strip leading blank lines at the start of files. Applied
the updated formatter across libc CMake files.

Assisted-by: Automated tooling, human reviewed.
DeltaFile
+56-0libc/utils/cmake_format_test.py
+5-4libc/utils/cmake_format.py
+0-5libc/src/__support/math/CMakeLists.txt
+0-3libc/test/src/math/smoke/CMakeLists.txt
+0-3libc/src/math/generic/CMakeLists.txt
+0-3libc/cmake/modules/LLVMLibCTestRules.cmake
+61-1816 files not shown
+61-3522 files

FreeBSD/src f594944 — krb5/usr.bin/kvno Makefile, krb5/usr.bin/sclient Makefile

krb5: Don't include libsys in LIBADD

This has the curious effect of placing libsys before libc in the link
order even though libc links against libsys.  While this happens to
work currently, it is fragile and fails to link properly in some edge
cases.

Sponsored by:   AFRL, DARPA
Differential Revision:  https://reviews.freebsd.org/D60724
DeltaFile
+1-1krb5/usr.sbin/sserver/Makefile
+1-1krb5/usr.sbin/sim_server/Makefile
+1-1krb5/usr.sbin/gss-server/Makefile
+1-1krb5/usr.bin/sim_client/Makefile
+1-1krb5/usr.bin/sclient/Makefile
+1-1krb5/usr.bin/kvno/Makefile
+6-610 files not shown
+16-1616 files

FreeBSD/src 9e99355 — lib/libpam/modules/pam_krb5 Makefile

pam_krb5: Append to CFLAGS instead of replacing

Obtained from:  CheriBSD
Sponsored by:   AFRL, DARPA
Differential Revision:  https://reviews.freebsd.org/D60723
DeltaFile
+1-1lib/libpam/modules/pam_krb5/Makefile
+1-11 files

LLVM/project 14fc598 — llvm/lib/Transforms/Scalar ConstraintElimination.cpp, llvm/test/Transforms/ConstraintElimination sadd-with-overflow.ll minmax.ll

[ConstraintElim] Split signed min/max across their operands when checking a compare

The existing constraint systems only record the bounds that hold for both
operands of a min/max (smax(a, b) >= a and >= b, smin(a, b) <= a and <= b). The
other direction is a disjunction, which cannot be recorded as a fact. When a
compare of signed decompositions involves a min/max result, split it into its
operands: the decomposition is monotonic in that result, so it is the max or min
of its values on each side, and the relation holds for all or for either side
respectively.

https://alive2.llvm.org/ce/z/zsGkJ-
DeltaFile
+366-3llvm/test/Transforms/ConstraintElimination/minmax.ll
+111-0llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+4-8llvm/test/Transforms/ConstraintElimination/sadd-with-overflow.ll
+481-113 files

LLVM/project c026611 — llvm/lib/Transforms/Scalar ConstraintElimination.cpp, llvm/test/Transforms/ConstraintElimination ssub-with-overflow.ll sadd-with-overflow.ll

[ConstraintElim] Prove sadd/ssub.with.overflow cannot overflow from the exact sum

Decompose the operands and show that the sum lies in the range of the type. This
handles patterns like A + (B - A), as well as sums involving signed min/max
results, which are split across their respective operands using monotonicity
(for example start + smax(end - start - 1, 0) <= end).

https://alive2.llvm.org/ce/z/ze8LCk
DeltaFile
+634-0llvm/test/Transforms/ConstraintElimination/sadd-with-overflow.ll
+159-3llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+100-0llvm/test/Transforms/ConstraintElimination/ssub-with-overflow.ll
+893-33 files

LLVM/project ac8062d — llvm/lib/Transforms/Scalar ConstraintElimination.cpp, llvm/test/Transforms/ConstraintElimination add-nsw.ll sadd-with-overflow.ll

[ConstraintElim] A signed sum of operands with opposite signs cannot wrap

If one operand is known non-negative and the other non-positive, the signed
sum is between them, so it cannot overflow.

https://alive2.llvm.org/ce/z/ZF5Yqr
DeltaFile
+62-0llvm/test/Transforms/ConstraintElimination/sadd-with-overflow.ll
+19-0llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+3-6llvm/test/Transforms/ConstraintElimination/add-nsw.ll
+84-63 files

FreeBSD/src 17a4269 — .github/workflows style.yml cross-bootstrap-tools.yml

.github: Update actions version to 7

version 4 raises warnings when run as the runners force it to use Node
24 instead of Node 20.  version 5 defaults to Node 24, but version 7
is the current version.

Reviewed by:    emaste
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2477
DeltaFile
+1-1.github/workflows/style.yml
+1-1.github/workflows/cross-bootstrap-tools.yml
+2-22 files

LLVM/project 7083522 — clang/include/clang/Basic HLSLIntrinsics.td, clang/lib/Sema SemaHLSL.cpp

Reapply `WaveMultiPrefixCountBits` with test fix (#239503)

Reapply #238132 after revert #239439. Add `WaveMultiPrefixCountBits`
with DirectX lowering. SPIR-V calls report that the builtin is not
supported on that target.

Keep the Clang IR checks in
`clang/test/CodeGenHLSL/builtins/WaveMultiPrefixCountBits.hlsl`. Put the
DXIL checks in `llvm/test/CodeGen/DirectX/WaveMultiPrefixCountBits.ll`,
where the existing directory configuration skips them when DirectX is
not built. Cover dynamic, true, and false inputs.

The first commit restores the original change. The second commit adds
the test fix. This avoids the unconditional DirectX-only command that
was present in the Clang test.

Fixes #99211.

Assisted by: GitHub Copilot

    [4 lines not shown]
DeltaFile
+63-0clang/test/SemaHLSL/BuiltIns/WaveMultiPrefixCountBits-errors.hlsl
+32-10clang/lib/Sema/SemaHLSL.cpp
+34-0clang/test/CodeGenHLSL/builtins/WaveMultiPrefixCountBits.hlsl
+30-0llvm/test/CodeGen/DirectX/WaveMultiPrefixCountBits.ll
+9-0llvm/lib/Target/DirectX/DXIL.td
+9-0clang/include/clang/Basic/HLSLIntrinsics.td
+177-106 files not shown
+210-1012 files

LLVM/project bb20896 — lldb/test/API/python_api/target TestTargetAPI.py

[lldb][test] Remove dead Continue calls from TestTargetAPI.py (#239030)

This test launches a program that has no breakpoint, which causes the
launch to stall until the process exists. Then, we call Continue several
times with a dead process. The Continue with a exited process does
nothing right now aside from stalling for 5 seconds.

This removes the dead Continue calls that were just copy-pasted from the
other tests. This removes the 20s of waiting, and cuts the test time
from 27s to 7s.
DeltaFile
+0-4lldb/test/API/python_api/target/TestTargetAPI.py
+0-41 files

LLVM/project 0d80555 — lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string TestLibcxxStringRev3.py TestLibcxxStringRev2.py

[lldb][test] Split up LibcxxStringSimulator test [NFC] (#239017)

TestDataFormatterLibcxxStringSimulator.py is by far the slowest test in
LLDB and runs for about 90s on the bot, which more than twice as long as
the second slowest test (TestTargetAPI with 38s). There isn't anything
wrong with the test itself, and I don't see anything we can easily
optimize.

Instead, this patch splits up TestDataFormatterLibcxxStringSimulator.py
into several tests that each test just one libcxx revision. This way we
can run the different subtests in parallel, which is beneficial on
machines with many cores.
DeltaFile
+0-43lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestDataFormatterLibcxxStringSimulator.py
+40-0lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/libcxx_string_simulator.py
+10-0lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestLibcxxStringRev3.py
+10-0lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestLibcxxStringRev2.py
+10-0lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestLibcxxStringRev1.py
+10-0lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/string/TestLibcxxStringRev0.py
+80-432 files not shown
+100-438 files

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

Keep the condition key when a match_any WHEN clause omits its directive

The unguarded candidate of a match_any WHEN clause keeps its condition
key when the clause has a directive, but not when it omits one. A
selector with a key is then never a strict subset of one without, so
with

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

TASKWAIT was also selected when `a` is false. Give both unguarded
candidates the key, so the first is again a strict subset of the second
and nothing is selected when `a` is false.

    [9 lines not shown]
DeltaFile
+60-0flang/test/Lower/OpenMP/metadirective-user.f90
+8-2flang/lib/Semantics/openmp-utils.cpp
+68-22 files

LLVM/project 1fd57eb — llvm/test/Transforms/ConstraintElimination transfer-samesign-facts.ll

use assume, drop entry block labels
DeltaFile
+14-50llvm/test/Transforms/ConstraintElimination/transfer-samesign-facts.ll
+14-501 files

LLVM/project 7601203 — llvm/lib/Transforms/Vectorize VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize early-exit-tail-folding.ll

[VPlan] Remove header masks whose tail lanes aren't used

Replace a use of header-mask && x with x if the user, transitively
through freeze, logical-and, not and mask.beforefirst(freeze ...), only
reaches masks that are and'ed with the header mask again. The header
mask is a prefix and lane i of mask.beforefirst only depends on lanes
0..i, so the lanes outside of the header mask are never used.

This avoids the i1 vp.merge that EVL tail folding needs for the inner
header mask, e.g. in the early exit mask.beforefirst(freeze(header-mask
&& c)) and in switch default edges.
DeltaFile
+39-0llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+2-4llvm/test/Transforms/LoopVectorize/early-exit-tail-folding.ll
+2-4llvm/test/Transforms/LoopVectorize/RISCV/early_exit_with_stores.ll
+2-4llvm/test/Transforms/LoopVectorize/RISCV/early-exit.ll
+1-2llvm/test/Transforms/LoopVectorize/RISCV/zvl1024b-crash.ll
+46-145 files

LLVM/project ab06500 — llvm/lib/Transforms/Vectorize LoopVectorizationLegality.cpp LoopVectorize.cpp, llvm/test/Transforms/LoopVectorize early_exit_store_legality.ll early-exit-tail-folding.ll

[VPlan] Allow tail folding early exits with side effects

Continues the work in #179595.

This allows us to tail fold e.g. the following loop:

```c
extern char a[1024], b[1024], c[1024], y[1024];
void two_guards(void) {
  for (int i = 0; i < 1000; i++) {
    if (a[i] == 0)
      break;
    if (b[i] > 3) {
      if (c[i] < 9)
        y[i] = 1;
    }
  }
}
```

    [30 lines not shown]
DeltaFile
+40-70llvm/test/Transforms/LoopVectorize/early-exit-tail-folding.ll
+24-41llvm/test/Transforms/LoopVectorize/RISCV/early_exit_with_stores.ll
+18-35llvm/test/Transforms/LoopVectorize/RISCV/early-exit.ll
+24-0llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+0-7llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+2-2llvm/test/Transforms/LoopVectorize/early_exit_store_legality.ll
+108-1552 files not shown
+111-1578 files

LLVM/project 038efa3 — llvm/test/Transforms/LoopVectorize early-exit-tail-folding.ll

Precommit tests
DeltaFile
+214-153llvm/test/Transforms/LoopVectorize/early-exit-tail-folding.ll
+214-1531 files

LLVM/project f092f6b — llvm/test/Transforms/LoopVectorize early-exit-tail-folding-active-lane-mask.ll early-exit-tail-folding.ll, llvm/test/Transforms/LoopVectorize/RISCV early-exit.ll

Precommit tests
DeltaFile
+552-0llvm/test/Transforms/LoopVectorize/RISCV/early-exit.ll
+524-0llvm/test/Transforms/LoopVectorize/early-exit-tail-folding.ll
+65-0llvm/test/Transforms/LoopVectorize/early-exit-tail-folding-active-lane-mask.ll
+1,141-03 files

LLVM/project 5050e18 — llvm/lib/Transforms/Vectorize VPlanConstruction.cpp, llvm/test/Transforms/LoopVectorize multiple-early-exits.ll early-exit-tail-folding.ll

[VPlan] Support tail folding uncountable early exits

Enables the first step towards #179595. After #237254, the MaskedHandleExitInVectorLoop early exit style uses the CFG to handle masking for early exit loops. This allows it to compose with tail folding which is also handled via the CFG in #176143.

This allows us to tail fold the following loop:

```c
extern char x[256];
int f(char * restrict y) {
  for (int i = 0; i < 256; i++) {
    if (x[i] == 0)
      return i;
  }
  return -1;
}
```

Into this on RISC-V:


    [18 lines not shown]
DeltaFile
+91-164llvm/test/Transforms/LoopVectorize/RISCV/early-exit-live-out.ll
+77-149llvm/test/Transforms/LoopVectorize/RISCV/early-exit.ll
+54-105llvm/test/Transforms/LoopVectorize/early-exit-tail-folding.ll
+108-16llvm/test/Transforms/LoopVectorize/multiple-early-exits.ll
+20-37llvm/test/Transforms/LoopVectorize/RISCV/sink-to-early-exit.ll
+32-18llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+382-4894 files not shown
+414-49710 files

LLVM/project 0834079 — llvm/lib/Transforms/Vectorize VPlanTransforms.cpp VPlanLowering.cpp

[VPlan] Lower MaskedCond earlier in the predicator. NFC

A MaskedCond is used to logically-and some condition with the current block in mask.

It's currently lowered in convertToConcreteRecipes but we can just do it earlier in VPlanPredicator, which removes the need for the separate fold in simplifyRecipe. It also enables more logical-and simplifications earlier on.
DeltaFile
+13-1llvm/lib/Transforms/Vectorize/VPlanPredicator.cpp
+0-11llvm/lib/Transforms/Vectorize/VPlanLowering.cpp
+0-5llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+13-173 files

LLVM/project 2956754 — llvm/lib/Transforms/Vectorize VPlanConstruction.cpp LoopVectorize.cpp

[VPlan] Use vputils::findCanonicalIVIncrement in more places. NFC

In a future patch we want to enable more scenarios with early exits and tail folding. In these scenarios the terminator will no longer be a BranchOnCount/BranchOnCond but a BranchOnTwoConds, so a bunch of canonical IV matchers break. Use vputils::findCanonicalIVIncrement instead since it searches the users of the canonical IV instead of looking at the terminator.
DeltaFile
+7-13llvm/lib/Transforms/Vectorize/VPlanEVLTailFolding.cpp
+2-9llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+2-8llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+11-303 files

LLVM/project 2f293f8 — llvm/lib/Transforms/Vectorize VPlan.h VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize early_exit_with_stores.ll

[VPlan] Allow early exit loops with side effects by masking in the vector loop.

When all blocks with side effects are dominated by every early exit, we can vectorize the loop if we mask off any lanes past the exit. We can do this with control flow:

```mermaid
flowchart TD
  header --> exiting
  exiting -->| exit mask | sideeffects --> latch --> latch.split
  exiting -->| !exit mask | latch.split
```

For every early exiting block we add a branch to the latch on `!mask.beforefirst(exitcond)`. This is implemented in UncountableExitStyle::ReadOnly which is now renamed to MaskedHandleExitInVectorLoop.

This is a complementary exit style to MaskedHandleExitInScalarLoop. If any of the side effects aren't dominated by the early exit it still falls back to the scalar loop style, which is why none of the existing early exit side effect tests changed. Masking in loop is profitable for RISC-V and I'm assuming it's also profitable for AArch64 too, but if not then we can add a TTI hook for a preferred exit style.
DeltaFile
+59-76llvm/test/Transforms/LoopVectorize/early_exit_with_stores.ll
+86-33llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+10-9llvm/test/Transforms/LoopVectorize/X86/early_exit_with_stores.ll
+8-7llvm/test/Transforms/LoopVectorize/RISCV/early_exit_with_stores.ll
+5-4llvm/lib/Transforms/Vectorize/VPlan.h
+3-2llvm/unittests/Transforms/Vectorize/VPlanVerifierTest.cpp
+171-1312 files not shown
+176-1338 files

LLVM/project 1eba0e7 — llvm/test/Transforms/LoopVectorize early_exit_with_stores.ll

Precommit tests
DeltaFile
+221-0llvm/test/Transforms/LoopVectorize/early_exit_with_stores.ll
+221-01 files

LLVM/project 1508af5 — llvm/lib/Transforms/Vectorize VPlanVerifier.cpp VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize predicated-single-exit.ll predicated-early-exits-interleave.ll

[VPlan] Preserve SSA in early exit loops

MaskedCond is used to logically-and the condition to early exit with the current block in-mask. However because we use it in the latch block where the condition isn't defined on all paths, we have to workaround it not being in SSA in the verifier.

This fixes this by using reconstructSSA added in #212209 to preserve SSA in both the exit conditions and live outs in the exit blocks. It also means we get the right exit condition without MaskedCond and allows us to remove the MaskedCond exceptions in the verifier. MaskedCond is still kept since a followup PR will still use it.

One subtle point is that we need to freeze any branch conditions. Any lanes after and including the early exiting lane might contain poison and we can have branches on those poison lanes that didn't we didn't previously branch on in the scalar loop.

There's no miscompile on main today because we coincidentally don't keep SSA so exit conditions are read directly without being polluted by poison stemming from a branch past the early exit. But in this PR the exit conditions are polluted and we can end up with poison in the condition operand of a select, which causes an undefined result for AnyOf even if it freezes its operand. The poison in the branch will also cause problems in future if we decide to preserve uniform control flow and emit branches instead of blends. The exit_cond_merged_after_poison_branch test illustrates this.
DeltaFile
+156-36llvm/test/Transforms/LoopVectorize/predicated-multiple-exits.ll
+24-16llvm/test/Transforms/LoopVectorize/predicated-early-exits-interleave.ll
+26-9llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+1-18llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
+12-6llvm/test/Transforms/LoopVectorize/predicated-single-exit.ll
+219-855 files

LLVM/project 5487307 — llvm/lib/Transforms/Vectorize VPlanPredicator.cpp, llvm/test/Transforms/LoopVectorize uniform-blend.ll select-cmp-blend-chain.ll

[VPlan] Peek through nested phi incoming values in computeBlendMasks
DeltaFile
+495-0llvm/test/Transforms/LoopVectorize/predicator.ll
+389-6llvm/test/Transforms/LoopVectorize/VPlan/predicator.ll
+80-11llvm/lib/Transforms/Vectorize/VPlanPredicator.cpp
+81-0llvm/test/Transforms/LoopVectorize/find-last.ll
+13-3llvm/test/Transforms/LoopVectorize/select-cmp-blend-chain.ll
+3-12llvm/test/Transforms/LoopVectorize/uniform-blend.ll
+1,061-326 files

LLVM/project 28674c6 — llvm/lib/Transforms/Vectorize VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize blend-i1.ll

[VPlan] Simplify BLEND X/M, false, ..., false -> M && X

If an i1 blend has false for all but one incoming value, then we can simplify this to the one non-false value. Blends by construction never have any overlapping mask values, so we don't need to worry about the order as the masks can't "shortcut" each other.
DeltaFile
+13-0llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+3-8llvm/test/Transforms/LoopVectorize/blend-i1.ll
+16-82 files