50 Commits

Author SHA1 Message Date
Justin Bogner
f83697d69f
[DirectX] Handle byte type in DXILBitcodeWriter (#187157)
The byte type was introduced to LLVM IR in #186888. DXILBitcodeWriter
needs to handle this type by generating valid LLVM 3.7 era bitcode,
which is as simple as treating byte equivalently to an integer.
2026-03-25 20:57:08 +00:00
Alexis Engelke
01571f1b4a
[CodeGen] Drop uses of BranchInst (#186391)
Largely a straight-forward replacement with occasional simplifcations.

For AMDGPU, I assumed that unconditional branches are always uniform and
therefore "simplified"/changed AMDGPUAnnotateUniformValues to only
annotate conditional branches.

Target-specific FastISel only selects conditional branches,
unconditional branches are already handled by the non-target-specific
code.
2026-03-13 21:51:38 +00:00
Sarah Spall
f9a43de560
[DirectX] replace Br with UncondBr and CondBr in DXILBitCodeWriter (#185925)
replace Br with UncondBr and CondBr in DXILBitCodeWriter after #184027
2026-03-11 11:18:13 -07:00
Paul Walker
96d2cb4145
[LLVM][CodeGen][DirectX] Fix scalarisation when vector ConstantFP is used. (#172684)
When using -use-constant-fp-for-fixed-length-splat `splat (float C)`
becomes ConstantFP(C) rather than ConstantVector(C, C, C...).
2026-02-05 13:18:38 +00:00
Justin Bogner
a78f587a25
[DirectX] Fix dxc-compatible DataLayout in BitcodeWriter (#167410)
In #163587 we attempted to generate a dxc-compatible DataLayout when
emitting DXIL, but somehow got it wrong. Update using the DataLayout
that dxc emits verbatim.

Fixes #163882
2025-11-10 15:57:46 -08:00
Justin Bogner
c87e0e8fe0
[DirectX] Move triple/DL compat to bitcode writer (#163587)
Move our handling of setting up a compatible triple for DXIL to the
bitcode writer itself, and do the same for the datalayout. This avoids
us needing to temporarily change the triple just to change it back, and
it also allows us to make the datalayout truly compatible, including the
`i8:32` alignment that isn't accepted by modern LLVM's DataLayout.
2025-10-15 13:31:59 -06:00
Justin Bogner
40fbe32cba
[DirectX] Update DXILBitcodeWriter for #162255 (#162531)
Fix the build with the DirectX backend enabled by using `getUnversionedName()`
to match the updates of other similar uses of `getSourceLanguage()`.
2025-10-08 11:48:27 -07:00
Deric C.
13a634281f
[DirectX] Fix the writing of ConstantExpr GEPs to DXIL bitcode (#154446)
Fixes #153304

Changes:
- When writing `ConstantExpr` GEPs to DXIL bitcode, the bitcode writer
will use the old Constant Code `CST_CODE_CE_GEP_OLD = 12` instead of the
newer `CST_CODE_CE_GEP = 32` which is interpreted as an undef in DXIL.
Additional context: [CST_CODE_CE_GEP = 12 in
DXC](0c9e75e7e9/include/llvm/Bitcode/LLVMBitCodes.h (L187))
while the same constant code is labeled [CST_CODE_CE_GEP_OLD in
LLVM](65de318d18/llvm/include/llvm/Bitcode/LLVMBitCodes.h (L411))
- Modifies the `PointerTypeAnalysis` to be able to analyze pointer-typed
constants that appear in the operands of instructions so that the
correct type of the `ConstantExpr` GEP is determined and written into
the DXIL bitcode.
- Adds a `PointerTypeAnalysis` test and dxil-dis test to ensure that the
pointer type of `ConstantExpr` GEPs are resolved and `ConstantExpr` GEPs
are written to DXIL bitcode correctly

In addition, this PR also adds a missing call to
`GV.removeDeadConstantUsers()` in the DXILFinalizeLinkage pass, and
removes an unnecessary manual removal of a ConstantExpr in the
DXILFlattenArrays pass.
2025-08-26 10:01:59 -07:00
Deric C.
8f9ed78874
Revert "[DirectX] Legalize lifetime intrinsics for DXIL" (#149883)
Reverts llvm/llvm-project#148003 to fix a DirectX backend build breakage
due to #149310
2025-07-21 12:34:50 -07:00
Deric C.
fee27b3337
[DirectX] Legalize lifetime intrinsics for DXIL (#148003)
Fixes #147395

This PR legalizes lifetime intrinsics for DXIL by
- Adding a bitcast for the lifetime intrinsics' pointer operand in
dxil-prepare to ensure it gets cast to an `i8*` when written to DXIL
- Removing the memory attribute from lifetime intrinsics in dxil-prepare
to match DXIL
- Making the DXIL bitcode writer write the base/demangled name of
lifetime intrinsics to the symbol table
- Making lifetime intrinsics an exception to Int64Ops shader flag
analysis (otherwise we get `error: Flags must match usage.` from the
validator)
2025-07-11 12:26:53 -07:00
Justin Bogner
fe141c2426
[DirectX] Update for API change in #139406 (#139470)
getAsmString returns StringRef now. Fixes build for the DirectX backend.
2025-05-11 13:29:07 -07:00
Kazu Hirata
58014a506d
[IR] Teach getConstraintString to return StringRef (NFC) (#139401)
With this change, some callers get to use StringRef::starts_with.

I'm planning to teach getAsmString to return StringRef also, but
I'ld like to keep that separate from this patch.
2025-05-10 13:00:47 -07:00
Farzon Lotfi
c1bf5e6287
[DirectX] Fix build break caused by bitcode writer changes (#133770)
commit:
68947342b7
added a new `writeDIFixedPointType` function.
However, `DIFixedPointType` is not supported in DXIL so we need to add a
fail fast case for this to fix the build.

this change fixes a build break introduced by
https://github.com/llvm/llvm-project/pull/129596
2025-03-31 14:39:20 -04:00
Nikita Popov
979c275097
[IR] Store Triple in Module (NFC) (#129868)
The module currently stores the target triple as a string. This means
that any code that wants to actually use the triple first has to
instantiate a Triple, which is somewhat expensive. The change in #121652
caused a moderate compile-time regression due to this. While it would be
easy enough to work around, I think that architecturally, it makes more
sense to store the parsed Triple in the module, so that it can always be
directly queried.

For this change, I've opted not to add any magic conversions between
std::string and Triple for backwards-compatibilty purses, and instead
write out needed Triple()s or str()s explicitly. This is because I think
a decent number of them should be changed to work on Triple as well, to
avoid unnecessary conversions back and forth.

The only interesting part in this patch is that the default triple is
Triple("") instead of Triple() to preserve existing behavior. The former
defaults to using the ELF object format instead of unknown object
format. We should fix that as well.
2025-03-06 10:27:47 +01:00
Farzon Lotfi
df14dbd875
[DirectX] Fix build breaks (#128556)
1. Fix build break caused by #126772 by adding `writeDISubrangeType`
stub to `DXILBitcodeWriter.cpp`
2. Fix build break caused by #128480 by adding implementation of pure
virtual method `TargetSubtargetInfo::getRegisterInfo`
2025-02-24 16:42:15 -05:00
Nikita Popov
29441e4f5f
[IR] Convert from nocapture to captures(none) (#123181)
This PR removes the old `nocapture` attribute, replacing it with the new
`captures` attribute introduced in #116990. This change is
intended to be essentially NFC, replacing existing uses of `nocapture`
with `captures(none)` without adding any new analysis capabilities.
Making use of non-`none` values is left for a followup.

Some notes:
* `nocapture` will be upgraded to `captures(none)` by the bitcode
   reader.
* `nocapture` will also be upgraded by the textual IR reader. This is to
   make it easier to use old IR files and somewhat reduce the test churn in
   this PR.
* Helper APIs like `doesNotCapture()` will check for `captures(none)`.
* MLIR import will convert `captures(none)` into an `llvm.nocapture`
   attribute. The representation in the LLVM IR dialect should be updated
   separately.
2025-01-29 16:56:47 +01:00
Justin Bogner
31249e27f0
[DirectX] Avoid deprecated PointerUnion methods (#122972)
PointerUnion's `is`, `get`, and `dyn_cast` have been deprecated in
favour of using `isa`, `cast`, and `dyn_cast` directly. Migrate these
uses over.
2025-01-14 14:37:15 -07:00
Sarah Spall
ae6a7809b7
[HLSL] [DirectX] translate llvm fast math flags to llvm 3.7 fast math flags (#122025)
Translate modern LLVM fast math flags to LLVM 3.7 equivalent in DXIL
bitcode. Mostly use patch from #120630
Closes #120630
2025-01-08 10:09:44 -08:00
Tim Besard
49b57df161
DXIL: Use correct type ID when writing ValueAsMetadata. (#94337)
When emitting references to functions as part of `ValueAsMetadata`,
we currently emit the incorrect (typed) pointer, resulting in
crashes during deserialization. Avoid this by correctly mapping the
type during serialization.
2024-09-11 14:38:56 +02:00
James Y Knight
dfeb3991fb
Remove the x86_mmx IR type. (#98505)
It is now translated to `<1 x i64>`, which allows the removal of a bunch
of special casing.

This _incompatibly_ changes the ABI of any LLVM IR function with
`x86_mmx` arguments or returns: instead of passing in mmx registers,
they will now be passed via integer registers. However, the real-world
incompatibility caused by this is expected to be minimal, because Clang
never uses the x86_mmx type -- it lowers `__m64` to either `<1 x i64>`
or `double`, depending on ABI.

This change does _not_ eliminate the SelectionDAG `MVT::x86mmx` type.
That type simply no longer corresponds to an IR type, and is used only
by MMX intrinsics and inline-asm operands.

Because SelectionDAGBuilder only knows how to generate the
operands/results of intrinsics based on the IR type, it thus now
generates the intrinsics with the type MVT::v1i64, instead of
MVT::x86mmx. We need to fix this before the DAG LegalizeTypes, and thus
have the X86 backend fix them up in DAGCombine. (This may be a
short-lived hack, if all the MMX intrinsics can be removed in upcoming
changes.)

Works towards issue #98272.
2024-07-25 09:19:22 -04:00
Justin Bogner
c6e96a2605 [DirectX] Update for removal of icmp and fcmp constant expressions
The icmp and fcmp constant expressions were removed in deab451e7a7f
"[IR] Remove support for icmp and fcmp constant expressions (#93038)".
Update the DXILBitcodeWriter to stop referencing them.
2024-06-04 12:22:07 -07:00
Fangrui Song
c4dad9a6b6 [DirectX] Fix BitcodeWriter ctor after #92983 2024-05-30 14:22:50 -07:00
Jay Foad
1650f1b3d7
Fix typo "indicies" (#92232) 2024-05-15 13:10:16 +01:00
Kazu Hirata
af8d050286 [Target] Use range-based for loops (NFC) 2023-12-24 23:09:55 -08:00
Justin Bogner
d7f3b238fd [DXILBitcodeWriter] Fix handling of an unspecified lower bound in DISubrange
If the lower bound isn't specified it implies that it's zero.

Differential Revision: https://reviews.llvm.org/D158441
2023-08-21 14:30:45 -07:00
Justin Bogner
48e0a6f902 [DXILBitcodeWriter] Don't create a new abbrev per MDString
We were running out of abbrevs and crashing if there were more than 20
something strings in metadata, which turned out to be a bug where we
created an abbrev every time we emitted a string rather than just one
for the string table.

Differential Revision: https://reviews.llvm.org/D158440
2023-08-21 13:58:38 -07:00
Justin Bogner
245073ac80 [DirectX] Remove uses of isOpaquePointerTy(). NFC
isOpaquePointerTy now returns true for all pointers, so we can replace
these with isPointerTy().
2023-07-19 14:28:05 -07:00
Archibald Elliott
62c7f035b4 [NFC][TargetParser] Remove llvm/ADT/Triple.h
I also ran `git clang-format` to get the headers in the right order for
the new location, which has changed the order of other headers in two
files.
2023-02-07 12:39:46 +00:00
Xiang Li
e3becfacfd [DirectX backend] Remove unused bitcode block for dxil
DXIL doesn't need uselist strtab and symtab blocks which are not supported  by llvm3.7 bitcode.

Differential Revision: https://reviews.llvm.org/D141328
2023-01-09 19:06:33 -05:00
Joshua Cranmer
aa34a9d108 Add TargetExtTyID to switch statements in Hexagon and DXIL backend code. 2022-12-20 11:48:35 -05:00
Alex Richardson
f7ae55f03d [DirectX] Fix shared libraries build
I just tried to build all experimental targets and noticed that DirectX did
not build with -DBUILD_SHARED_LIBS=ON.

Differential Revision: https://reviews.llvm.org/D138431
2022-12-01 16:53:42 +00:00
Xiang Li
ad68c66a38 [DirectX backend] Fix build and test error caused by out of sync with upstream change.
Fix build and test error caused by
a2620e00ff#
and
304f1d59ca

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D137815
2022-11-14 12:50:23 -08:00
Xiang Li
a80a888de5 [DirectX backend] Support global ctor for DXILBitcodeWriter.
1. Save typed pointer type for GlobalVariable/Function instead of the ObjectType.
   This will allow use GlobalVariable/Function as value.
2. Save target type for global ctors for Constant.
3. In DXILBitcodeWriter::getTypeID, check PointerMap first for Constant case.

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D133283
2022-09-30 11:27:23 -07:00
Chris Bieneman
5d4dd53570 Revert "[DirectX backend] Support global ctor for DXILBitcodeWriter."
This reverts commit 26129766df701d462ed9a6a9a68a88b3564a70bd.

The reverted commit broke in-tree unit tests for the DirectX backend.
2022-09-29 11:58:27 -05:00
Xiang Li
26129766df [DirectX backend] Support global ctor for DXILBitcodeWriter.
1. Save typed pointer type for GlobalVariable/Function instead of the ObjectType.
   This will allow use GlobalVariable/Function as value.
2. Save target type for global ctors for Constant.
3. In DXILBitcodeWriter::getTypeID, check PointerMap first for Constant case.

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D133283
2022-09-28 13:23:56 -07:00
Chris Bieneman
eebf84c5b3 [DirectX] Remove broken assert
This assert always fails. It is unclear to me what it was attempting to
test, but removing it gets our tests passing, so it clearly isn't
checking the right thing.
2022-08-22 17:25:16 -05:00
Chris Bieneman
4579a0224c [NFC] Fix warning in asserts build
When asserts are enabled a warning for implicit conversion from 64-bit to
32-bit integer occurs here.
2022-08-19 17:48:22 -05:00
Xiang Li
dfde731df7 [DirectX] Fix crash on ShuffleVectorInst in DXILBitcodeWriter
Use onstantDataSequential::getElementType to allow vector type.

Use getShuffleMaskForBitcode to get ShuffleMask.

Use old format for alloca Align.

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D132102
2022-08-18 23:46:20 -07:00
Joshua Cranmer
2138c90645 [IR] Move support for dxil::TypedPointerType to LLVM core IR.
This allows the construct to be shared between different backends. However, it
still remains illegal to use TypedPointerType in LLVM IR--the type is intended
to remain an auxiliary type, not a real LLVM type. So no support is provided for
LLVM-C, nor bitcode, nor LLVM assembly (besides the bare minimum needed to make
Type->dump() work properly).

Reviewed By: beanz, nikic, aeubanks

Differential Revision: https://reviews.llvm.org/D130592
2022-08-04 10:41:11 -04:00
Dmitri Gribenko
aba43035bd Use llvm::sort instead of std::sort where possible
llvm::sort is beneficial even when we use the iterator-based overload,
since it can optionally shuffle the elements (to detect
non-determinism). However llvm::sort is not usable everywhere, for
example, in compiler-rt.

Reviewed By: nhaehnle

Differential Revision: https://reviews.llvm.org/D130406
2022-07-23 15:19:05 +02:00
Shilei Tian
1023ddaf77 [LLVM] Add the support for fmax and fmin in atomicrmw instruction
This patch adds the support for `fmax` and `fmin` operations in `atomicrmw`
instruction. For now (at least in this patch), the instruction will be expanded
to CAS loop. There are already a couple of targets supporting the feature. I'll
create another patch(es) to enable them accordingly.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D127041
2022-07-06 10:57:53 -04:00
Chris Bieneman
c967c3d39b [DirectX] Properly fix for MaybeAlign API removal
My last attempt caused a test case failure. This resovles the issue.
2022-06-28 21:53:59 -05:00
Chris Bieneman
072288dacd [DirectX] Fix broken build after API removal
This removes the DirectX backend's usage of the MaybeAlign API removed
in 1baf1fc.
2022-06-28 20:16:04 -05:00
Xiang Li
73ebb05e44 [DirectX] Support opaque ptr for ValueAsMetadata in DXILBitcodeWriter
When writeValueAsMetadata for GlobalVariable and Function, write TypedPointerType for ValueType and FunctionType.

Reviewed By: bogner

Differential Revision: https://reviews.llvm.org/D127705
2022-06-22 09:10:42 -07:00
Guillaume Chatelet
93082108b7 [NFC][Alignment] Use getAlign in DXILBitcodeWriter 2022-06-13 13:36:36 +00:00
Chris Bieneman
04d4130a51 Support converting pointers from opaque to typed
Using the pointer type analysis we can re-constitute typed pointers and
populate the correct types in the bitcasts throughout the IR.

This doesn't yet handle all cases, but this should be illustrative as
to the dirction and feasability of
the solution.

Reviewed By: pete

Differential Revision: https://reviews.llvm.org/D122270
2022-06-06 11:36:52 -05:00
Chris Bieneman
11dd508bd4 NFC. Clang-formatting.
Since the rest of the DirectX backend is pretty well clang-format
clean, this file should be too.
2022-05-24 11:51:00 -05:00
Chris Bieneman
05b765ff69 [DXIL] [NFC] Remove dead attribute code paths
DXIL doesn't support attributes added after LLVM 3.7. The DXILPrepare
pass removes those attributes so they should never be present by the
time we reach the DXIL bitcode writer.

In the event that we somehow try to write a newer attribute in the DXIL
writer, we should fail hard (crash), because the output would be
invalid. This case should only be possible if the DXIL writer were
called without DXILPrepare being run first, which shouldn't be possible.

This patch also adds a default case to the switch statement over the
attribute list which covers all the removed cases and any new attribute
kinds that may be added in the future. The default case is handled like
other unsupported cases by a call to llvm_unreachable.
2022-04-27 10:46:59 -05:00
Chris Bieneman
e6f44a3cd2 Add PointerType analysis for DirectX backend
As implemented this patch assumes that Typed pointer support remains in
the llvm::PointerType class, however this could be modified to use a
different subclass of llvm::Type that could be disallowed from use in
other contexts.

This does not rely on inserting typed pointers into the Module, it just
uses the llvm::PointerType class to track and unique types.

Fixes #54918

Reviewed By: kuhar

Differential Revision: https://reviews.llvm.org/D122268
2022-04-25 17:49:43 -05:00
Chris Bieneman
f2526c1a5c Add DXIL Bitcode Writer and DXIL testing
This change is a big blob of code that isn't easy to break up. It
either comes in all together as a blob, works and has tests, or it
doesn't do anything.

Logically you can think of this patch as three things:
(1) Adding virtual interfaces so the bitcode writer can be overridden
(2) Adding a new bitcode writer implementation for DXIL
(3) Adding some (optional) crazy CMake goop to build the
DirectXShaderCompiler's llvm-dis as dxil-dis for testing

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D122082
2022-04-15 18:50:26 -05:00