[mlir] Consolidate patterns into `RegionBranchOpInterface` patterns (#174094) Instead of op-specific cleanup patterns for region branch ops to remove unused results / block arguments, etc., add a set of patterns that can handle all `RegionBranchOpInterface` ops. These patterns are enabled only for selected SCF dialect ops at the moment: * `scf.execute_region` * `scf.for` * `scf.if` * `scf.index_switch` * `scf.while` It is currently not possible to register canoncalization patterns for op interfaces and some ops have incorrect interface implementations. In follow-up PRs, the set of ops will be gradually extended within the SCF dialect (`scf.forall`) and across other dialects (`gpu.warp_execute_on_lane0`, (maybe) various affine dialect ops, ...), and maybe eventually to apply to all `RegionBranchOpInterface` ops. This commit removes many similar canonicalization patterns from the SCF dialect. The newly added canonicalization patterns allow users to get the same canonicalizations for free for their own ops. And even a few additional new canonicalizations ([example](https://github.com/llvm/llvm-project/pull/174094/files#diff-54318cd685386d5519c42be49818e388b09d934edcbe4280548baa3601802977R2241), [example](https://github.com/llvm/llvm-project/pull/174094/files#diff-54318cd685386d5519c42be49818e388b09d934edcbe4280548baa3601802977R1101), ...). Implementation outline: This commit adds 3 canonicalization patterns. * `MakeRegionBranchOpSuccessorInputsDead`: Remove uses of successor inputs, by swapping them for successor operand values. * `RemoveDuplicateSuccessorInputUses`: Remove uses of successor inputs that are duplicates. (Similar to `WhileRemoveDuplicatedResults` in the SCF dialect.) * `RemoveDeadRegionBranchOpSuccessorInputs`: Remove dead successor inputs if all of their "tied" successor inputs are also dead. (Similar to `WhileUnusedResult` in the SCF dialect.)
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.