summaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
AgeCommit message (Collapse)Author
2025-07-02[SimplifyCFG] Transform switch to select when common bits uniquely identify ↵Gábor Spaits
one case (#145233) Fix #141753 . This patch introduces a new check, that tries to decide if the conjunction of all the values uniquely identify the accepted values by the switch.
2025-06-28[SimplifyCFG] Use indexType from data layout in switch to table conversion ↵Andreas Jonson
(#146207) Generate the GEP with the index type that InstCombine will cast it to but use the knowledge that the index is unsigned.
2025-06-24[SimplifyCFG] Relax `cttz` cost check in `simplifySwitchOfPowersOfTwo`Antonio Frighetto
We should be able to allow `simplifySwitchOfPowersOfTwo` transform to take place, as, on recent X86 targets, the weighted latency-size appears to be 2. This favours computing trailing zeroes and indexing into a smaller value table, over generating a jump table with an indirect branch, which overall should be more efficient.
2025-06-17[DebugInfo][RemoveDIs] Remove a swathe of debug-intrinsic code (#144389)Jeremy Morse
Seeing how we can't generate any debug intrinsics any more: delete a variety of codepaths where they're handled. For the most part these are plain deletions, in others I've tweaked comments to remain coherent, or added a type to (what was) type-generic-lambdas. This isn't all the DbgInfoIntrinsic call sites but it's most of the simple scenarios. Co-authored-by: Nikita Popov <github@npopov.com>
2025-06-12[DLCov][NFC] Propagate annotated DebugLocs through transformations (#138047)Stephen Tozer
Part of the coverage-tracking feature, following #107279. In order for DebugLoc coverage testing to work, we firstly have to set annotations for intentionally-empty DebugLocs, and secondly we have to ensure that we do not drop these annotations as we propagate DebugLocs throughout compilation. As the annotations exist as part of the DebugLoc class, and not the underlying DILocation, they will not survive a DebugLoc->DILocation->DebugLoc roundtrip. Therefore this patch modifies a number of places in the compiler to propagate DebugLocs directly rather than via the underlying DILocation. This has no effect on the output of normal builds; it only ensures that during coverage builds, we do not drop incorrectly annotations and therefore create false positives. The bulk of these changes are in replacing DILocation::getMergedLocation(s) with a DebugLoc equivalent, and in changing the IRBuilder to store a DebugLoc directly rather than storing DILocations in its general Metadata array. We also use a new function, `DebugLoc::orElse`, which selects the "best" DebugLoc out of a pair (valid location > annotated > empty), preferring the current DebugLoc on a tie - this encapsulates the existing behaviour at a few sites where we _may_ assign a DebugLoc to an existing instruction, while extending the logic to handle annotation DebugLocs at the same time.
2025-06-12[DebugInfo][RemoveDIs] Delete debug-info-format flag (#143746)Jeremy Morse
This flag was used to let us incrementally introduce debug records into LLVM, however everything is now using records. It serves no purpose now, so delete it.
2025-06-11[DLCov][NFC] Annotate intentionally-blank DebugLocs in existing code (#136192)Stephen Tozer
Following the work in PR #107279, this patch applies the annotative DebugLocs, which indicate that a particular instruction is intentionally missing a location for a given reason, to existing sites in the compiler where their conditions apply. This is NFC in ordinary LLVM builds (each function `DebugLoc::getFoo()` is inlined as `DebugLoc()`), but marks the instruction in coverage-tracking builds so that it will be ignored by Debugify, allowing only real errors to be reported. From a developer standpoint, it also communicates the intentionality and reason for a missing DebugLoc. Some notes for reviewers: - The difference between `I->dropLocation()` and `I->setDebugLoc(DebugLoc::getDropped())` is that the former _may_ decide to keep some debug info alive, while the latter will always be empty; in this patch, I always used the latter (even if the former could technically be correct), because the former could result in some (barely) different output, and I'd prefer to keep this patch purely NFC. - I've generally documented the uses of `DebugLoc::getUnknown()`, with the exception of the vectorizers - in summary, they are a huge cause of dropped source locations, and I don't have the time or the domain knowledge currently to solve that, so I've plastered it all over them as a form of "fixme".
2025-06-04[SimplifyCFG] Bail out on vector GEPs in `passingValueIsAlwaysUndefined` ↵Yingwei Zheng
(#142526) Closes https://github.com/llvm/llvm-project/issues/142522.
2025-06-03[ValueTracking] Make Depth last default arg (NFC) (#142384)Ramkumar Ramachandra
Having a finite Depth (or recursion limit) for computeKnownBits is very limiting, but is currently a load-bearing necessity, as all KnownBits are recomputed on each call and there is no caching. As a prerequisite for an effort to remove the recursion limit altogether, either using a clever caching technique, or writing a easily-invalidable KnownBits analysis, make the Depth argument in APIs in ValueTracking uniformly the last argument with a default value. This would aid in removing the argument when the time comes, as many callers that currently pass 0 explicitly are now updated to omit the argument altogether.
2025-06-02[llvm] Use *Set::insert_range (NFC) (#138237)Kazu Hirata
2025-06-02[SimplifyCFG] Switch to use `paramHasNonNullAttr` (#125383)Yingwei Zheng
2025-05-22[SimplifyCFG] Only consider provenance capture in store speculation (#138548)Nikita Popov
The capture check here is to protect against concurrent accesses from other threads. This requires the provenance to escape.
2025-05-12[SimplifyCFG][swifterror] Don't sink calls with swifterror params (#139015)Ellis Hoag
We've encountered an LLVM verification failure when building Swift with the SimplifyCFG pass enabled. I found that https://reviews.llvm.org/D158083 fixed this pass by preventing sinking loads or stores of swifterror values, but it did not implement the same protection for call or invokes. In `Verifier.cpp` [here](https://github.com/ellishg/llvm-project/blob/c68535581135a1513c9c4c1c7672307d4b5e616e/llvm/lib/IR/Verifier.cpp#L4360-L4364) and [here](https://github.com/ellishg/llvm-project/blob/c68535581135a1513c9c4c1c7672307d4b5e616e/llvm/lib/IR/Verifier.cpp#L3661-L3662) we can see that swifterror values must also be used directly by call instructions.
2025-05-10[Utils] Use range-based for loops (NFC) (#139426)Kazu Hirata
2025-05-07[KeyInstr][SimplifyCFG] Remap atoms after duplication for threading (#133484)Orlando Cazalet-Hyams
Given the same branch condition in `a` and `c` SimplifyCFG converts: +> b -+ | v --> a --> c --> e --> | ^ +> d -+ into: +--> bcd ---+ | v --> a --> c --> e --> Remap source atoms on instructions duplicated from `c` into `bcd`. RFC: https://discourse.llvm.org/t/rfc-improving-is-stmt-placement-for-better-interactive-debugging/82668
2025-05-06[KeyInstr][SimplifyCFG] Remap atoms when folding br to common succ into pred ↵Orlando Cazalet-Hyams
(#133482) SimplifyCFG folds `d` into preds `b` and `c`. +---------------+ | | +--> b --+ | | v v --> a d --> e --> f --> | ^ ^ +--> c --+ | | | +---------------+ Remap source atoms so that the duplicated instructions are analysed independently to determine is_stmt positions. The pull request contains a discussion covering various edge cases here: https://github.com/llvm/llvm-project/pull/133482/files#r2039519348 The summary of the discussion is that we could avoid remapping when there's a single pred, but we decided that it's still a trade off, and not worth the additional complexity right now. RFC: https://discourse.llvm.org/t/rfc-improving-is-stmt-placement-for-better-interactive-debugging/82668
2025-05-04[Transforms] Use range-based for loops (NFC) (#138476)Kazu Hirata
2025-04-27[llvm] Use range constructors of *Set (NFC) (#137552)Kazu Hirata
2025-04-21[CostModel] Make sure getCmpSelInstrCost is passed a CondTy (#135535)David Green
It is already required along certain code paths that the CondTy is valid. Fix some of the uses to make sure it is passed.
2025-04-20[llvm] Call hash_combine_range with ranges (NFC) (#136511)Kazu Hirata
2025-04-13[SimplifyCFG] Handle trunc condition in foldBranchToCommonDest. (#135490)Andreas Jonson
proof: https://alive2.llvm.org/ce/z/v32Aof
2025-04-03[SimplifyCFG] Remove unused variable. NFC. (#134211)Yingwei Zheng
2025-04-03[IR][NFC] Use `SwitchInst::defaultDestUnreachable` (#134199)Yingwei Zheng
2025-03-28[llvm] Remove extraneous calls to make_range (NFC) (#133551)Kazu Hirata
2025-03-27[Transforms] Use range constructors of *Set (NFC) (#133203)Kazu Hirata
2025-03-21[X86,SimplifyCFG] Support conditional faulting load or store only (#132032)Phoebe Wang
This is to fix a bug when a target only support conditional faulting load, see test case hoist_store_without_cstore. Split `-simplifycfg-hoist-loads-stores-with-cond-faulting` into `-simplifycfg-hoist-loads-with-cond-faulting` and `-simplifycfg-hoist-stores-with-cond-faulting` to control conditional faulting load and store respectively.
2025-03-20[X86][NFCI] Add IsStore parameter to hasConditionalLoadStoreForType (#132153)Phoebe Wang
Address https://github.com/llvm/llvm-project/pull/132032#issuecomment-2736936769
2025-03-19[Transforms] Use *Set::insert_range (NFC) (#132056)Kazu Hirata
DenseSet, SmallPtrSet, SmallSet, SetVector, and StringSet recently gained C++23-style insert_range. This patch replaces: Dest.insert(Src.begin(), Src.end()); with: Dest.insert_range(Src); This patch does not touch custom begin like succ_begin for now.
2025-03-14[Utils] Avoid repeated hash lookups (NFC) (#131267)Kazu Hirata
It's safe to use try_emplace instead of operator[] here because: - PhiPredIVs is empty at the beginning of the loop, and - The elements we are inserting into PhiPredIVs are unique.
2025-03-14[SimplifyCFG] Treat `extract oneuse(op.with.overflow),1` pattern as a single ↵Gábor Spaits
instruction (#128021) Closes #115683 . Overflow arithmetic instruction plus extract value are usually generated when a division is being replaced, but the zero check may still be there. In that case hoist these two instructions out of this basic block, and let later optimizations take care of the unnecessary zero checks.
2025-03-09[Utils] Avoid repeated hash lookups (NFC) (#130464)Kazu Hirata
2025-03-06[Utils] Avoid repeated hash lookups (NFC) (#129990)Kazu Hirata
2025-02-24[CaptureTracking] Remove StoreCaptures parameter (NFC)Nikita Popov
The implementation doesn't use it, and is unlikely to use it in the future. The places that do set StoreCaptures=false, do so incorrectly and would be broken if the parameter actually did anything.
2025-02-22[SimplifyCFG] Drop unused `LockstepReverseIterator` class (NFC)Antonio Frighetto
Unmaintained code has been removed.
2025-02-22Reapply "[Utils] Consolidate `LockstepReverseIterator` into own header (NFC)"Antonio Frighetto
Common code has been unified and generalized. Original commit: 123dca9b56e1359d8ec7771ea3bd0afd4b1ea6af Previously reverted due to accidentally merged incompletely. The issue has been addressed by restoring missing code.
2025-02-21Revert "[Utils] Consolidate `LockstepReverseIterator` into own header (NFC) ↵Florian Hahn
(#116657)" This reverts commit 123dca9b56e1359d8ec7771ea3bd0afd4b1ea6af. This breaks building on macOS with clang and multiple build bots, including https://lab.llvm.org/buildbot/#/builders/175/builds/13585 llvm-project/llvm/lib/Transforms/Utils/SimplifyCFG.cpp: In function ‘bool sinkCommonCodeFromPredecessors(llvm::BasicBlock*, llvm::DomTreeUpdater*)’: /b/ml-opt-devrel-x86-64-b1/llvm-project/llvm/lib/Transforms/Utils/SimplifyCFG.cpp:2503:3: error: reference to ‘LockstepReverseIterator’ is ambiguous 2503 | LockstepReverseIterator<true> LRI(UnconditionalPreds); | ^~~~~~~~~~~~~~~~~~~~~~~
2025-02-21[Utils] Consolidate `LockstepReverseIterator` into own header (NFC) (#116657)Antonio Frighetto
Common code has been unified and generalized. Not sure if it may be worth to generalize this further, since it looks closely tied to Blocks (might make sense to rename it in `LockstepReverseInstructionIterator`).
2025-02-04[IR][NFC] Switch to use `LifetimeIntrinsic` (#125528)Yingwei Zheng
2025-02-04[NFC][SimplifyCFG] Refactor `passingValueIsAlwaysUndefined` to work on `Use` ↵Yingwei Zheng
(#125519) Address comment https://github.com/llvm/llvm-project/pull/125383#discussion_r1938436526
2025-01-27[NFC][DebugInfo] Switch more call-sites to using iterator-insertion (#124283)Jeremy Morse
To finalise the "RemoveDIs" work removing debug intrinsics, we're updating call sites that insert instructions to use iterators instead. This set of changes are those where it's not immediately obvious that just calling getIterator to fetch an iterator is correct, and one or two places where more than one line needs to change. Overall the same rule holds though: iterators generated for the start of a block such as getFirstNonPHIIt need to be passed into insert/move methods without being unwrapped/rewrapped, everything else can use getIterator.
2025-01-27[NFC][DebugInfo] Make some block-start-position methods return iterators ↵Jeremy Morse
(#124287) As part of the "RemoveDIs" work to eliminate debug intrinsics, we're replacing methods that use Instruction*'s as positions with iterators. A number of these (such as getFirstNonPHIOrDbg) are sufficiently infrequently used that we can just replace the pointer-returning version with an iterator-returning version, hopefully without much/any disruption. Thus this patch has getFirstNonPHIOrDbg and getFirstNonPHIOrDbgOrLifetime return an iterator, and updates all call-sites. There are no concerns about the iterators returned being converted to Instruction*'s and losing the debug-info bit: because the methods skip debug intrinsics, the iterator head bit is always false anyway.
2025-01-24[NFC][DebugInfo] Use iterator moveBefore at many call-sites (#123583)Jeremy Morse
As part of the "RemoveDIs" project, BasicBlock::iterator now carries a debug-info bit that's needed when getFirstNonPHI and similar feed into instruction insertion positions. Call-sites where that's necessary were updated a year ago; but to ensure some type safety however, we'd like to have all calls to moveBefore use iterators. This patch adds a (guaranteed dereferenceable) iterator-taking moveBefore, and changes a bunch of call-sites where it's obviously safe to change to use it by just calling getIterator() on an instruction pointer. A follow-up patch will contain less-obviously-safe changes. We'll eventually deprecate and remove the instruction-pointer insertBefore, but not before adding concise documentation of what considerations are needed (very few).
2025-01-08[LLVM] Fix various cl::desc typos and whitespace issues (NFC) (#121955)Ryan Mansfield
2025-01-06[IRBuilder] Refactor FMF interface (#121657)Yingwei Zheng
Up to now, the only way to set specified FMF flags in IRBuilder is to use `FastMathFlagGuard`. It makes the code ugly and hard to maintain. This patch introduces a helper class `FMFSource` to replace the original parameter `Instruction *FMFSource` in IRBuilder. To maximize the compatibility, it accepts an instruction or a specified FMF. This patch also removes the use of `FastMathFlagGuard` in some simple cases. Compile-time impact: https://llvm-compile-time-tracker.com/compare.php?from=f87a9db8322643ccbc324e317a75b55903129b55&to=9397e712f6010be15ccf62f12740e9b4a67de2f4&stat=instructions%3Au
2024-12-26[SimplifyCFG] Replace unreachable switch lookup table holes with poison (#94990)DaPorkchop_
As discussed in #94468, this causes switch lookup table entries which are unreachable to be poison instead of filling them with a value from one of the reachable cases. --------- Co-authored-by: DianQK <dianqk@dianqk.net>
2024-12-13[SimplifyCFG] Always allow hoisting if all instructions match. (#97158)Florian Hahn
Generalize hoistCommonCodeFromSuccessors's `EqTermsOnly` to `AllInstsEqOnly` and always allow hoisting if all instructions match. In that case, all instructions can be hoisted and the original branch will be replaced and selects for PHIs are added. This allows preserving metadata in more cases, using the existing hoisting logic, whereas previously FoldTwoEntryPHINode would drop the metadata. https://llvm-compile-time-tracker.com/compare.php?from=716360367fbdabac2c374c19b8746f4de49a5599&to=986b2c47df516b31d998c055400e4f62aa76edc6&stat=instructions:u PR: https://github.com/llvm/llvm-project/pull/97158
2024-12-13[SimplifyCFG] Consider preds to switch in `simplifyDuplicateSwitchArms`Antonio Frighetto
Allow a duplicate basic block with multiple predecessors to the jump table to be simplified, by considering that the same basic block may appear in more switch cases.
2024-11-25[PatternMatch] Introduce m_c_Select (#114328)David Green
This matches m_Select(m_Value(), L, R) or m_Select(m_Value(), R, L).
2024-11-25[X86,SimplifyCFG] Support hoisting load/store with conditional faulting ↵Phoebe Wang
(Part II) (#108812) This is a follow up of #96878 to support hoisting load/store from BBs have the same predecessor, if load/store are the only instructions and the branch is unpredictable, e.g.: ``` void test (int a, int *c, int *d) { if (a) *c = a; else *d = a; } ```
2024-11-15[DebugInfo][SimplifyCFG] Fully propagate merged invoke DILocations (#114235)Stephen Tozer
Currently when we merge invokes as part of SimplifyCFG we apply a merge of the invoke DILocations to the merged invoke. We also insert an unconditional branch to the merged invoke at the positions previously occupied by the original invokes; as this branch is part of the substitution for the invoke it has replaced, we should propagate the original invoke DebugLoc to it.