LLVM/project 2f57df2 — clang/test/CodeGen systemz-charset.c

Fix typo in CHECK line in clang/test/CodeGen/systemz-charset.c (#229762)

Replace `=` with `:` to fix a typo in a CHECK line in
clang/test/CodeGen/systemz-charset.c
DeltaFile
+1-1clang/test/CodeGen/systemz-charset.c
+1-11 files

LLVM/project 3f11639 — llvm/lib/Transforms/Vectorize VPlanConstruction.cpp LoopVectorizationPlanner.h, llvm/test/Transforms/LoopVectorize invalid-costs.ll fail_vectorise_no_vplans.ll

[LV][NFC] Fix "vectorization is possible but not beneficial" message (#228024)
DeltaFile
+47-0llvm/test/Transforms/LoopVectorize/fail_vectorise_no_vplans.ll
+28-14llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+9-0llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
+6-2llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+2-2llvm/unittests/Transforms/Vectorize/VPlanTestBase.h
+3-1llvm/test/Transforms/LoopVectorize/invalid-costs.ll
+95-193 files not shown
+98-229 files

LLVM/project cd50561 — mlir/include/mlir/Dialect/OpenACC OpenACC.h, mlir/lib/Dialect/OpenACC/Transforms ACCComputeLowering.cpp ACCEmitRemarksLoop.cpp

[mlir][acc] Report independent loops not parallelized due to unstructured control flow

An independent acc loop whose body has unstructured control flow (for
example a backward GOTO) cannot be represented as a structured loop, so it
is executed sequentially. This happened silently: no remark was emitted for
the loop, and the user only saw a serial kernel without a reason.

Emit a remark for such loops stating that they are not parallelized because
their control flow could not be represented as a structured loop. This lets
users identify loops that are asserted parallel but run sequentially.

Co-Authored-By: Claude
DeltaFile
+100-0mlir/test/Dialect/OpenACC/acc-compute-lowering-unstructured.mlir
+22-0mlir/test/Dialect/OpenACC/acc-emit-remarks-loop.mlir
+16-3mlir/lib/Dialect/OpenACC/Transforms/ACCEmitRemarksLoop.cpp
+13-0mlir/lib/Dialect/OpenACC/Transforms/ACCComputeLowering.cpp
+7-0mlir/include/mlir/Dialect/OpenACC/OpenACC.h
+158-35 files

LLVM/project 743e826 — llvm/lib/Object SymbolicFile.cpp ObjectFile.cpp

fixup! [Object] Move the createBinary/createObjectFile factories into their own file
DeltaFile
+0-16llvm/lib/Object/Binary.cpp
+0-14llvm/lib/Object/ObjectFile.cpp
+0-14llvm/lib/Object/ObjectFactories.cpp
+0-13llvm/lib/Object/SymbolicFile.cpp
+0-574 files

LLVM/project e4d6049 — llvm/lib/CodeGen/SelectionDAG LegalizeDAG.cpp

remove comment
DeltaFile
+0-2llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+0-21 files

LLVM/project 42d45b9 — llvm/test/CodeGen/PowerPC wide-scalar-shift-legalization.ll wide-scalar-shift-by-byte-multiple-legalization.ll

Update ppc tests
DeltaFile
+46-46llvm/test/CodeGen/PowerPC/wide-scalar-shift-by-byte-multiple-legalization.ll
+22-22llvm/test/CodeGen/PowerPC/wide-scalar-shift-legalization.ll
+68-682 files

LLVM/project f46eb84 — llvm/lib/CodeGen/SelectionDAG LegalizeDAG.cpp

format
DeltaFile
+3-3llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+3-31 files

LLVM/project ae06550 — llvm/lib/CodeGen/SelectionDAG LegalizeDAG.cpp

[SDAG] Reuse MMO in `legalizeStoreOps` promotion path

I hit this bug in #229429 when using `i64` for the 64-bit stores.
I ended up using `<2 x i32>` for consistency with other intrinsics but the
bug still remains.

No target hits this so far so I can't test it, but I think it's good to fix it.
Otherwise a i64 store that goes through this path can lose its atomicity for example.
The load path already preserves the MMO I believe.
DeltaFile
+3-2llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+3-21 files

LLVM/project 562baf3 — mlir/include/mlir/Dialect/LLVMIR LLVMOpBase.td LLVMOps.td, mlir/lib/Dialect/LLVMIR/IR LLVMDialect.cpp

[mlir][LLVM] Add ignore_denormal_mode UnitAttr to LLVM::AtomicRMWOp
DeltaFile
+22-5mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+8-7mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+8-0mlir/test/Dialect/LLVMIR/invalid.mlir
+7-0mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td
+0-6mlir/lib/Target/LLVMIR/Dialect/ROCDL/ROCDLToLLVMIRTranslation.cpp
+4-0mlir/test/Target/LLVMIR/Import/instructions.ll
+49-184 files not shown
+56-2210 files

LLVM/project 420e618 —

[NFC] Re-trigger CI
DeltaFile
+0-00 files

LLVM/project 9e6ceca — llvm/include/llvm/CodeGen/GlobalISel CallLowering.h, llvm/lib/CodeGen/GlobalISel CallLowering.cpp

[AMDGPU][GISel] Honor the nomerge attribute on calls (#229152)

GlobalIsel and SDag never handled the `nomerge` attribute from the IR.
For SDag, this handling is present in other targets. GISsel had no
`NoMerge` handling, and is relevant for branch folding, so it was added.

The primary motivation for this PR is sanitizer reports. Sanitizers
often rely on `__builtin_return_address(0)` from a function call to
symbolize the site of the error. Without `nomerge` it becomes possible
for two report calls to be merged and no longer report the single,
unique source location.
DeltaFile
+71-0llvm/test/CodeGen/AMDGPU/nomerge.ll
+5-1llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+4-0llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp
+3-0llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
+1-0llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+84-15 files

LLVM/project e4a8059 — llvm/lib/Target/X86 X86ISelLowering.cpp

[X86] combineSelect - don't check SimpleValueTypes through bitcast (#230040)

Although unlikely, its always possible that there's a weird type behind the cast

Noticed by inspection
DeltaFile
+2-2llvm/lib/Target/X86/X86ISelLowering.cpp
+2-21 files

LLVM/project 95ea23b — llvm/lib/Transforms/Vectorize VPlanUtils.cpp VPlanTransforms.cpp, llvm/test/Transforms/LoopVectorize tail-folding-alloca-in-loop.ll alloca-in-loop.ll

[VPlan] Don't merge allocas across lanes, parts or recipes. (#229929)

Each execution of an alloca creates a new allocation, distinct from the
allocations of all other executions. They must not be merged, either by
CSE or via isUniformAcrossVFsAndUFs.

Update those to explicitly handle Alloca recipes.

Fixes https://github.com/llvm/llvm-project/issues/229389.

PR: https://github.com/llvm/llvm-project/pull/229929
DeltaFile
+64-18llvm/test/Transforms/LoopVectorize/alloca-in-loop.ll
+13-7llvm/test/Transforms/LoopVectorize/AArch64/force-target-instruction-cost.ll
+6-3llvm/test/Transforms/LoopVectorize/tail-folding-alloca-in-loop.ll
+3-2llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+3-2llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+89-325 files

LLVM/project d83667b — llvm/lib/Target/AArch64 AArch64ISelLowering.cpp, llvm/test/CodeGen/AArch64 sqabs.ll sve2-sqabs.ll

[AArch64] lower to SQABS
DeltaFile
+20-48llvm/test/CodeGen/AArch64/sve2-sqabs.ll
+13-39llvm/test/CodeGen/AArch64/sqabs.ll
+43-0llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+76-873 files

LLVM/project 0396f33 — llvm/test/CodeGen/AArch64 sqabs.ll sve2-sqabs.ll

[AArch64] Pre-commit tests for vector SQABS

Cover saturating absolute value expressed as UMIN of ABS and the signed
maximum for Neon and scalable vectors. Include commuted operands, poison,
multiple uses and negative cases.

Record the existing code generation so the SQABS combine can show its
effect as updates to these checks.
DeltaFile
+329-0llvm/test/CodeGen/AArch64/sve2-sqabs.ll
+227-0llvm/test/CodeGen/AArch64/sqabs.ll
+556-02 files

LLVM/project d1b36c6 — llvm/lib/Transforms/Vectorize LoopVectorize.cpp, llvm/test/Transforms/LoopVectorize/RISCV fold-epilogue-tail.ll

[LV] Don't tail-fold the epilogue with EVL-based tail-folding (#228452)

Epilogue tail-folding isn't supported yet with the `DataWithEVL`
tail-folding style. The epilogue plan is selected by duplicating an
existing VPlan, and some recipes used only by EVL-based tail-folding
don't implement clone() yet, so cloning a plan that contains them hits
llvm_unreachable. This affects targets that prefer `DataWithEVL`, such
as RISC-V.

Until those recipes implement clone(), fall back to a normal epilogue
when the preferred (or forced) tail-folding style is DataWithEVL. This
bail-out is based on the preferred style rather than the style that
would actually be chosen, so it also rejects fixed-width epilogue VFs,
where EVL isn't used. It will be refined once the epilogue's chosen
tail-folding style is known when epilogue TF gets supported.
DeltaFile
+35-0llvm/test/Transforms/LoopVectorize/RISCV/fold-epilogue-tail.ll
+14-0llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+49-02 files

LLVM/project 9bf16c5 — llvm/lib/CodeGen/SelectionDAG LegalizeDAG.cpp

remove comment
DeltaFile
+0-2llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+0-21 files

LLVM/project 6c2e89f — llvm/lib/Transforms/Vectorize LoopVectorize.cpp VPlanConstruction.cpp, llvm/test/Transforms/LoopVectorize tail-folding-argmin-reduction.ll

[VPlan] Support tailfolded loops in multi-use-reductions (#214455)

Previously `handleMultiUseReductions()` would bail out for
tailfolded-loops, since the backedge value is no longer the reduction
intrinsic but the predicated select based on the header-mask.

This patch adds pattern matching to handle tailfolded loops accordingly.

I compiled the LLVM testsuite (for RISCV with -march=rv64gcv) and it
only triggers in the corresponding unit-tests in
`SingleSource/UnitTests/Vectorizer/`. I guess that's because there are
still some other limitations when handling more generic multi-use
reduction cases (e.g. differing types in CanonicalIV vs. WideIV).
DeltaFile
+500-0llvm/test/Transforms/LoopVectorize/RISCV/tail-folding-reduction.ll
+337-0llvm/test/Transforms/LoopVectorize/tail-folding-argmin-reduction.ll
+113-0llvm/test/Transforms/LoopVectorize/VPlan/tail-folding-multiuse-reductions.ll
+50-15llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+9-5llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+1,009-205 files

LLVM/project 3b5fbbd — llvm/lib/Transforms/Scalar ConstraintElimination.cpp, llvm/test/Transforms/ConstraintElimination loops-header-tested-base.ll induction-condition-in-loop-exit-latch-counted.ll

[ConstraintElim] Bound IVs by compares of the phi in header/latch. (#226297)

Extend addInfoForInductions to add bounds for IVs when the phi is
compared in the header or latch:

In that case, every iteration taking the backedge checked
PN ContinuePred B, which guarantees PN != B for NE and LT predicates.
For an increment by one, PN != B together with StartValue <= B (added
precondition) imply PN <= B.

Alive2 Proofs:
 * icmp ult in header: https://alive2.llvm.org/ce/z/x37Uvm
 * icmp slt in header: https://alive2.llvm.org/ce/z/ibnn5k
 * icmp ne in header: https://alive2.llvm.org/ce/z/wLRfZe

Triggers in a number of additional cases on
https://github.com/dtcxzyw/llvm-opt-benchmark-nightly/pull/1431.

As-is, this comes with a slight compile-time increase:

    [9 lines not shown]
DeltaFile
+901-0llvm/test/Transforms/ConstraintElimination/induction-phi-compare-header-bound.ll
+43-19llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+5-10llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll
+4-6llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-base.ll
+4-5llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit-latch-counted.ll
+3-5llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll
+960-453 files not shown
+963-519 files

LLVM/project 22371ae — llvm/lib/Target/Mips MipsSEISelLowering.h Mips16ISelLowering.h, llvm/test/CodeGen/Mips private.ll

[Mips] Lower calls to private functions the same way as internal functions (#229975)

As with 85b4fbfecb65cd1f5a06e707e7ec0fc2de562407, this seems to be
another case where the backend was treating private functions
differently for no apparent reason.

This was particularly problematic for building the Zig compiler with
LLVM linked statically because we'd have enough such calls that linking
failed with thousands of these errors:

relocation R_MIPS_CALL16 out of range: 76048 is not in [-32768, 32767]
DeltaFile
+11-12llvm/lib/Target/Mips/MipsISelLowering.cpp
+6-7llvm/lib/Target/Mips/MipsSEISelLowering.cpp
+6-7llvm/lib/Target/Mips/Mips16ISelLowering.cpp
+5-6llvm/lib/Target/Mips/MipsSEISelLowering.h
+5-6llvm/lib/Target/Mips/Mips16ISelLowering.h
+2-1llvm/test/CodeGen/Mips/private.ll
+35-391 files not shown
+36-407 files

LLVM/project eab9127 — llvm/include/llvm/CodeGen RegisterPressure.h, llvm/lib/CodeGen RegisterPressure.cpp

RegisterPressure: Detect dead physreg defs from LiveIntervals

This reverts the remainder of #222627, which was partially reverted by
on dead flags. This is a prerequisite to deleting LiveVariables.

When constructing the PressureDiff for an instruction during scheduling
DAG construction, dead defs were only recognized from the dead flag on the
operand. This implicitly relied on preprocessing done by LiveVariables to
fixup inconsistent dead flags with overlapping registers in other operands.
Dead flags have no verifier-enforced rules and are thus unreliable.

Before LiveVariables, consider this example:

  dead $eax = MOV32r0 implicit-def dead $eflags, implicit-def $rax
  ; $rax is never used

$rax is never used, but only the $eax def is dead-flagged and the overlapping
implicit-def $rax is not. The shared $eax register units are covered by the
non-dead $rax def and so are counted as live defs. That shared unit is then

    [26 lines not shown]
DeltaFile
+60-0llvm/test/CodeGen/X86/misched-pressure-dead-physreg-superreg.mir
+27-22llvm/lib/CodeGen/RegisterPressure.cpp
+6-6llvm/test/CodeGen/X86/xmulo.ll
+6-6llvm/include/llvm/CodeGen/RegisterPressure.h
+4-5llvm/lib/Target/AMDGPU/AMDGPUNextUseAnalysis.cpp
+4-4llvm/lib/Target/AMDGPU/GCNRegPressure.h
+107-435 files not shown
+120-4911 files

LLVM/project b4badb6 — clang/docs ReleaseNotes.md, clang/test/Driver aarch64-mtune.c

[AArch64] Add support for C2 CPUs (#229055)

Add initial Armv9.3-A support for Arm C2-Pro and C2-Ultra.

C2-Pro leverages the same microarchitecture as C1-Pro and uses a
processor alias. C2-Ultra has its own architectural feature list, tuning
family and host CPU part 0xd96. Its initial features and tuning follow
C1-Ultra, and it reuses the C1-Ultra scheduling model pending a
dedicated model.

For more information see:
https://developer.arm.com/Processors/C2-Ultra
https://developer.arm.com/Processors/C1-Pro

C2-Ultra Technical Reference Manual:
https://developer.arm.com/documentation/109736/latest

C1-Pro Technical Reference Manual (also applies to C2-Pro):
https://developer.arm.com/documentation/107771/latest

Signed-off-by: Alex Dobrescu <alex.dobrescu at arm.com>
DeltaFile
+70-0clang/test/Driver/print-enabled-extensions/aarch64-c2-pro.c
+70-0clang/test/Driver/print-enabled-extensions/aarch64-c2-ultra.c
+31-0llvm/lib/Target/AArch64/AArch64Processors.td
+6-0clang/test/Driver/aarch64-mtune.c
+6-0clang/docs/ReleaseNotes.md
+4-1llvm/unittests/TargetParser/TargetParserTest.cpp
+187-16 files not shown
+200-112 files

LLVM/project 195de69 — mlir/include/mlir/Dialect/Tosa/IR TosaComplianceData.h.inc, mlir/test/Dialect/Tosa tosa-validation-version-1p1-valid.mlir

[mlir][tosa] Fix extra type in GATHER compliance data (#230045)

Signed-off-by: Madeleine Dunn <madeleine.dunn at arm.com>
DeltaFile
+8-0mlir/test/Dialect/Tosa/tosa-validation-version-1p1-valid.mlir
+1-2mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc
+9-22 files

LLVM/project 9632d63 — llvm/lib/CodeGen RegisterCoalescer.cpp, llvm/test/CodeGen/X86 rematerialize-sub-super-reg-dead-flags.mir

RegisterCoalescer: Keep remat def dead if it's a copy destination superregister (#230036)

This is a refinement of #226037, which was too strict.

When rematerializing into a physical register that is not exactly the copy's
destination, the def should only stay live if it is a sub-register of the copy
destination, i.e. part of the live value. Checking register unit coverage also
kept the def live when it is a super-register with the same units as the copy
destination, such as $rax for a copy into $eax on x86_64:

  dead $rax = MOV64ri32 -11, implicit-def $eax

Only the $eax part is used, so the $rax def is dead. This matches what
LiveVariables produces for a full def with partial uses.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+5-8llvm/lib/CodeGen/RegisterCoalescer.cpp
+3-2llvm/test/CodeGen/X86/rematerialize-sub-super-reg-dead-flags.mir
+8-102 files

LLVM/project 13a8f9c — mlir/include/mlir/Dialect/Tosa/IR TosaComplianceData.h.inc, mlir/test/Dialect/Tosa profile_pro_int_unsupported.mlir tosa-validation-version-1p1-pro-fp-valid.mlir

[mlir][tosa] Adding integer data layout operation support to PRO-FP (#229777)

This pull request was made to add integer data layout operation support
to PRO-FP. This is to prevent the need to cast between int and fp to do
these operations, which had the possibility of producing errors or
unwanted behaviour. Partially implements:
https://github.com/arm/tosa-specification/pull/91

Co-authored-by: Luke Hutton <luke.hutton at arm.com>
DeltaFile
+62-0mlir/test/Dialect/Tosa/tosa-validation-version-1p1-pro-fp-valid.mlir
+28-7mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc
+0-6mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
+90-133 files

LLVM/project fa6cf7a — offload/test/offloading error_directive.c, offload/test/offloading/fortran error_directive.f90

[OpenMP][DeviceRTL] Report the source location in __kmpc_error diagnostics (#224298)

Follow-up to #220702. Completes #204240.

The device runtime accepted the `ident_t` argument but ignored it, so
`error at(execution)` in a `target` region printed no source location.
This reports it, replicating the host runtime:
```
OMP: error_directive.f90:14:3: Encountered user-directed warning: warning message.
```

When the ident carries no location the result is `unknown:0:0`, same as
the host. flang populates the ident only with `-g`; clang always does.

Assisted-by: Copilot
DeltaFile
+53-3openmp/device/src/Misc.cpp
+9-3offload/test/offloading/fortran/error_directive.f90
+4-3offload/test/offloading/error_directive.c
+66-93 files

LLVM/project e794ffd — llvm/test/CodeGen/AArch64 bf16_fast_math.ll, llvm/test/CodeGen/AMDGPU legalize-amdgcn.raw.ptr.buffer.load.ll isel-amdgpu-cs-chain-preserve-cc.ll

SelectionDAG: Stop emitting kill flags in InstrEmitter

These is no point to maintaining these before register allocation.

Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
DeltaFile
+298-298llvm/test/CodeGen/AMDGPU/isel-amdgpu-cs-chain-cc.ll
+203-203llvm/test/CodeGen/AMDGPU/carryout-selection.ll
+174-174llvm/test/CodeGen/AMDGPU/llvm.amdgcn.make.buffer.rsrc.ll
+111-111llvm/test/CodeGen/AArch64/bf16_fast_math.ll
+88-88llvm/test/CodeGen/AMDGPU/legalize-amdgcn.raw.ptr.buffer.load.ll
+88-88llvm/test/CodeGen/AMDGPU/isel-amdgpu-cs-chain-preserve-cc.ll
+962-962161 files not shown
+2,717-2,778167 files

LLVM/project aa80d64 — llvm/test/TableGen RuntimeLibcallEmitter-library-ref.td RuntimeLibcallEmitter-library-name-merge.td, llvm/utils/TableGen/Basic RuntimeLibcallsEmitter.cpp

RuntimeLibcalls: Pass the default calling convention to libraries

Previously a setAvailableLibFuncs_* function computed DefaultCC locally when a
member calling convention referenced it. To do that, the emitter worked
backwards from a library to the SystemRuntimeLibrary records that reference it,
and had to diagnose the cases where that failed, which would be if there is no
referencing system library or several different ones.

The default calling convention belongs to the target, not to a library. The
dispatcher in setTargetRuntimeLibcallSets already computes it, so pass it to
each library function as a parameter. This removes the reverse lookup and both
diagnostics. DefaultCC references are now valid in a library shared by
SystemRuntimeLibrary records with different defaults, and in a library no
SystemRuntimeLibrary references.

This fixes errors when a LibcallLibrary is unused. This will enable defining
the vector math libraries in the future, as well as decoupling the target
specific handling in #229562.

Co-authored-by: Claude Opus 5 <noreply at anthropic.com>
DeltaFile
+12-81llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
+36-0llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td
+6-8llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td
+3-3llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td
+2-2llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td
+2-2llvm/test/TableGen/RuntimeLibcallEmitter-library-name-merge.td
+61-962 files not shown
+65-1008 files

LLVM/project d424cf2 — mlir/lib/Dialect/Complex/IR ComplexOps.cpp, mlir/test/Dialect/Complex canonicalize.mlir

[mlir][complex] Require fastmath for the add/sub and exp/log folds (#221384)

`complex.add(complex.sub(a, b), b)`, `complex.add(b, complex.sub(a, b))`
and `complex.sub(complex.add(a, b), b)` fold to `a` unconditionally, and
so does `complex.exp(complex.log(a))`:

```mlir
func.func @add_sub(%a: complex<f32>, %b: complex<f32>) -> complex<f32> {
  %sub = complex.sub %a, %b : complex<f32>
  %add = complex.add %sub, %b : complex<f32>
  return %add : complex<f32>
}
// -canonicalize today
func.func @add_sub(%a: complex<f32>, %b: complex<f32>) -> complex<f32> {
  return %a : complex<f32>
}
```

Neither identity holds in floating point. The intermediate result is

    [19 lines not shown]
DeltaFile
+111-26mlir/test/Dialect/Complex/canonicalize.mlir
+35-12mlir/lib/Dialect/Complex/IR/ComplexOps.cpp
+146-382 files

LLVM/project 2ba993c — llvm/lib/Frontend/OpenMP OMPDescriptors.cpp

Address review comments
DeltaFile
+7-2llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
+7-21 files