Commit Graph

701 Commits

Author SHA1 Message Date
Matt Arsenault
bc37be1855 LangRef: Add "dynamic" option to "denormal-fp-math"
This is stricter than the default "ieee", and should probably be the
default. This patch leaves the default alone. I can change this in a
future patch.

There are non-reversible transforms I would like to perform which are
legal under IEEE denormal handling, but illegal with flushing zero
behavior. Namely, conversions between llvm.is.fpclass and fcmp with
zeroes.

Under "ieee" handling, it is legal to translate between
llvm.is.fpclass(x, fcZero) and fcmp x, 0.

Under "preserve-sign" handling, it is legal to translate between
llvm.is.fpclass(x, fcSubnormal|fcZero) and fcmp x, 0.

I would like to compile and distribute some math library functions in
a mode where it's callable from code with and without denormals
enabled, which requires not changing the compares with denormals or
zeroes.

If an IEEE function transforms an llvm.is.fpclass call into an fcmp 0,
it is no longer possible to call the function from code with denormals
enabled, or write an optimization to move the function into a denormal
flushing mode. For the original function, if x was a denormal, the
class would evaluate to false. If the function compiled with denormal
handling was converted to or called from a preserve-sign function, the
fcmp now evaluates to true.

This could also be of use for strictfp handling, where code may be
changing the denormal mode.

Alternative name could be "unknown".

Replaces the old AMDGPU custom inlining logic with more conservative
logic which tries to permit inlining for callees with dynamic handling
and avoids inlining other mismatched modes.
2023-04-29 08:44:59 -04:00
ManuelJBrito
8b56da5e9f [IR] Change shufflevector undef mask to poison
With this patch an undefined mask in a shufflevector will be printed as poison.
This change is done to support the new shufflevector semantics
for undefined mask elements.

Differential Revision: https://reviews.llvm.org/D149210
2023-04-27 14:41:10 +01:00
Simon Pilgrim
aa754f7e0f [IR] llvm::createMinMaxOp - create integer min/max intrinsics instead of icmp/sel
Based off D148215, when expanding a min/max reduction we should be creating min/max intrinsics directly instead of relying on instcombine to fold them back together.

This patch handles integer min/max cases. Hopefully we can add floating point support soon (at least for fastmath/nnan cases) - but we're missing some of the plumbing to pass the correct FMF to the intrinsic at the moment.

Differential Revision: https://reviews.llvm.org/D148221
2023-04-13 16:40:43 +01:00
Jay Foad
d4af896572 [PowerPC] Fix UNSUPPORTED syntax in addr-label.ll 2023-03-31 16:47:35 +01:00
Stefan Pintilie
471f1664f3 [NFC][PowerPC] Marked the addr-label.ll test unsupported on PowerPC.
The addr-label.ll test uses the following setup:

define ptr @test1() nounwind {
entry:
	ret ptr blockaddress(@test1b, %test_label)
}

define i32 @test1b() nounwind {
entry:
	ret i32 -1
test_label:
	br label %ret
ret:
	ret i32 -1
}

However, according to the LLVM Reference guide for blockaddress()
"This value only has defined behavior when used as an operand to the
‘indirectbr’ or for comparisons against null." For this test the value
is just returned as a pointer from test1().

On PowerPC this test has unreliable results as the order in which
passes are run can make this test pass or fail. If the %test_label
in test1b() is removed before a number of passes are completed on
test1() then this test will fail on PowerPC.

I have marked this test as UNSUPPORTED on PowerPC.
2023-03-31 10:41:23 -04:00
Momchil Velikov
99e57f06c4 [CodeGenPrepare] Increase the limit on the number of instructions to scan
... when finding all memory uses for an address and make it a
parameter.

Now that we have avoided potentially exponential run time of
`FindAllMemoryUses` in D143893. it'd be beneficial to increase the
limit up from 20.

Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D143894

Change-Id: I3abdf40332ef65e9b2f819ac32ac60e4200ec51d
2023-03-30 14:38:22 +01:00
Momchil Velikov
2453da0a4e [CodeGenPrepare] Fix counting uses when folding addresses into memory instructions
The counter of the number of instructions seen in `FindAllMemoryUses`
is reset after returning from a recursive invocation of
`FindAllMemoryUses` to the value it had before the call. In effect,
depending on the shape of the uses graph, the function may scan up to
`2^N-1` instructions where `N` is the scan limit
(`MaxMemoryUsesToScan`).  This does not look intuitive or intended.

This patch changes the counting to just count the scanned
instructions, independent of the shape of the references.

Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D143893

Change-Id: I99f5de55e84843cf2fbea287d6ae4312fa196240
2023-03-30 14:18:14 +01:00
Momchil Velikov
5c9a26238a [CodeGenPrepare][NFC] Pre-commit test for memory use count fix
Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D145705
2023-03-23 17:55:05 +00:00
Momchil Velikov
6a2a5f08de [CodeGenPrepare] Don't give up if unable to sink first arg to a cold call
Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D143892
2023-03-23 17:31:09 +00:00
Tim Northover
e4b352a0b9 Revert "DwarfEHPrepare: insert extra unwind paths for stack protector to instrument"
It's caused more failures than are trivially fixable.

This reverts commit 203b6f31bb.
2023-03-16 11:55:53 +00:00
Tim Northover
203b6f31bb DwarfEHPrepare: insert extra unwind paths for stack protector to instrument
This is a mitigation patch for
https://bugs.chromium.org/p/llvm/issues/detail?id=30, where existing stack
protection is skipped if a function is returned through by an unwinder rather
than the normal call/return path. The recent patch D139254 added the ability to
instrument a visible unwind path, at least in the IR case (I'm working on the
SelectionDAG instrumentation too) but there are still invisible unwinds it
can't reach.

So this patch adds logic to DwarfEHPrepare that goes through a function,
converting any call that might throw into an invoke to a simple resume cleanup,
and adding cleanup clauses to existing landingpads that lack them. Obviously we
don't really want to do this if it's wasted effort, so I also exposed
requiresStackProtector from the actual StackProtector code to skip the extra
paths if they won't be used.

https://reviews.llvm.org/D143637
2023-03-16 11:32:45 +00:00
Nikita Popov
bbfb13a5ff [ConstExpr] Remove select constant expression
This removes the select constant expression, as part of
https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179.
Uses of this expressions have already been removed in advance,
so this just removes related infrastructure and updates tests.

Differential Revision: https://reviews.llvm.org/D145382
2023-03-16 10:32:08 +01:00
Jonas Hahnfeld
e302c04cfa XFAIL new test available_externally_alias.ll on NVPTX 2023-02-01 10:15:19 +01:00
Jonas Hahnfeld
f1c4f927f7 [CodeGen] Filter out available_externally aliases
The Language Reference says that aliases can have available_externally
linkage if their aliasee is an available_externally global value. Using
this kind of aliases resulted in crashes during code generation, filter
them out (the same that the AsmPrinter also filters out GlobalVariables
in emitSpecialLLVMGlobal(); Functions are discarded in the machine pass
infrastructure).

Differential Revision: https://reviews.llvm.org/D142352
2023-02-01 09:40:30 +01:00
Paul Kirth
557a5bc336 [codegen] Add StackFrameLayoutAnalysisPass
Issue #58168 describes the difficulty diagnosing stack size issues
identified by -Wframe-larger-than. For simple code, its easy to
understand the stack layout and where space is being allocated, but in
more complex programs, where code may be heavily inlined, unrolled, and
have duplicated code paths, it is no longer easy to manually inspect the
source program and understand where stack space can be attributed.

This patch implements a machine function pass that emits remarks with a
textual representation of stack slots, and also outputs any available
debug information to map source variables to those slots.

The new behavior can be used by adding `-Rpass-analysis=stack-frame-layout`
to the compiler invocation. Like other remarks the diagnostic
information can be saved to a file in a machine readable format by
adding -fsave-optimzation-record.

Fixes: #58168

Reviewed By: nickdesaulniers, thegameg

Differential Revision: https://reviews.llvm.org/D135488
2023-01-19 01:51:14 +00:00
Paul Kirth
fdc0bf6adc Revert "[codegen] Add StackFrameLayoutAnalysisPass"
This breaks on some AArch64 bots

This reverts commit 0a652c5405.
2023-01-13 22:59:36 +00:00
Paul Kirth
0a652c5405 [codegen] Add StackFrameLayoutAnalysisPass
Issue #58168 describes the difficulty diagnosing stack size issues
identified by -Wframe-larger-than. For simple code, its easy to
understand the stack layout and where space is being allocated, but in
more complex programs, where code may be heavily inlined, unrolled, and
have duplicated code paths, it is no longer easy to manually inspect the
source program and understand where stack space can be attributed.

This patch implements a machine function pass that emits remarks with a
textual representation of stack slots, and also outputs any available
debug information to map source variables to those slots.

The new behavior can be used by adding `-Rpass-analysis=stack-frame-layout`
to the compiler invocation. Like other remarks the diagnostic
information can be saved to a file in a machine readable format by
adding -fsave-optimzation-record.

Fixes: #58168

Reviewed By: nickdesaulniers, thegameg

Differential Revision: https://reviews.llvm.org/D135488
2023-01-13 20:52:48 +00:00
Paul Walker
eae26b6640 [IRBuilder] Use canonical i64 type for insertelement index used by vector splats.
Instcombine prefers this canonical form (see getPreferredVectorIndex),
as does IRBuilder when passing the index as an integer so we may as
well use the prefered form from creation.

NOTE: All test changes are mechanical with nothing else expected
beyond a change of index type from i32 to i64.

Differential Revision: https://reviews.llvm.org/D140983
2023-01-11 14:08:06 +00:00
Nikita Popov
1c1755005e [CodeGen] Convert test to opaque pointers (NFC) 2022-12-22 13:57:35 +01:00
Nikita Popov
0e8bd5a44a [CodeGen] Convert some tests to opaque pointers (NFC) 2022-12-19 12:52:08 +01:00
Roman Lebedev
43145d8400 [NFC] Port codegen Generic tests that invoke opt to -passes= syntax 2022-12-09 01:04:47 +03:00
Roman Lebedev
b1a9584818 [opt] Disincentivize new tests from using old pass syntax
Over the past day or so, i've took a large swing at our tests,
and reduced the number of tests that were still using the old syntax
from ~1800 to just 200.

Left to handle: (as it is seen in this patch)
* Transforms/LSR
* Transforms/CGP
* Transforms/TypePromotion
* Transforms/HardwareLoops
* Analysis/*
* some misc.

I think this is the right point to start actively refusing
to honor the old syntax, except for the old tests,
to prevent the old syntax from creeping back in.

Thus, let's add temporary default-off flag,
and if it is not passed refuse to accept old syntax.
The tests that still need porting are annotated with this flag.

Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D139647
2022-12-08 23:54:03 +03:00
Nico Weber
bfe292b00f [llvm] Auto-cleanup left-over file from earlier version of this test on bots
When this test was originally added in 991dfedfd7, it didn't pass
`-o` to to llc, causing llc to write a .s file to the source directory.
On the next run, lit would then try to run that as a test.
Make the test auto-cleanup that file for a while.
2022-12-07 09:09:45 -05:00
Paul Robinson
5336b1ed75 [lit][AIX] Convert llvm tests to use 'target={{.*}}-aix{{.*}}'
Part of the project to eliminate special handling for triples in lit
expressions.

Differential Revision: https://reviews.llvm.org/D137436
2022-12-02 09:42:34 -08:00
Paul Robinson
3b259de708 [AVR] Convert test to check 'target=avr.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-12-01 13:41:10 -08:00
Paul Robinson
6e8b91f3b5 [AVR] Test XPASSes, remove the XFAIL
I built llvm with default triple avr-- and this test XPASSed
so it seems safe enough.
2022-12-01 13:40:22 -08:00
Paul Robinson
23ffadcf31 [XCore] Convert tests to check 'target=xcore.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-12-01 12:19:37 -08:00
Paul Robinson
f4e2d56a07 [Sparc] Convert tests to check 'target=sparc.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-12-01 11:41:30 -08:00
Paul Robinson
d4fbb93620 [Sparc] Remove an XFAIL
I built llvm with default triple sparc-sun-solaris2 and this test
XPASSed so it seems safe enough.
2022-12-01 11:37:22 -08:00
Paul Robinson
7db8ff32bd [AMDGPU] Convert test to check 'target=r600.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-12-01 10:49:38 -08:00
Paul Robinson
f4eb87f403 [NVPTX] Convert tests to check 'target=nvptx.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-12-01 09:01:48 -08:00
Paul Robinson
2fbcf8b9b3 [Hexagon] Convert tests to check 'target=hexagon-.*'
Part of the project to eliminate special handling for triples in lit
expressions.
2022-11-30 13:36:10 -08:00
Anton Sidorenko
8e3545a64e [Debugify] Accumulate the number of variables in debugify metadata
When a module contains more than one function, we should update debugify metadata
by increasing the number of variables in the function rather than overwritting it.

Previous revert issue is fixed: I forgot to strip all x86-related info from the
test.

Differential Revision: https://reviews.llvm.org/D136949
2022-11-25 10:53:55 +03:00
Anton Sidorenko
5e04d8b72e Revert "[Debugify] Accumulate the number of variables in debugify metadata"
This brokes some builds
This reverts commit a1bbe8a4e2.
2022-11-24 19:09:52 +03:00
Anton Sidorenko
a1bbe8a4e2 [Debugify] Accumulate the number of variables in debugify metadata
When a module contains more than one function, we should update debugify metadata
by increasing the number of variables in the function rather than overwritting it.

Differential Revision: https://reviews.llvm.org/D136949
2022-11-24 18:49:49 +03:00
Anton Sidorenko
0a77ff41da [Debugify] Precommit test for D136949 2022-11-24 18:17:11 +03:00
Anton Sidorenko
9ee8d2e081 [Debugify] Strip llvm.mir.debugify metadata
We don't strip llvm.mir.debugify metadata in `llvm::stripDebugifyMetadata`. This
may lead to incorrect number of lines and variables in the metadata when we run
debugify twice, e.g. -run-pass=mir-debugify,...,mir-strip-debug,...,mir-debugify.

Differential Revision: https://reviews.llvm.org/D138417
2022-11-24 12:20:21 +03:00
Anton Sidorenko
782196409a [Debugify] Add precommit test for D138417
Check that we erase `llvm.debugify` metadata, but forget to erase `llvm.mir.debugify`.
2022-11-24 12:19:39 +03:00
Paul Robinson
4f0a1201a4 [lit][REQUIRES] Fix some tests with incorrect REQUIRES clauses
These weren't running anywhere because of bad specifications.
One test has bit-rotted and had to be XFAILed, the rest are okay.

Differential Revision: https://reviews.llvm.org/D136612
2022-11-01 13:49:23 -07:00
Fraser Cormack
3362e2d57f [VP] Add IR expansion for vp.icmp and vp.fcmp
These intrinsics are simply expanded to regular icmp/fcmp instructions.

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D121594
2022-10-05 08:07:39 +01:00
Vitaly Buka
bbef90ace4 [IRBuilder] Use PoisonValue in CreateMasked*
Followup to 72b776168c

Reviewed By: nlopes

Differential Revision: https://reviews.llvm.org/D133967
2022-09-19 11:01:41 -07:00
Eric Wang
d8a2d3f7d4 [NFC][Regalloc] Introduce the RegAllocPriorityAdvisorAnalysis
This patch introduces the priority analysis and the priority advisor,
the default implementation, and the scaffolding for introducing the
other implementations of the advisor.

Reviewed By: mtrofin

Differential Revision: https://reviews.llvm.org/D132835
2022-09-08 07:50:03 -07:00
Lorenzo Albano
c00a44fa68 [VP] IR expansion pass for VP gather and scatter
Add vp_gather and vp_scatter expansion to unpredicated intrinsics.

Reviewed By: simoll

Differential Revision: https://reviews.llvm.org/D120664
2022-07-18 17:00:38 +02:00
Lorenzo Albano
f390781cec [VP] Implementing expansion pass for VP load and store.
Added function to the ExpandVectorPredication pass to handle VP loads
and stores.

Reviewed By: simoll

Differential Revision: https://reviews.llvm.org/D109584
2022-07-18 08:47:54 +02:00
Nikita Popov
5548e807b5 [IR] Remove support for extractvalue constant expression
This removes the extractvalue constant expression, as part of
https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179.
extractvalue is already not supported in bitcode, so we do not need
to worry about bitcode auto-upgrade.

Uses of ConstantExpr::getExtractValue() should be replaced with
IRBuilder::CreateExtractValue() (if the fact that the result is
constant is not important) or ConstantFoldExtractValueInstruction()
(if it is). Though for this particular case, it is also possible
and usually preferable to use getAggregateElement() instead.

The C API function LLVMConstExtractValue() is removed, as the
underlying constant expression no longer exists. Instead,
LLVMBuildExtractValue() should be used (which will constant fold
or create an instruction). Depending on the use-case,
LLVMGetAggregateElement() may also be used instead.

Differential Revision: https://reviews.llvm.org/D125795
2022-06-28 10:40:17 +02:00
David Spickett
38eb4fe74b [llvm][DWARF] Move test using X86 triple into X86 tests
Fixes failure seen when building without X86 backend:
https://lab.llvm.org/buildbot/#/builders/171/builds/15124
2022-05-26 09:27:23 +00:00
Patrick Walton
256a52d9aa Round up zero-sized symbols to 1 byte in .debug_aranges.
This commit modifies the AsmPrinter to avoid emitting any zero-sized symbols to
the .debug_aranges table, by rounding their size up to 1. Entries with zero
length violate the DWARF 5 spec, which states:

> Each descriptor is a triple consisting of a segment selector, the beginning
> address within that segment of a range of text or data covered by some entry
> owned by the corresponding compilation unit, followed by the non-zero length
> of that range.

In practice, these zero-sized entries produce annoying warnings in lld and
cause GNU binutils to truncate the table when parsing it.

Other parts of LLVM, such as DWARFDebugARanges in the DebugInfo module
(specifically the appendRange method), already avoid emitting zero-sized
symbols to .debug_aranges, but not comprehensively in the AsmPrinter. In fact,
the AsmPrinter does try to avoid emitting such zero-sized symbols when labels
aren't involved, but doesn't when the symbol to emitted is a difference of two
labels; this patch extends that logic to handle the case in which the symbol is
defined via labels.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D126257
2022-05-25 13:31:36 -07:00
Simon Moll
6e12711081 [VP][fix] Don't discard masks in reductions
When expanding VP reductions to non VP-code, the reduction pass was
ignoring the mask before. Fix this by keeping the mask and selecting
neutral elements where the mask is zero.

Reviewed By: frasercrmck

Differential Revision: https://reviews.llvm.org/D126362
2022-05-25 15:54:45 +02:00
Igor Chebykin
541cbeeddb [NVPTX][tests] add "XFAIL: nvptx" for some tests
Some tests failed for NVPTX target, but it seems that NVPTX will be
fixed and the tests will pass. So, just mark the tests as XFAIL

Differential Revision: https://reviews.llvm.org/D124125
2022-04-26 17:26:56 +03:00
Igor Chebykin
84cf290c84 [NVPTX][tests] Do not run the tests which are not supported by nvptx
Some generic tests are not supported by the nvptx now.  Moreover, they
are no plans to fix the tested features in nvptx. So, suggest to mark
them as UNSUPPORTED

Differential Revision: https://reviews.llvm.org/D123928
2022-04-26 17:26:56 +03:00