Skip to content

Commit ab3b221

Browse files
committed
[LLVM] Trim intrinsics
1 parent 34d4f66 commit ab3b221

File tree

129 files changed

+784
-398
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+784
-398
lines changed

clang/test/SemaHLSL/GlobalConstructors.hlsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// REQUIRES: directx-registered-target
12
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -fsyntax-only %s -verify
23

34
int i;

llvm/CMakeLists.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,41 @@ set(LLVM_TARGETS_TO_BUILD
625625
${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
626626
list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
627627

628+
#set(ENABLED_INTRINSIC_TARGETS ${LLVM_ALL_TARGETS} ${LLVM_ALL_EXPERIMENTAL_TARGETS})
629+
set(ENABLED_INTRINSIC_TARGETS ${LLVM_TARGETS_TO_BUILD})
630+
631+
# Build a list of intrinsic target prefixes for targets that have been enabled.
632+
string(REPLACE ";" "," ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
633+
string(CONCAT ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}" ",")
634+
string(REPLACE "AMDGPU" "R600,AMDGCN" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
635+
string(REPLACE "PowerPC" "ppc" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
636+
string(REPLACE "SPIRV" "spv" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
637+
string(REPLACE "NVPTX" "nvvm" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
638+
string(REPLACE "DirectX" "dx" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
639+
string(REPLACE "WebAssembly" "wasm" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
640+
string(REPLACE "SystemZ" "s390" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
641+
# Remove target prefixes that do not have any intrinscs defined for them.
642+
string(REPLACE "M68k," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
643+
string(REPLACE "ARC," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
644+
string(REPLACE "AVR," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
645+
string(REPLACE "CSKY," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
646+
string(REPLACE "Lanai," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
647+
string(REPLACE "Sparc," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
648+
string(REPLACE "MSP430," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
649+
string(REPLACE "Xtensa," "" ENABLED_INTRINSIC_TARGETS "${ENABLED_INTRINSIC_TARGETS}")
650+
651+
# strip the last ,
652+
string(LENGTH "${ENABLED_INTRINSIC_TARGETS}" enabled_len)
653+
math(EXPR enabled_len "${enabled_len} - 1")
654+
string(SUBSTRING "${ENABLED_INTRINSIC_TARGETS}" 0 "${enabled_len}" ENABLED_INTRINSIC_TARGETS)
655+
if ("${ENABLED_INTRINSIC_TARGETS}" STREQUAL "")
656+
set(ENABLED_INTRINSIC_TARGETS "none")
657+
else()
658+
string(TOLOWER ${ENABLED_INTRINSIC_TARGETS} ENABLED_INTRINSIC_TARGETS)
659+
endif()
660+
message(STATUS "Enabling intrinsic targets: ${ENABLED_INTRINSIC_TARGETS}")
661+
set(ENABLED_INTRINSIC_TARGETS --enabled-targets=${ENABLED_INTRINSIC_TARGETS})
662+
628663
if (NOT CMAKE_SYSTEM_NAME MATCHES "OS390")
629664
option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
630665
endif()

llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ bool GIMatchTableExecutor::executeMatchTable(
889889
case GIM_CheckIntrinsicID: {
890890
uint64_t InsnID = readULEB();
891891
uint64_t OpIdx = readULEB();
892-
uint16_t Value = readU16();
892+
uint32_t Value = readU32();
893893
DEBUG_WITH_TYPE(TgtExecutor::getName(),
894894
dbgs() << CurrentIdx << ": GIM_CheckIntrinsicID(MIs["
895895
<< InsnID << "]->getOperand(" << OpIdx
@@ -1185,7 +1185,7 @@ bool GIMatchTableExecutor::executeMatchTable(
11851185
}
11861186
case GIR_AddIntrinsicID: {
11871187
uint64_t InsnID = readULEB();
1188-
uint16_t Value = readU16();
1188+
uint32_t Value = readU32();
11891189
assert(OutMIs[InsnID] && "Attempted to add to undefined instruction");
11901190
OutMIs[InsnID].addIntrinsicID((Intrinsic::ID)Value);
11911191
DEBUG_WITH_TYPE(TgtExecutor::getName(),

llvm/include/llvm/IR/CMakeLists.txt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ set(LLVM_TARGET_DEFINITIONS Attributes.td)
22
tablegen(LLVM Attributes.inc -gen-attrs)
33

44
set(LLVM_TARGET_DEFINITIONS Intrinsics.td)
5-
tablegen(LLVM IntrinsicImpl.inc -gen-intrinsic-impl)
6-
tablegen(LLVM IntrinsicEnums.inc -gen-intrinsic-enums)
7-
tablegen(LLVM IntrinsicsAArch64.h -gen-intrinsic-enums -intrinsic-prefix=aarch64)
8-
tablegen(LLVM IntrinsicsAMDGPU.h -gen-intrinsic-enums -intrinsic-prefix=amdgcn)
9-
tablegen(LLVM IntrinsicsARM.h -gen-intrinsic-enums -intrinsic-prefix=arm)
10-
tablegen(LLVM IntrinsicsBPF.h -gen-intrinsic-enums -intrinsic-prefix=bpf)
11-
tablegen(LLVM IntrinsicsDirectX.h -gen-intrinsic-enums -intrinsic-prefix=dx)
12-
tablegen(LLVM IntrinsicsHexagon.h -gen-intrinsic-enums -intrinsic-prefix=hexagon)
13-
tablegen(LLVM IntrinsicsLoongArch.h -gen-intrinsic-enums -intrinsic-prefix=loongarch)
14-
tablegen(LLVM IntrinsicsMips.h -gen-intrinsic-enums -intrinsic-prefix=mips)
15-
tablegen(LLVM IntrinsicsNVPTX.h -gen-intrinsic-enums -intrinsic-prefix=nvvm)
16-
tablegen(LLVM IntrinsicsPowerPC.h -gen-intrinsic-enums -intrinsic-prefix=ppc)
17-
tablegen(LLVM IntrinsicsR600.h -gen-intrinsic-enums -intrinsic-prefix=r600)
18-
tablegen(LLVM IntrinsicsRISCV.h -gen-intrinsic-enums -intrinsic-prefix=riscv)
19-
tablegen(LLVM IntrinsicsSPIRV.h -gen-intrinsic-enums -intrinsic-prefix=spv)
20-
tablegen(LLVM IntrinsicsS390.h -gen-intrinsic-enums -intrinsic-prefix=s390)
21-
tablegen(LLVM IntrinsicsWebAssembly.h -gen-intrinsic-enums -intrinsic-prefix=wasm)
22-
tablegen(LLVM IntrinsicsX86.h -gen-intrinsic-enums -intrinsic-prefix=x86)
23-
tablegen(LLVM IntrinsicsXCore.h -gen-intrinsic-enums -intrinsic-prefix=xcore)
24-
tablegen(LLVM IntrinsicsVE.h -gen-intrinsic-enums -intrinsic-prefix=ve)
5+
tablegen(LLVM IntrinsicImpl.inc -gen-intrinsic-impl ${ENABLED_INTRINSIC_TARGETS})
6+
tablegen(LLVM IntrinsicEnums.inc -gen-intrinsic-enums ${ENABLED_INTRINSIC_TARGETS})
7+
tablegen(LLVM IntrinsicsAArch64.h -gen-intrinsic-enums -intrinsic-prefix=aarch64 ${ENABLED_INTRINSIC_TARGETS})
8+
tablegen(LLVM IntrinsicsAMDGPU.h -gen-intrinsic-enums -intrinsic-prefix=amdgcn ${ENABLED_INTRINSIC_TARGETS})
9+
tablegen(LLVM IntrinsicsARM.h -gen-intrinsic-enums -intrinsic-prefix=arm ${ENABLED_INTRINSIC_TARGETS})
10+
tablegen(LLVM IntrinsicsBPF.h -gen-intrinsic-enums -intrinsic-prefix=bpf ${ENABLED_INTRINSIC_TARGETS})
11+
tablegen(LLVM IntrinsicsDirectX.h -gen-intrinsic-enums -intrinsic-prefix=dx ${ENABLED_INTRINSIC_TARGETS})
12+
tablegen(LLVM IntrinsicsHexagon.h -gen-intrinsic-enums -intrinsic-prefix=hexagon ${ENABLED_INTRINSIC_TARGETS})
13+
tablegen(LLVM IntrinsicsLoongArch.h -gen-intrinsic-enums -intrinsic-prefix=loongarch ${ENABLED_INTRINSIC_TARGETS})
14+
tablegen(LLVM IntrinsicsMips.h -gen-intrinsic-enums -intrinsic-prefix=mips ${ENABLED_INTRINSIC_TARGETS})
15+
tablegen(LLVM IntrinsicsNVPTX.h -gen-intrinsic-enums -intrinsic-prefix=nvvm ${ENABLED_INTRINSIC_TARGETS})
16+
tablegen(LLVM IntrinsicsPowerPC.h -gen-intrinsic-enums -intrinsic-prefix=ppc ${ENABLED_INTRINSIC_TARGETS})
17+
tablegen(LLVM IntrinsicsR600.h -gen-intrinsic-enums -intrinsic-prefix=r600 ${ENABLED_INTRINSIC_TARGETS})
18+
tablegen(LLVM IntrinsicsRISCV.h -gen-intrinsic-enums -intrinsic-prefix=riscv ${ENABLED_INTRINSIC_TARGETS})
19+
tablegen(LLVM IntrinsicsSPIRV.h -gen-intrinsic-enums -intrinsic-prefix=spv ${ENABLED_INTRINSIC_TARGETS})
20+
tablegen(LLVM IntrinsicsS390.h -gen-intrinsic-enums -intrinsic-prefix=s390 ${ENABLED_INTRINSIC_TARGETS})
21+
tablegen(LLVM IntrinsicsWebAssembly.h -gen-intrinsic-enums -intrinsic-prefix=wasm ${ENABLED_INTRINSIC_TARGETS})
22+
tablegen(LLVM IntrinsicsX86.h -gen-intrinsic-enums -intrinsic-prefix=x86 ${ENABLED_INTRINSIC_TARGETS})
23+
tablegen(LLVM IntrinsicsXCore.h -gen-intrinsic-enums -intrinsic-prefix=xcore ${ENABLED_INTRINSIC_TARGETS})
24+
tablegen(LLVM IntrinsicsVE.h -gen-intrinsic-enums -intrinsic-prefix=ve ${ENABLED_INTRINSIC_TARGETS})
2525
add_public_tablegen_target(intrinsics_gen)

llvm/include/llvm/IR/Intrinsics.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,21 @@ namespace Intrinsic {
4747
#define GET_INTRINSIC_ENUM_VALUES
4848
#include "llvm/IR/IntrinsicEnums.inc"
4949
#undef GET_INTRINSIC_ENUM_VALUES
50+
end_id = ~0U,
5051
};
5152

53+
// Is this a valid intrinsic ID. Validity means that it is a valid value of
54+
// a defined enum in Intrinsic::ID enum.
55+
bool IsIntrinsicIDValid(ID id);
56+
57+
// Is this an enabled intrinsic ID. This means that LLVM has support for this
58+
// intrinsic ID enabled.
59+
bool IsIntrinsicIDEnabled(ID id);
60+
61+
// Get the next valid ID. This is used in test cases that iterate over valid
62+
// intrinsic ID enums.
63+
ID GetNextValidIntrinsicID(ID id);
64+
5265
/// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
5366
/// Note, this version is for intrinsics with no overloads. Use the other
5467
/// version of getName if overloads are required.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//===- llvm/Support/IntrinsicID.h - Intrinsic ID encoding -------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file contains functions to support intrinsic ID encoding. The
10+
// Intrinsic::ID enum value is constructed using a target prefix index in bits
11+
// 23-16 (8-bit) and an intrinsic index (index within the list of intrinsics for
12+
// tha target) in lower 16 bits. To support Intrinsic::ID 0 being not used, the
13+
// intrinsic index is encoded as Index + 1 for all targets.
14+
//
15+
// This file defines functions that encapsulate this encoding.
16+
//
17+
//===----------------------------------------------------------------------===//
18+
19+
#ifndef LLVM_SUPPORT_INTRINSIC_ID_H
20+
#define LLVM_SUPPORT_INTRINSIC_ID_H
21+
22+
#include "llvm/Support/FormatVariadic.h"
23+
#include <limits>
24+
#include <optional>
25+
#include <utility>
26+
27+
namespace llvm::Intrinsic {
28+
typedef unsigned ID;
29+
30+
inline ID EncodeIntrinsicID(unsigned TargetIndex, unsigned IntrinsicIndex) {
31+
assert(IntrinsicIndex < std::numeric_limits<uint16_t>::max());
32+
assert(TargetIndex <= std::numeric_limits<uint8_t>::max());
33+
return (TargetIndex << 16) | (IntrinsicIndex + 1);
34+
}
35+
36+
inline std::pair<unsigned, unsigned> DecodeIntrinsicID(ID id) {
37+
unsigned IntrinsicIndex = id & 0xFFFF;
38+
unsigned TargetIndex = id >> 16;
39+
assert(IntrinsicIndex != 0);
40+
return {TargetIndex, IntrinsicIndex - 1};
41+
}
42+
43+
inline std::optional<std::pair<unsigned, unsigned>>
44+
DecodeIntrinsicIDNoFail(ID id) {
45+
unsigned IntrinsicIndex = id & 0xFFFF;
46+
unsigned TargetIndex = id >> 16;
47+
if (IntrinsicIndex == 0)
48+
return std::nullopt;
49+
return std::make_pair(TargetIndex, IntrinsicIndex - 1);
50+
}
51+
52+
inline void PrintIntrinsicIDEncoding(raw_ostream &OS, unsigned TargetIndex,
53+
unsigned IntrinsicIndex) {
54+
OS << formatv(" = ({} << 16) + {} + 1", TargetIndex, IntrinsicIndex);
55+
}
56+
57+
} // end namespace llvm::Intrinsic
58+
59+
#endif // LLVM_SUPPORT_INTRINSIC_ID_H

llvm/lib/CodeGen/MachineOperand.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,7 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
992992
}
993993
case MachineOperand::MO_IntrinsicID: {
994994
Intrinsic::ID ID = getIntrinsicID();
995-
if (ID < Intrinsic::num_intrinsics)
995+
if (Intrinsic::IsIntrinsicIDValid(ID))
996996
OS << "intrinsic(@" << Intrinsic::getBaseName(ID) << ')';
997997
else if (IntrinsicInfo)
998998
OS << "intrinsic(@" << IntrinsicInfo->getName(ID) << ')';

llvm/lib/CodeGen/MachineVerifier.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,7 +1055,7 @@ bool MachineVerifier::verifyGIntrinsicSideEffects(const MachineInstr *MI) {
10551055
bool NoSideEffects = Opcode == TargetOpcode::G_INTRINSIC ||
10561056
Opcode == TargetOpcode::G_INTRINSIC_CONVERGENT;
10571057
unsigned IntrID = cast<GIntrinsic>(MI)->getIntrinsicID();
1058-
if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1058+
if (IntrID != 0 && Intrinsic::IsIntrinsicIDValid(IntrID)) {
10591059
AttributeList Attrs = Intrinsic::getAttributes(
10601060
MF->getFunction().getContext(), static_cast<Intrinsic::ID>(IntrID));
10611061
bool DeclHasSideEffects = !Attrs.getMemoryEffects().doesNotAccessMemory();
@@ -1079,7 +1079,7 @@ bool MachineVerifier::verifyGIntrinsicConvergence(const MachineInstr *MI) {
10791079
bool NotConvergent = Opcode == TargetOpcode::G_INTRINSIC ||
10801080
Opcode == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS;
10811081
unsigned IntrID = cast<GIntrinsic>(MI)->getIntrinsicID();
1082-
if (IntrID != 0 && IntrID < Intrinsic::num_intrinsics) {
1082+
if (IntrID != 0 && Intrinsic::IsIntrinsicIDValid(IntrID)) {
10831083
AttributeList Attrs = Intrinsic::getAttributes(
10841084
MF->getFunction().getContext(), static_cast<Intrinsic::ID>(IntrID));
10851085
bool DeclIsConvergent = Attrs.hasFnAttr(Attribute::Convergent);

llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
160160
case ISD::INTRINSIC_W_CHAIN: {
161161
unsigned OpNo = getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 0 : 1;
162162
unsigned IID = getOperand(OpNo)->getAsZExtVal();
163-
if (IID < Intrinsic::num_intrinsics)
163+
if (Intrinsic::IsIntrinsicIDValid(IID))
164164
return Intrinsic::getBaseName((Intrinsic::ID)IID).str();
165165
if (!G)
166166
return "Unknown intrinsic";

llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4431,7 +4431,7 @@ void SelectionDAGISel::CannotYetSelect(SDNode *N) {
44314431
} else {
44324432
bool HasInputChain = N->getOperand(0).getValueType() == MVT::Other;
44334433
unsigned iid = N->getConstantOperandVal(HasInputChain);
4434-
if (iid < Intrinsic::num_intrinsics)
4434+
if (Intrinsic::IsIntrinsicIDValid(iid))
44354435
Msg << "intrinsic %" << Intrinsic::getBaseName((Intrinsic::ID)iid);
44364436
else if (const TargetIntrinsicInfo *TII = TM.getIntrinsicInfo())
44374437
Msg << "target intrinsic %" << TII->getName(iid);

0 commit comments

Comments
 (0)