Commit Graph

126 Commits

Author SHA1 Message Date
Matt Arsenault 8e3e218a5f llvm-reduce: Fix producing invalid reductions on ifunc 2022-11-27 12:41:29 -05:00
Florian Hahn 5b6575d50e
[llvm-reduce] Do not crash when accessing landingpads of invokes.
Unconditionally removing landing pads results in invalid IR,
if there is a different `invoke` that uses it. Update the code
to only remove the landing pad if the current invoke is the only
user. Also carefully avoid creating plain branches to bbs with
landing pads we couldn't remove.

Reviewed By: arsenm, aeubanks

Differential Revision: https://reviews.llvm.org/D138072
2022-11-18 15:19:50 +00:00
Matt Arsenault 4638ba7b45 llvm-reduce: Try to turn calls into something else
Try to turn calls that look like operators into known
intrinsics. Also try to turn calls that look like a load or
a store into a load or store.
2022-11-07 21:04:21 -08:00
Nikita Popov 304f1d59ca [IR] Switch everything to use memory attribute
This switches everything to use the memory attribute proposed in
https://discourse.llvm.org/t/rfc-unify-memory-effect-attributes/65579.
The old argmemonly, inaccessiblememonly and inaccessiblemem_or_argmemonly
attributes are dropped. The readnone, readonly and writeonly attributes
are restricted to parameters only.

The old attributes are auto-upgraded both in bitcode and IR.
The bitcode upgrade is a policy requirement that has to be retained
indefinitely. The IR upgrade is mainly there so it's not necessary
to update all tests using memory attributes in this patch, which
is already large enough. We could drop that part after migrating
tests, or retain it longer term, to make it easier to import IR
from older LLVM versions.

High-level Function/CallBase APIs like doesNotAccessMemory() or
setDoesNotAccessMemory() are mapped transparently to the memory
attribute. Code that directly manipulates attributes (e.g. via
AttributeList) on the other hand needs to switch to working with
the memory attribute instead.

Differential Revision: https://reviews.llvm.org/D135780
2022-11-04 10:21:38 +01:00
Matt Arsenault e4b126cc2d llvm-reduce: Require x86 to run file ouput test
The MIR test somewhat depends on target support.
2022-11-02 10:48:52 -07:00
Matt Arsenault e57ab8fe91 llvm-reduce: Add explicit triple to test
Some host targets are managing to get through MIR parsing
without constructing their MachineFunctionInfo.

Fixes at least SystemZ and SPARC (issue 58768)
2022-11-02 08:31:38 -07:00
Matt Arsenault 4e21bc0c40 llvm-reduce: Drop guessing output format based on file extension 2022-10-31 20:35:08 -07:00
Matt Arsenault 3c436ab0d4 llvm-reduce: Support emitting bitcode for final result
Previously, this unconditionally emitted text IR. I ran
into a bug that manifested in broken disassembly, so the
desired output was the bitcode format. If the input format
was binary bitcode, the requested output file ends in .bc,
or an explicit -output-bitcode option was used, emit bitcode.
2022-10-31 20:35:08 -07:00
Matt Arsenault f02bc70c7d llvm-reduce: Fix producing invalid reductions with landingpads
It's not valid to simply branch to a landingpad block, so it
needs to be removed.

Also stop trying to scan forward to find a block that can be merged.
The predecessor merge rules are more complex than this. This also
would need to have considered landingpads. Just do the minimum
to delete the block, and let the simplify-cfg reduction handle
the branch chain cleanups.
2022-10-28 17:07:26 -07:00
Matt Arsenault 45a91c1521 llvm-reduce: Fix block reduction with unreachable blocks
Previously this would produce many invalid reductions with
"Instruction does not dominate uses" verifier errors.

This fixes issues in cases where the incoming IR
has unreachable blocks, and the resulting reduction
introduced new reachable blocks.

Have basic-blocks skip functions that have unreachable
blocks, Introduce a separate reduction which only
deletes unreachable blocks. Cleanup any newly unreachable
blocks after trimming out the requested deletions.

Includes a variety of meta-reduced tests for llvm-reduce
itself with -abort-on-invalid-reduction that were failing
on different iterations of this patch.

Bugpoint's implementation is much simpler (but currently I don't
understand how it avoids disconnecting interesting blocks from the CFG).
2022-10-28 17:07:26 -07:00
Matt Arsenault bc405e37ee llvm-reduce: Don't turn switches into returns
Re-use one of the existing successors as the new default.
This helps with a future patch to fix handling of unreachable
blocks.
2022-10-28 17:07:26 -07:00
Matt Arsenault df60f0bbef llvm-reduce: Remove unnecessary arguments from test 2022-10-24 22:32:31 -07:00
Matt Arsenault 08d1c43c70 llvm-reduce: Add conditional reduction passes
Copy this technique from bugpoint. Before trying to blindly
delete blocks, try to fold branch conditions. This intuitively
makes more sense for a faster reduction, since you can find
dead paths in the function to prune out before trying to bisect
blocks in source order.

Seems to provide some speedup on my multi-hour reduction samples.

This does have the potential to produce testcases with unreachable
blocks. This is already a problem with the existing block
reduction pass. I'm struggling dealing with invalid reductions
in these cases, so in the future this should probably start
deleting those. However, I do sometimes try to reduce failures
in code that becomes unreachable, so I'm not totally sure
what to do here.
2022-10-23 15:39:39 -07:00
Matt Arsenault 3e6f7ab867 llvm-reduce: Fix opcode reduction leaving behind dead instructions
ce3c3cb291 broke this by
speculatively making transforms before checking shouldKeep.
Originally I tried to roll back changes to the IR, but it's probably
best to not touch it before querying.
2022-10-23 15:37:03 -07:00
Matt Arsenault 827f01c275 llvm-reduce: Remove okToRemove logic in block reduction
This was making decisions based on BBsToDelete, while being
used to determine BBsToDelete which doesn't really work.
Additionally, this is a lot of logic just to avoid deleting
the entry block when we can just skip it.
2022-10-23 15:16:55 -07:00
Matt Arsenault f45ef230f3 llvm-reduce: Fix some broken test checks 2022-10-23 15:16:55 -07:00
Matt Arsenault 83da1a6a3f llvm-reduce: Add a reduction to replace atomics with non-atomics
Make load and store non-atomic. Make the others monotonic.

We could probably try to incrementally relax the orderings; not sure
how useful that would be.
2022-10-23 15:16:55 -07:00
Matt Arsenault b1e1719905 llvm-reduce: Add atomic syncscope reduction 2022-10-23 15:16:55 -07:00
Matt Arsenault 596fdf75d9 llvm-reduce: Add volatile reduction pass
Removing volatile may help optimization passes do more to the IR. However,
this will increase scheduler freedom.
2022-10-23 15:16:55 -07:00
Matt Arsenault 27902eea0f llvm-reduce: Add flag reduction pass
Try to remove each flag from instructions. It may make more
sense to introduce these flags instead.
2022-10-23 15:16:54 -07:00
Matt Arsenault b022e08c18 llvm-reduce: Don't use unreachable blocks in remove-bbs test
A future change will skip the reduction for functions with
unreachable blocks. Also stop using the hard to follow python based
interestingness check in favor of FileCheck.
2022-10-23 15:16:54 -07:00
Arthur Eubanks 0fbb261536 [llvm-reduce] Attempt to strip debug info
I often run llvm-reduce on IR that contains debug info, this prevents an
extra step of `opt -passes=strip` I do every time and will result in a
lot less invalid reductions around debug metadata.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D136208
2022-10-21 09:11:58 -07:00
Arthur Eubanks ce3c3cb291 [llvm-reduce] Check if reduction fails/is redundant before invoking oracle
So we don't over count the number of chunks and do unnecessary work reducing more chunks than exist.

This lowers some random reduction I tested with locally from 250s to 232s.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D136127
2022-10-18 08:43:56 -07:00
Arthur Eubanks 6ae63c90ce [llvm-reduce] Reduce comdats
Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D136054
2022-10-17 10:50:45 -07:00
Matt Arsenault 573a5de755 llvm-reduce: Add opcode reduction pass
Try some dumb strength reductions to "simpler" opcodes.
Make some opcode substitutions I typically try to get smaller
MIR out of codegen. This is a bit target specific and I have a
lot of increasingly target specific modifications I try
during manual reduction.
2022-10-12 17:34:03 -07:00
Matt Arsenault c3bc72ccb2 llvm-reduce: Improve delta pass flag handling
Verify all the requested passes exist before trying to run any.
For long reductions, it was really annoying for it to get halfway through
and then I come back later to an incomplete reduction.

Also add a new skip-delta-passes flag. Most of the time I want to opt out
of specific reductions, rather than run a select few.
2022-10-12 17:25:23 -07:00
Arthur Eubanks 47b1623b1f [llvm-reduce] Fail verifier less when removing debug metadata
Without this patch, we hit the following a lot:
"llvm.dbg.declare intrinsic requires a !dbg attachment"
"DICompileUnit not listed in llvm.dbg.cu"

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D135492
2022-10-07 16:22:13 -07:00
Matt Arsenault 7721cba2ee llvm-reduce: Fix another invalid reduction with repeated input phis
ReduceOperandsSkip had the same issue as ReduceOperands when handling
phis with repeated predecessors.
2022-10-07 13:15:15 -07:00
Matt Arsenault 0a159427ad llvm-reduce: Fix invalid reduction for phis with repeat inputs
Phis have a quirk where the same predecessor block may appear multiple times
if the same block branches to it multiple ways. All the values need to match,
but this was replacing each operand independently. If an operand can be simplified,
make sure to replace every instance of the incoming block's value.
2022-10-07 13:15:15 -07:00
Matt Arsenault 023f24d893 llvm-reduce: Use -abort-on-invalid-reduction in a test
Also stop using cat
2022-10-07 13:15:14 -07:00
Matthew Voss fe50eac85c [llvm-reduce] Fix di-metadata pass test failures
We're seeing intermittent failures in upstream bots. See:

https://lab.llvm.org/buildbot/#/builders/139/builds/29185
https://lab.llvm.org/buildbot/#/builders/238/builds/295

This appears to be due to the unstable iteration order of DenseSet.
Since we're trying to reduce a tree, it makes sense to attempt
reductions from the top down.

This also addresses post-review comments from @MatzeB.

Differential Revision: https://reviews.llvm.org/D135473
2022-10-07 12:05:25 -07:00
Matthew Voss 2c799b7793 [llvm-reduce] Add pass that reduces DebugInfo metadata
This new pass for llvm-reduce attempts to reduce DebugInfo metadata.
The process used is:
  1. Scan every MD node, keeping track of nodes already visited.
  2. Look for DebugInfo nodes, then record any operands that are lists.
  3. Bisect though all the elements of the collected lists.

Differential Revision: https://reviews.llvm.org/D132077
2022-10-06 14:24:39 -07:00
Ellis Hoag aa065c016b Revert "[llvm-reduce] Remove debug metadata elements"
This reverts commit 69549de865.

The change in D135237 can lead to verification failures like `scope must have two or three operands`.
The ongoing work in D132077 does something similar without these failures, so lets wait for that to land and revert this patch.

Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D135395
2022-10-06 13:40:03 -07:00
Ellis Hoag 69549de865 [llvm-reduce] Remove debug metadata elements
There can be lots of `MDTuple` debug metadata nodes. For example, `globals: !{!1, !2}` in `!DICompileUnit()`. Search through all debug info to find `MDTuple`'s and remove some of their elements.

For D135114 I was able to get a reproducer with 364 lines without manually deleting elements. After this patch I got it down to 67 lines.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D135237
2022-10-06 09:28:55 -07:00
Matthias Braun a946eb160a ReduceOperands: Do not crash on vector of pointer types
Avoid crash in `reduceOperandsOneDeltaPass` function for operands with
vector of pointer type.

While on it add a `reduce-operands-ptr.ll` test in the spirit of the
existing `reduce-operands-int.ll`/`reduce-operands-fp.ll` tests.

Differential Revision: https://reviews.llvm.org/D135307
2022-10-05 15:04:32 -07:00
Florian Hahn 5be203ec4d
[llvm-reduce] Add test with debug nodes not being removed.
Add a test where llvm-reduce at the moment cannot drop unneeded debug
metadata nodes referenced by DICompileUnit and DISubpgoram.
2022-09-22 08:49:57 +01:00
Florian Hahn 53aad7a69a
[llvm-reduce] Update NoChunks initializer to be in line with AllChunks.
Without this patch, the assertion triggers below on the test case,
because we are using different oracles for the verification.

    Assertion failed: (Targets == NoChunksCounter.count() && "number of chunks changes when reducing"), function runDeltaPass, file Delta.cpp, line 272.
2022-09-21 15:50:30 +01:00
Abhina Sreeskantharajan ce19343114 [test] Use host platform specific error message substitution
This patch modifies the testcase to use error substitution so it will pass on all platforms.

Reviewed By: fanbo-meng, zibi

Differential Revision: https://reviews.llvm.org/D134034
2022-09-16 15:13:45 -04:00
Matt Arsenault c9ef7d49ab llvm-reduce: Do not insert replacement IMPLICIT_DEFs for dead defs
Also skip dead defs when looking for a previous vreg with the same
class. This helps avoid some mid-reduction verifier errors when
LiveIntervals computation starts introducing dead flags everywhere.
2022-09-14 13:21:14 -04:00
Matt Arsenault 0e1ee738f1 llvm-reduce: Restrict test to only test relevant reductions
Avoids breaking this test in a future change.
2022-09-14 13:21:01 -04:00
Matt Arsenault 7886505062 llvm-reduce: Add undef to new subregister IMPLICIT_DEFs
This avoids a verifier error from the other unused lanes when
LiveIntervals is used.
2022-09-13 18:10:56 -04:00
Matt Arsenault 9d8c320cd7 llvm-reduce: Fix missing undef flags in some tests
These caused failures when LiveIntervals is used by the verifier. Also
fix some other errors that appear with subranges enabled.
2022-09-13 18:10:56 -04:00
Matt Arsenault 0199449fad llvm-reduce: Use FileCheck instead of python for interestingness test
Also avoid using cat for no reason.
2022-09-13 18:10:56 -04:00
Eli Friedman cfd2c5ce58 Untangle the mess which is MachineBasicBlock::hasAddressTaken().
There are two different senses in which a block can be "address-taken".
There can be a BlockAddress involved, which means we need to map the
IR-level value to some specific block of machine code.  Or there can be
constructs inside a function which involve using the address of a basic
block to implement certain kinds of control flow.

Mixing these together causes a problem: if target-specific passes are
marking random blocks "address-taken", if we have a BlockAddress, we
can't actually tell which MachineBasicBlock corresponds to the
BlockAddress.

So split this into two separate bits: one for BlockAddress, and one for
the machine-specific bits.

Discovered while trying to sort out related stuff on D102817.

Differential Revision: https://reviews.llvm.org/D124697
2022-08-16 16:15:44 -07:00
Arthur Eubanks 5a1f864e89 [test][llvm-reduce] Fix simplify-cfg.ll
D131920 broke some Windows bots with "x6" in the buildbot paths.
https://lab.llvm.org/buildbot#builders/123/builds/12276
2022-08-15 16:21:39 -07:00
John Regehr 2f1fa6242a this pass calls simplifyCFG on individual basic blocks; we want this
so that we can reduce away incidental parts of the CFG in cases where
the full simplifyCFG pass makes the test case uninteresting

Differential Revision: https://reviews.llvm.org/D131920
2022-08-15 15:45:20 -06:00
John Regehr df308cab28 fix some bad logic that was removing all successor phi nodes, not just
out of chunk ones. the non-default second argument to
removePredecessor() is necessary to avoid creating invalid IR on
examples like the one in the provided test case

Differential Revision: https://reviews.llvm.org/D131843
2022-08-13 19:15:26 -06:00
Arthur Eubanks 195087d815 [llvm-reduce] Try harder to not create invalid aliases
This was done by adding --abort-on-invalid-reduction to remove-function-bodies-used-in-globals.ll and fixing the fallout.

Aliases must have a GlobalValue or ConstantExpr aliasee and the aliasee must be a definition if it's a GlobalValue.
Don't RAUW functions with null if there's an alias pointing to it, and similarly don't delete the body of a function.
Don't delete the entire body of a function when reducing blocks, preserve at least one block.

Also make debugging these sorts of things easier by dumping the module when --abort-on-invalid-reduction triggers.

Reviewed By: regehr

Differential Revision: https://reviews.llvm.org/D131505
2022-08-12 10:39:05 -07:00
Arthur Eubanks bd1f80f54e [llvm-reduce] Add delta pass to run IR passes
The exact IR passes run is customizable via `-ir-passes`.

Reviewed By: regehr

Differential Revision: https://reviews.llvm.org/D123749
2022-08-12 10:38:19 -07:00
Arthur Eubanks 4982d8ac76 [test][llvm-reduce] Use opaque pointers in tests 2022-08-04 16:47:50 -07:00