From 670c453aeb1931fbecd0be31ea9cb1cca113c1af Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Thu, 6 Nov 2025 10:15:18 -0600 Subject: [PATCH 01/71] [Offload] Remove handling for device memory pool (#163629) Summary: This was a lot of code that was only used for upstream LLVM builds of AMDGPU offloading. We have a generic and fast `malloc` in `libc` now so just use that. Simplifies code, can be added back if we start providing alternate forms but I don't think there's a single use-case that would justify it yet. --- offload/include/Shared/Environment.h | 22 ----- offload/plugins-nextgen/amdgpu/src/rtl.cpp | 14 --- .../common/include/PluginInterface.h | 23 ++--- .../common/src/PluginInterface.cpp | 86 ------------------- offload/plugins-nextgen/cuda/src/rtl.cpp | 5 -- offload/plugins-nextgen/host/src/rtl.cpp | 8 -- .../{offloading => libc}/malloc_parallel.c | 0 offload/test/mapping/lambda_mapping.cpp | 2 + offload/test/offloading/malloc.c | 2 +- openmp/device/include/Allocator.h | 6 -- openmp/device/src/Allocator.cpp | 67 ++++++++------- openmp/device/src/Kernel.cpp | 1 - openmp/device/src/Misc.cpp | 4 +- openmp/device/src/State.cpp | 24 +----- openmp/docs/design/Runtimes.rst | 1 - 15 files changed, 50 insertions(+), 215 deletions(-) rename offload/test/{offloading => libc}/malloc_parallel.c (100%) diff --git a/offload/include/Shared/Environment.h b/offload/include/Shared/Environment.h index 2a283bd6fa4ed..79e45fd8e082d 100644 --- a/offload/include/Shared/Environment.h +++ b/offload/include/Shared/Environment.h @@ -21,7 +21,6 @@ enum class DeviceDebugKind : uint32_t { Assertion = 1U << 0, FunctionTracing = 1U << 1, CommonIssues = 1U << 2, - AllocationTracker = 1U << 3, PGODump = 1U << 4, }; @@ -36,27 +35,6 @@ struct DeviceEnvironmentTy { uint64_t HardwareParallelism; }; -struct DeviceMemoryPoolTy { - void *Ptr; - uint64_t Size; -}; - -struct DeviceMemoryPoolTrackingTy { - uint64_t NumAllocations; - uint64_t AllocationTotal; - uint64_t AllocationMin; - uint64_t AllocationMax; - - void combine(DeviceMemoryPoolTrackingTy &Other) { - NumAllocations += Other.NumAllocations; - AllocationTotal += Other.AllocationTotal; - AllocationMin = AllocationMin > Other.AllocationMin ? Other.AllocationMin - : AllocationMin; - AllocationMax = AllocationMax < Other.AllocationMax ? Other.AllocationMax - : AllocationMax; - } -}; - // NOTE: Please don't change the order of those members as their indices are // used in the middle end. Always add the new data member at the end. // Different from KernelEnvironmentTy below, this structure contains members diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp index 928c6cd7569e3..04b394452a448 100644 --- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp +++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp @@ -3109,17 +3109,6 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy { StackSize = Value; return Plugin::success(); } - Error getDeviceHeapSize(uint64_t &Value) override { - Value = DeviceMemoryPoolSize; - return Plugin::success(); - } - Error setDeviceHeapSize(uint64_t Value) override { - for (DeviceImageTy *Image : LoadedImages) - if (auto Err = setupDeviceMemoryPool(Plugin, *Image, Value)) - return Err; - DeviceMemoryPoolSize = Value; - return Plugin::success(); - } Error getDeviceMemorySize(uint64_t &Value) override { for (AMDGPUMemoryPoolTy *Pool : AllMemoryPools) { if (Pool->isGlobal()) { @@ -3321,9 +3310,6 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy { /// Reference to the host device. AMDHostDeviceTy &HostDevice; - /// The current size of the global device memory pool (managed by us). - uint64_t DeviceMemoryPoolSize = 1L << 29L /*512MB=*/; - /// The current size of the stack that will be used in cases where it could /// not be statically determined. uint64_t StackSize = 16 * 1024 /* 16 KB */; diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h index f9dcdea7213fd..eac5ee215152e 100644 --- a/offload/plugins-nextgen/common/include/PluginInterface.h +++ b/offload/plugins-nextgen/common/include/PluginInterface.h @@ -819,10 +819,6 @@ struct GenericDeviceTy : public DeviceAllocatorTy { Error unloadBinary(DeviceImageTy *Image); virtual Error unloadBinaryImpl(DeviceImageTy *Image) = 0; - /// Setup the global device memory pool, if the plugin requires one. - Error setupDeviceMemoryPool(GenericPluginTy &Plugin, DeviceImageTy &Image, - uint64_t PoolSize); - // Setup the RPC server for this device if needed. This may not run on some // plugins like the CPU targets. By default, it will not be executed so it is // up to the target to override this using the shouldSetupRPCServer function. @@ -1067,6 +1063,15 @@ struct GenericDeviceTy : public DeviceAllocatorTy { virtual Error getDeviceStackSize(uint64_t &V) = 0; + virtual Error getDeviceHeapSize(uint64_t &V) { + return Plugin::error(error::ErrorCode::UNSUPPORTED, + "%s not supported by platform", __func__); + } + virtual Error setDeviceHeapSize(uint64_t V) { + return Plugin::error(error::ErrorCode::UNSUPPORTED, + "%s not supported by platform", __func__); + } + /// Returns true if current plugin architecture is an APU /// and unified_shared_memory was not requested by the program. bool useAutoZeroCopy(); @@ -1159,12 +1164,6 @@ struct GenericDeviceTy : public DeviceAllocatorTy { /// plugin can implement the setters as no-op and setting the output /// value to zero for the getters. virtual Error setDeviceStackSize(uint64_t V) = 0; - virtual Error getDeviceHeapSize(uint64_t &V) = 0; - virtual Error setDeviceHeapSize(uint64_t V) = 0; - - /// Indicate whether the device should setup the global device memory pool. If - /// false is return the value on the device will be uninitialized. - virtual bool shouldSetupDeviceMemoryPool() const { return true; } /// Indicate whether or not the device should setup the RPC server. This is /// only necessary for unhosted targets like the GPU. @@ -1251,10 +1250,6 @@ struct GenericDeviceTy : public DeviceAllocatorTy { /// Internal representation for OMPT device (initialize & finalize) std::atomic OmptInitialized; #endif - -private: - DeviceMemoryPoolTy DeviceMemoryPool = {nullptr, 0}; - DeviceMemoryPoolTrackingTy DeviceMemoryPoolTracking = {0, 0, ~0U, 0}; }; /// Class implementing common functionalities of offload plugins. Each plugin diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index d7e5a21600abf..3ed3cb1cc13b8 100644 --- a/offload/plugins-nextgen/common/src/PluginInterface.cpp +++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp @@ -795,19 +795,6 @@ Error GenericDeviceTy::unloadBinary(DeviceImageTy *Image) { if (auto Err = callGlobalDestructors(Plugin, *Image)) return Err; - if (OMPX_DebugKind.get() & uint32_t(DeviceDebugKind::AllocationTracker)) { - GenericGlobalHandlerTy &GHandler = Plugin.getGlobalHandler(); - DeviceMemoryPoolTrackingTy ImageDeviceMemoryPoolTracking = {0, 0, ~0U, 0}; - GlobalTy TrackerGlobal("__omp_rtl_device_memory_pool_tracker", - sizeof(DeviceMemoryPoolTrackingTy), - &ImageDeviceMemoryPoolTracking); - if (auto Err = - GHandler.readGlobalFromDevice(*this, *Image, TrackerGlobal)) { - consumeError(std::move(Err)); - } - DeviceMemoryPoolTracking.combine(ImageDeviceMemoryPoolTracking); - } - GenericGlobalHandlerTy &Handler = Plugin.getGlobalHandler(); auto ProfOrErr = Handler.readProfilingGlobals(*this, *Image); if (!ProfOrErr) @@ -833,22 +820,6 @@ Error GenericDeviceTy::deinit(GenericPluginTy &Plugin) { return Err; LoadedImages.clear(); - if (OMPX_DebugKind.get() & uint32_t(DeviceDebugKind::AllocationTracker)) { - // TODO: Write this by default into a file. - printf("\n\n|-----------------------\n" - "| Device memory tracker:\n" - "|-----------------------\n" - "| #Allocations: %lu\n" - "| Byes allocated: %lu\n" - "| Minimal allocation: %lu\n" - "| Maximal allocation: %lu\n" - "|-----------------------\n\n\n", - DeviceMemoryPoolTracking.NumAllocations, - DeviceMemoryPoolTracking.AllocationTotal, - DeviceMemoryPoolTracking.AllocationMin, - DeviceMemoryPoolTracking.AllocationMax); - } - // Delete the memory manager before deinitializing the device. Otherwise, // we may delete device allocations after the device is deinitialized. if (MemoryManager) @@ -901,18 +872,6 @@ Expected GenericDeviceTy::loadBinary(GenericPluginTy &Plugin, // Add the image to list. LoadedImages.push_back(Image); - // Setup the global device memory pool if needed. - if (!Plugin.getRecordReplay().isReplaying() && - shouldSetupDeviceMemoryPool()) { - uint64_t HeapSize; - auto SizeOrErr = getDeviceHeapSize(HeapSize); - if (SizeOrErr) { - REPORT("No global device memory pool due to error: %s\n", - toString(std::move(SizeOrErr)).data()); - } else if (auto Err = setupDeviceMemoryPool(Plugin, *Image, HeapSize)) - return std::move(Err); - } - if (auto Err = setupRPCServer(Plugin, *Image)) return std::move(Err); @@ -936,51 +895,6 @@ Expected GenericDeviceTy::loadBinary(GenericPluginTy &Plugin, return Image; } -Error GenericDeviceTy::setupDeviceMemoryPool(GenericPluginTy &Plugin, - DeviceImageTy &Image, - uint64_t PoolSize) { - // Free the old pool, if any. - if (DeviceMemoryPool.Ptr) { - if (auto Err = dataDelete(DeviceMemoryPool.Ptr, - TargetAllocTy::TARGET_ALLOC_DEVICE)) - return Err; - } - - DeviceMemoryPool.Size = PoolSize; - auto AllocOrErr = dataAlloc(PoolSize, /*HostPtr=*/nullptr, - TargetAllocTy::TARGET_ALLOC_DEVICE); - if (AllocOrErr) { - DeviceMemoryPool.Ptr = *AllocOrErr; - } else { - auto Err = AllocOrErr.takeError(); - REPORT("Failure to allocate device memory for global memory pool: %s\n", - toString(std::move(Err)).data()); - DeviceMemoryPool.Ptr = nullptr; - DeviceMemoryPool.Size = 0; - } - - // Create the metainfo of the device environment global. - GenericGlobalHandlerTy &GHandler = Plugin.getGlobalHandler(); - if (!GHandler.isSymbolInImage(*this, Image, - "__omp_rtl_device_memory_pool_tracker")) { - DP("Skip the memory pool as there is no tracker symbol in the image."); - return Error::success(); - } - - GlobalTy TrackerGlobal("__omp_rtl_device_memory_pool_tracker", - sizeof(DeviceMemoryPoolTrackingTy), - &DeviceMemoryPoolTracking); - if (auto Err = GHandler.writeGlobalToDevice(*this, Image, TrackerGlobal)) - return Err; - - // Create the metainfo of the device environment global. - GlobalTy DevEnvGlobal("__omp_rtl_device_memory_pool", - sizeof(DeviceMemoryPoolTy), &DeviceMemoryPool); - - // Write device environment values to the device. - return GHandler.writeGlobalToDevice(*this, Image, DevEnvGlobal); -} - Error GenericDeviceTy::setupRPCServer(GenericPluginTy &Plugin, DeviceImageTy &Image) { // The plugin either does not need an RPC server or it is unavailable. diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp index a9adcc397fb7b..fc3e7710622a2 100644 --- a/offload/plugins-nextgen/cuda/src/rtl.cpp +++ b/offload/plugins-nextgen/cuda/src/rtl.cpp @@ -1235,11 +1235,6 @@ struct CUDADeviceTy : public GenericDeviceTy { return Info; } - virtual bool shouldSetupDeviceMemoryPool() const override { - /// We use the CUDA malloc for now. - return false; - } - /// Getters and setters for stack and heap sizes. Error getDeviceStackSize(uint64_t &Value) override { return getCtxLimit(CU_LIMIT_STACK_SIZE, Value); diff --git a/offload/plugins-nextgen/host/src/rtl.cpp b/offload/plugins-nextgen/host/src/rtl.cpp index eb4ecac9907a1..48de1fefa29d6 100644 --- a/offload/plugins-nextgen/host/src/rtl.cpp +++ b/offload/plugins-nextgen/host/src/rtl.cpp @@ -380,9 +380,6 @@ struct GenELF64DeviceTy : public GenericDeviceTy { return Info; } - /// This plugin should not setup the device environment or memory pool. - virtual bool shouldSetupDeviceMemoryPool() const override { return false; }; - /// Getters and setters for stack size and heap size not relevant. Error getDeviceStackSize(uint64_t &Value) override { Value = 0; @@ -391,11 +388,6 @@ struct GenELF64DeviceTy : public GenericDeviceTy { Error setDeviceStackSize(uint64_t Value) override { return Plugin::success(); } - Error getDeviceHeapSize(uint64_t &Value) override { - Value = 0; - return Plugin::success(); - } - Error setDeviceHeapSize(uint64_t Value) override { return Plugin::success(); } private: /// Grid values for Generic ELF64 plugins. diff --git a/offload/test/offloading/malloc_parallel.c b/offload/test/libc/malloc_parallel.c similarity index 100% rename from offload/test/offloading/malloc_parallel.c rename to offload/test/libc/malloc_parallel.c diff --git a/offload/test/mapping/lambda_mapping.cpp b/offload/test/mapping/lambda_mapping.cpp index 63b1719fbbc36..8e640b7fff3aa 100644 --- a/offload/test/mapping/lambda_mapping.cpp +++ b/offload/test/mapping/lambda_mapping.cpp @@ -4,6 +4,8 @@ // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic // RUN: %libomptarget-compileoptxx-run-and-check-generic +// REQUIRES: libc + #include template diff --git a/offload/test/offloading/malloc.c b/offload/test/offloading/malloc.c index 7b98e1f1110e5..04e72561d3127 100644 --- a/offload/test/offloading/malloc.c +++ b/offload/test/offloading/malloc.c @@ -10,7 +10,7 @@ int main() { int Threads = 64; int Teams = 10; - // Allocate ~55MB on the device. + // Allocate ~160 KiB on the device. #pragma omp target map(from : DP) DP = (long unsigned *)malloc(sizeof(long unsigned) * N * Threads * Teams); diff --git a/openmp/device/include/Allocator.h b/openmp/device/include/Allocator.h index dc4d029ed75f3..507ec6327126a 100644 --- a/openmp/device/include/Allocator.h +++ b/openmp/device/include/Allocator.h @@ -14,18 +14,12 @@ #include "DeviceTypes.h" -// Forward declaration. -struct KernelEnvironmentTy; - namespace ompx { namespace allocator { static uint64_t constexpr ALIGNMENT = 16; -/// Initialize the allocator according to \p KernelEnvironment -void init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment); - /// Allocate \p Size bytes. [[gnu::alloc_size(1), gnu::assume_aligned(ALIGNMENT), gnu::malloc]] void * alloc(uint64_t Size); diff --git a/openmp/device/src/Allocator.cpp b/openmp/device/src/Allocator.cpp index aac2a6005158e..34c945c979ffb 100644 --- a/openmp/device/src/Allocator.cpp +++ b/openmp/device/src/Allocator.cpp @@ -18,42 +18,36 @@ #include "Synchronization.h" using namespace ompx; +using namespace allocator; + +// Provide a default implementation of malloc / free for AMDGPU platforms built +// without 'libc' support. +extern "C" { +#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) +[[gnu::weak]] void *malloc(size_t Size) { return allocator::alloc(Size); } +[[gnu::weak]] void free(void *Ptr) { allocator::free(Ptr); } +#else +[[gnu::leaf]] void *malloc(size_t Size); +[[gnu::leaf]] void free(void *Ptr); +#endif +} -[[gnu::used, gnu::retain, gnu::weak, - gnu::visibility( - "protected")]] DeviceMemoryPoolTy __omp_rtl_device_memory_pool; -[[gnu::used, gnu::retain, gnu::weak, - gnu::visibility("protected")]] DeviceMemoryPoolTrackingTy - __omp_rtl_device_memory_pool_tracker; +static constexpr uint64_t MEMORY_SIZE = /* 1 MiB */ 1024 * 1024; +alignas(ALIGNMENT) static uint8_t Memory[MEMORY_SIZE] = {0}; -/// Stateless bump allocator that uses the __omp_rtl_device_memory_pool -/// directly. +// Fallback bump pointer interface for platforms without a functioning +// allocator. struct BumpAllocatorTy final { + uint64_t Offset = 0; void *alloc(uint64_t Size) { Size = utils::roundUp(Size, uint64_t(allocator::ALIGNMENT)); - if (config::isDebugMode(DeviceDebugKind::AllocationTracker)) { - atomic::add(&__omp_rtl_device_memory_pool_tracker.NumAllocations, 1, - atomic::seq_cst); - atomic::add(&__omp_rtl_device_memory_pool_tracker.AllocationTotal, Size, - atomic::seq_cst); - atomic::min(&__omp_rtl_device_memory_pool_tracker.AllocationMin, Size, - atomic::seq_cst); - atomic::max(&__omp_rtl_device_memory_pool_tracker.AllocationMax, Size, - atomic::seq_cst); - } - - uint64_t *Data = - reinterpret_cast(&__omp_rtl_device_memory_pool.Ptr); - uint64_t End = - reinterpret_cast(Data) + __omp_rtl_device_memory_pool.Size; - - uint64_t OldData = atomic::add(Data, Size, atomic::seq_cst); - if (OldData + Size > End) + uint64_t OldData = atomic::add(&Offset, Size, atomic::seq_cst); + if (OldData + Size >= MEMORY_SIZE) __builtin_trap(); - return reinterpret_cast(OldData); + return &Memory[OldData]; } void free(void *) {} @@ -65,13 +59,20 @@ BumpAllocatorTy BumpAllocator; /// ///{ -void allocator::init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment) { - // TODO: Check KernelEnvironment for an allocator choice as soon as we have - // more than one. +void *allocator::alloc(uint64_t Size) { +#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) + return BumpAllocator.alloc(Size); +#else + return ::malloc(Size); +#endif } -void *allocator::alloc(uint64_t Size) { return BumpAllocator.alloc(Size); } - -void allocator::free(void *Ptr) { BumpAllocator.free(Ptr); } +void allocator::free(void *Ptr) { +#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) + BumpAllocator.free(Ptr); +#else + ::free(Ptr); +#endif +} ///} diff --git a/openmp/device/src/Kernel.cpp b/openmp/device/src/Kernel.cpp index 8c2828b270419..05af35d242ac5 100644 --- a/openmp/device/src/Kernel.cpp +++ b/openmp/device/src/Kernel.cpp @@ -41,7 +41,6 @@ inititializeRuntime(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment, synchronize::init(IsSPMD); mapping::init(IsSPMD); state::init(IsSPMD, KernelEnvironment, KernelLaunchEnvironment); - allocator::init(IsSPMD, KernelEnvironment); workshare::init(IsSPMD); } diff --git a/openmp/device/src/Misc.cpp b/openmp/device/src/Misc.cpp index 563f674d166e5..a53fb4302fdb5 100644 --- a/openmp/device/src/Misc.cpp +++ b/openmp/device/src/Misc.cpp @@ -100,7 +100,7 @@ void *omp_alloc(size_t size, omp_allocator_handle_t allocator) { case omp_const_mem_alloc: case omp_high_bw_mem_alloc: case omp_low_lat_mem_alloc: - return malloc(size); + return ompx::allocator::alloc(size); default: return nullptr; } @@ -113,7 +113,7 @@ void omp_free(void *ptr, omp_allocator_handle_t allocator) { case omp_const_mem_alloc: case omp_high_bw_mem_alloc: case omp_low_lat_mem_alloc: - free(ptr); + ompx::allocator::free(ptr); return; case omp_null_allocator: default: diff --git a/openmp/device/src/State.cpp b/openmp/device/src/State.cpp index 475395102f47b..9f38cf26f8c6f 100644 --- a/openmp/device/src/State.cpp +++ b/openmp/device/src/State.cpp @@ -44,26 +44,6 @@ using namespace ompx; namespace { -/// Fallback implementations are missing to trigger a link time error. -/// Implementations for new devices, including the host, should go into a -/// dedicated begin/end declare variant. -/// -///{ -extern "C" { -#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) - -[[gnu::weak]] void *malloc(size_t Size) { return allocator::alloc(Size); } -[[gnu::weak]] void free(void *Ptr) { allocator::free(Ptr); } - -#else - -[[gnu::weak, gnu::leaf]] void *malloc(size_t Size); -[[gnu::weak, gnu::leaf]] void free(void *Ptr); - -#endif -} -///} - /// A "smart" stack in shared memory. /// /// The stack exposes a malloc/free interface but works like a stack internally. @@ -171,13 +151,13 @@ void memory::freeShared(void *Ptr, uint64_t Bytes, const char *Reason) { } void *memory::allocGlobal(uint64_t Bytes, const char *Reason) { - void *Ptr = malloc(Bytes); + void *Ptr = allocator::alloc(Bytes); if (config::isDebugMode(DeviceDebugKind::CommonIssues) && Ptr == nullptr) printf("nullptr returned by malloc!\n"); return Ptr; } -void memory::freeGlobal(void *Ptr, const char *Reason) { free(Ptr); } +void memory::freeGlobal(void *Ptr, const char *Reason) { allocator::free(Ptr); } ///} diff --git a/openmp/docs/design/Runtimes.rst b/openmp/docs/design/Runtimes.rst index cd78a5ba88e2c..1b6f30ae73a33 100644 --- a/openmp/docs/design/Runtimes.rst +++ b/openmp/docs/design/Runtimes.rst @@ -1521,5 +1521,4 @@ debugging features are supported. * Enable debugging assertions in the device. ``0x01`` * Enable diagnosing common problems during offloading . ``0x4`` - * Enable device malloc statistics (amdgpu only). ``0x8`` * Dump device PGO counters (only if PGO on GPU is enabled). ``0x10`` From faae161914ffc24f09421a552b20581bedc6c7dd Mon Sep 17 00:00:00 2001 From: Vijay Kandiah Date: Thu, 6 Nov 2025 10:20:00 -0600 Subject: [PATCH 02/71] [mlir][acc] Erase empty kernel_environment ops during canonicalization (#166633) This change removes empty `acc.kernel_environment` operations during canonicalization. This could happen when the acc compute construct inside the `acc.kernel_environment` is optimized away in cases such as when only private variables are being written to in the loop. In cases of empty `acc.kernel_environment` ops with waitOperands, we still remove the empty `acc.kernel_environment`, but also create an `acc.wait` operation to take those wait operands to preserve synchronization behavior. --- .../mlir/Dialect/OpenACC/OpenACCOps.td | 2 + mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp | 68 +++++++++++++++++++ mlir/test/Dialect/OpenACC/canonicalize.mlir | 27 ++++++++ 3 files changed, 97 insertions(+) diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td index c689b7e46ea9e..5b89f741e296d 100644 --- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td @@ -2184,6 +2184,8 @@ def OpenACC_KernelEnvironmentOp : OpenACC_Op<"kernel_environment", ) $region attr-dict }]; + + let hasCanonicalizer = 1; } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp index b2f1d840f3bca..8c9c137b8aebb 100644 --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -1042,6 +1042,65 @@ struct RemoveConstantIfConditionWithRegion : public OpRewritePattern { } }; +/// Remove empty acc.kernel_environment operations. If the operation has wait +/// operands, create a acc.wait operation to preserve synchronization. +struct RemoveEmptyKernelEnvironment + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(acc::KernelEnvironmentOp op, + PatternRewriter &rewriter) const override { + assert(op->getNumRegions() == 1 && "expected op to have one region"); + + Block &block = op.getRegion().front(); + if (!block.empty()) + return failure(); + + // Conservatively disable canonicalization of empty acc.kernel_environment + // operations if the wait operands in the kernel_environment cannot be fully + // represented by acc.wait operation. + + // Disable canonicalization if device type is not the default + if (auto deviceTypeAttr = op.getWaitOperandsDeviceTypeAttr()) { + for (auto attr : deviceTypeAttr) { + if (auto dtAttr = mlir::dyn_cast(attr)) { + if (dtAttr.getValue() != mlir::acc::DeviceType::None) + return failure(); + } + } + } + + // Disable canonicalization if any wait segment has a devnum + if (auto hasDevnumAttr = op.getHasWaitDevnumAttr()) { + for (auto attr : hasDevnumAttr) { + if (auto boolAttr = mlir::dyn_cast(attr)) { + if (boolAttr.getValue()) + return failure(); + } + } + } + + // Disable canonicalization if there are multiple wait segments + if (auto segmentsAttr = op.getWaitOperandsSegmentsAttr()) { + if (segmentsAttr.size() > 1) + return failure(); + } + + // Remove empty kernel environment. + // Preserve synchronization by creating acc.wait operation if needed. + if (!op.getWaitOperands().empty() || op.getWaitOnlyAttr()) + rewriter.replaceOpWithNewOp(op, op.getWaitOperands(), + /*asyncOperand=*/Value(), + /*waitDevnum=*/Value(), + /*async=*/nullptr, + /*ifCond=*/Value()); + else + rewriter.eraseOp(op); + + return success(); + } +}; + //===----------------------------------------------------------------------===// // Recipe Region Helpers //===----------------------------------------------------------------------===// @@ -2690,6 +2749,15 @@ void acc::HostDataOp::getCanonicalizationPatterns(RewritePatternSet &results, results.add>(context); } +//===----------------------------------------------------------------------===// +// KernelEnvironmentOp +//===----------------------------------------------------------------------===// + +void acc::KernelEnvironmentOp::getCanonicalizationPatterns( + RewritePatternSet &results, MLIRContext *context) { + results.add(context); +} + //===----------------------------------------------------------------------===// // LoopOp //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/OpenACC/canonicalize.mlir b/mlir/test/Dialect/OpenACC/canonicalize.mlir index fdc8e6b5cae6e..38d3df31305ad 100644 --- a/mlir/test/Dialect/OpenACC/canonicalize.mlir +++ b/mlir/test/Dialect/OpenACC/canonicalize.mlir @@ -219,3 +219,30 @@ func.func @update_unnecessary_computations(%x: memref) { // CHECK-LABEL: func.func @update_unnecessary_computations // CHECK-NOT: acc.atomic.update // CHECK: acc.atomic.write + +// ----- + +func.func @kernel_environment_canonicalization(%q1: i32, %q2: i32, %q3: i32) { + // Empty kernel_environment (no wait) - should be removed + acc.kernel_environment { + } + + acc.kernel_environment wait({%q1 : i32, %q2 : i32}) { + } + + acc.kernel_environment wait { + } + + acc.kernel_environment wait({%q3 : i32} [#acc.device_type]) { + } + + return +} + +// CHECK-LABEL: func.func @kernel_environment_canonicalization +// CHECK-SAME: ([[Q1:%.*]]: i32, [[Q2:%.*]]: i32, [[Q3:%.*]]: i32) +// CHECK-NOT: acc.kernel_environment wait({{.*}}[#acc.device_type]) +// CHECK: acc.wait([[Q1]], [[Q2]] : i32, i32) +// CHECK: acc.wait{{$}} +// CHECK: acc.kernel_environment wait({{.*}}[#acc.device_type]) +// CHECK: return From bda72894bb5ddc766cda0a4eda376a4a262c3845 Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Thu, 6 Nov 2025 16:27:22 +0000 Subject: [PATCH 03/71] [lldb][docs][NFC] Fix ClangModulesDeclVendor::AddModule parameter docs --- .../ExpressionParser/Clang/ClangModulesDeclVendor.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h index ad4d060319e31..debf4761175b8 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h @@ -41,11 +41,11 @@ class ClangModulesDeclVendor : public DeclVendor { /// The path to the exact module to be loaded. E.g., if the desired /// module is std.io, then this should be { "std", "io" }. /// - /// \param[in] exported_modules + /// \param[out] exported_modules /// If non-NULL, a pointer to a vector to populate with the ID of every /// module that is re-exported by the specified module. /// - /// \param[in] error_stream + /// \param[out] error_stream /// A stream to populate with the output of the Clang parser when /// it tries to load the module. /// @@ -63,11 +63,11 @@ class ClangModulesDeclVendor : public DeclVendor { /// \param[in] cu /// The compilation unit to scan for imported modules. /// - /// \param[in] exported_modules + /// \param[out] exported_modules /// A vector to populate with the ID of each module loaded (directly /// and via re-exports) in this way. /// - /// \param[in] error_stream + /// \param[out] error_stream /// A stream to populate with the output of the Clang parser when /// it tries to load the modules. /// From 71927ddb63ac095c29a3b336097a846fb5b389ad Mon Sep 17 00:00:00 2001 From: Sergei Barannikov Date: Thu, 6 Nov 2025 19:45:29 +0300 Subject: [PATCH 04/71] [CodeGen] Delete two ComputeValueVTs overloads (NFC) (#166758) Those have only a few uses. --- llvm/include/llvm/CodeGen/Analysis.h | 16 +--------------- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 7 ++++--- .../CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 4 ++-- llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp | 3 ++- llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp | 3 ++- 5 files changed, 11 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/CodeGen/Analysis.h b/llvm/include/llvm/CodeGen/Analysis.h index 98b52579d03b7..2f1364d199710 100644 --- a/llvm/include/llvm/CodeGen/Analysis.h +++ b/llvm/include/llvm/CodeGen/Analysis.h @@ -71,7 +71,7 @@ void ComputeValueTypes(const DataLayout &DL, Type *Ty, /// void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl &ValueVTs, - SmallVectorImpl *MemVTs, + SmallVectorImpl *MemVTs = nullptr, SmallVectorImpl *Offsets = nullptr, TypeSize StartingOffset = TypeSize::getZero()); void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, @@ -80,20 +80,6 @@ void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl *FixedOffsets, uint64_t StartingOffset); -/// Variant of ComputeValueVTs that don't produce memory VTs. -inline void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, - Type *Ty, SmallVectorImpl &ValueVTs, - SmallVectorImpl *Offsets = nullptr, - TypeSize StartingOffset = TypeSize::getZero()) { - ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, Offsets, StartingOffset); -} -inline void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, - Type *Ty, SmallVectorImpl &ValueVTs, - SmallVectorImpl *FixedOffsets, - uint64_t StartingOffset) { - ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, FixedOffsets, StartingOffset); -} - /// computeValueLLTs - Given an LLVM IR type, compute a sequence of /// LLTs that represent all the individual underlying /// non-aggregate types that comprise it. diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp index b3c312569736f..7be7468300569 100644 --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -292,7 +292,8 @@ void CallLowering::splitToValueTypes(const ArgInfo &OrigArg, LLVMContext &Ctx = OrigArg.Ty->getContext(); SmallVector SplitVTs; - ComputeValueVTs(*TLI, DL, OrigArg.Ty, SplitVTs, Offsets, 0); + ComputeValueVTs(*TLI, DL, OrigArg.Ty, SplitVTs, /*MemVTs=*/nullptr, Offsets, + 0); if (SplitVTs.size() == 0) return; @@ -996,7 +997,7 @@ void CallLowering::insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy, SmallVector SplitVTs; SmallVector Offsets; - ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, &Offsets, 0); + ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0); assert(VRegs.size() == SplitVTs.size()); @@ -1028,7 +1029,7 @@ void CallLowering::insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy, SmallVector SplitVTs; SmallVector Offsets; - ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, &Offsets, 0); + ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0); assert(VRegs.size() == SplitVTs.size()); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 9961c982bdf3c..f14d80ae190d8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4758,7 +4758,7 @@ void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) { SmallVector Offsets; const Value *SrcV = I.getOperand(0); ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), - SrcV->getType(), ValueVTs, &Offsets, 0); + SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0); assert(ValueVTs.size() == 1 && Offsets[0] == 0 && "expect a single EVT for swifterror"); @@ -4794,7 +4794,7 @@ void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) { SmallVector ValueVTs; SmallVector Offsets; ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty, - ValueVTs, &Offsets, 0); + ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0); assert(ValueVTs.size() == 1 && Offsets[0] == 0 && "expect a single EVT for swifterror"); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp index 1b559a628be08..f5081a9d2dd56 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp @@ -1248,7 +1248,8 @@ void AMDGPUTargetLowering::analyzeFormalArgumentsCompute( SmallVector ValueVTs; SmallVector Offsets; - ComputeValueVTs(*this, DL, BaseArgTy, ValueVTs, &Offsets, ArgOffset); + ComputeValueVTs(*this, DL, BaseArgTy, ValueVTs, /*MemVTs=*/nullptr, + &Offsets, ArgOffset); for (unsigned Value = 0, NumValues = ValueVTs.size(); Value != NumValues; ++Value) { diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp index 2f1a7ad2d401f..a3deb36074e68 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -305,7 +305,8 @@ static void ComputePTXValueVTs(const TargetLowering &TLI, const DataLayout &DL, uint64_t StartingOffset = 0) { SmallVector TempVTs; SmallVector TempOffsets; - ComputeValueVTs(TLI, DL, Ty, TempVTs, &TempOffsets, StartingOffset); + ComputeValueVTs(TLI, DL, Ty, TempVTs, /*MemVTs=*/nullptr, &TempOffsets, + StartingOffset); for (const auto [VT, Off] : zip(TempVTs, TempOffsets)) { MVT RegisterVT = TLI.getRegisterTypeForCallingConv(Ctx, CallConv, VT); From 5f08fb4d72f6cdccc0d605bedae076962a6523d7 Mon Sep 17 00:00:00 2001 From: Daniel Thornburgh Date: Thu, 6 Nov 2025 08:52:46 -0800 Subject: [PATCH 05/71] [IR] llvm.reloc.none intrinsic for no-op symbol references (#147427) This intrinsic emits a BFD_RELOC_NONE relocation at the point of call, which allows optimizations and languages to explicitly pull in symbols from static libraries without there being any code or data that has an effectual relocation against such a symbol. See issue #146159 for context. --- llvm/docs/LangRef.rst | 31 + llvm/include/llvm/CodeGen/ISDOpcodes.h | 3 + llvm/include/llvm/CodeGen/SelectionDAGISel.h | 1 + llvm/include/llvm/IR/Intrinsics.td | 3 + llvm/include/llvm/Support/TargetOpcodes.def | 3 + llvm/include/llvm/Target/Target.td | 5 + llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 11 + llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 7 + .../SelectionDAG/SelectionDAGBuilder.cpp | 11 + .../SelectionDAG/SelectionDAGDumper.cpp | 2 + .../CodeGen/SelectionDAG/SelectionDAGISel.cpp | 8 + llvm/lib/IR/Verifier.cpp | 6 + llvm/test/CodeGen/Generic/reloc-none.ll | 10 + .../Inputs/reference_x86_vocab_print.txt | 1 + .../reference_x86_vocab_wo=0.5_print.txt | 1 + .../test/CodeGen/X86/GlobalISel/reloc-none.ll | 14 + .../match-table-cxx.td | 2 +- llvm/test/TableGen/get-named-operand-idx.td | 3 +- llvm/test/Verifier/reloc-none.ll | 13 + .../llvm-ir2vec/output/reference_triplets.txt | 52 +- .../output/reference_x86_entities.txt | 11239 ++++++++-------- 21 files changed, 5779 insertions(+), 5647 deletions(-) create mode 100644 llvm/test/CodeGen/Generic/reloc-none.ll create mode 100644 llvm/test/CodeGen/X86/GlobalISel/reloc-none.ll create mode 100644 llvm/test/Verifier/reloc-none.ll diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index b9507a2d054fe..bd0337f25c758 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -30968,6 +30968,37 @@ This intrinsic does nothing, but optimizers must consider it a use of its single operand and should try to preserve the intrinsic and its position in the function. +.. _llvm_reloc_none: + +'``llvm.reloc.none``' Intrinsic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Syntax: +""""""" + +:: + + declare void @llvm.reloc.none(metadata !) + +Overview: +""""""""" + +The ``llvm.reloc.none`` intrinsic emits a no-op relocation against a given +operand symbol. This can bring the symbol definition into the link without +emitting any code or data to the binary for that purpose. + +Arguments: +"""""""""" + +The ``llvm.reloc.none`` intrinsic takes the symbol as a metadata string +argument. + +Semantics: +"""""""""" + +This intrinsic emits a no-op relocation for the symbol at the location of the +intrinsic call. + Stack Map Intrinsics -------------------- diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h index ff3dd0d4c3c51..af60c04513ea7 100644 --- a/llvm/include/llvm/CodeGen/ISDOpcodes.h +++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h @@ -1537,6 +1537,9 @@ enum NodeType { #define BEGIN_REGISTER_VP_SDNODE(VPSDID, ...) VPSDID, #include "llvm/IR/VPIntrinsics.def" + // Issue a no-op relocation against a given symbol at the current location. + RELOC_NONE, + // The `llvm.experimental.convergence.*` intrinsics. CONVERGENCECTRL_ANCHOR, CONVERGENCECTRL_ENTRY, diff --git a/llvm/include/llvm/CodeGen/SelectionDAGISel.h b/llvm/include/llvm/CodeGen/SelectionDAGISel.h index d7921c3eb3f7c..27acc83369f02 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGISel.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGISel.h @@ -474,6 +474,7 @@ class SelectionDAGISel { void Select_WRITE_REGISTER(SDNode *Op); void Select_UNDEF(SDNode *N); void Select_FAKE_USE(SDNode *N); + void Select_RELOC_NONE(SDNode *N); void CannotYetSelect(SDNode *N); void Select_FREEZE(SDNode *N); diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index 6a079f62dd9cf..520130c6dcb4c 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -1913,6 +1913,9 @@ def int_threadlocal_address : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [LLVMMatch def int_stepvector : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [], [IntrNoMem]>; +def int_reloc_none : DefaultAttrsIntrinsic<[], [llvm_metadata_ty], + [IntrNoMem, IntrHasSideEffects]>; + //===---------------- Vector Predication Intrinsics --------------===// // Memory Intrinsics def int_vp_store : DefaultAttrsIntrinsic<[], diff --git a/llvm/include/llvm/Support/TargetOpcodes.def b/llvm/include/llvm/Support/TargetOpcodes.def index e55314568d683..fb20da336dda0 100644 --- a/llvm/include/llvm/Support/TargetOpcodes.def +++ b/llvm/include/llvm/Support/TargetOpcodes.def @@ -233,6 +233,9 @@ HANDLE_TARGET_OPCODE(MEMBARRIER) // using. HANDLE_TARGET_OPCODE(JUMP_TABLE_DEBUG_INFO) +// Issue a no-op relocation against a given symbol at the current location. +HANDLE_TARGET_OPCODE(RELOC_NONE) + HANDLE_TARGET_OPCODE(CONVERGENCECTRL_ENTRY) HANDLE_TARGET_OPCODE(CONVERGENCECTRL_ANCHOR) HANDLE_TARGET_OPCODE(CONVERGENCECTRL_LOOP) diff --git a/llvm/include/llvm/Target/Target.td b/llvm/include/llvm/Target/Target.td index 13175177edd3e..db99885121ec1 100644 --- a/llvm/include/llvm/Target/Target.td +++ b/llvm/include/llvm/Target/Target.td @@ -1554,6 +1554,11 @@ def JUMP_TABLE_DEBUG_INFO : StandardPseudoInstruction { let Size = 0; let isMeta = true; } +def RELOC_NONE : StandardPseudoInstruction { + let OutOperandList = (outs); + let InOperandList = (ins unknown:$symbol); + let hasSideEffects = true; +} let hasSideEffects = false, isMeta = true, isConvergent = true in { def CONVERGENCECTRL_ANCHOR : StandardPseudoInstruction { diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 713277d0bc5e0..3aa245b7f3f1e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2087,6 +2087,17 @@ void AsmPrinter::emitFunctionBody() { // This is only used to influence register allocation behavior, no // actual initialization is needed. break; + case TargetOpcode::RELOC_NONE: { + // Generate a temporary label for the current PC. + MCSymbol *Sym = OutContext.createTempSymbol("reloc_none"); + OutStreamer->emitLabel(Sym); + const MCExpr *Dot = MCSymbolRefExpr::create(Sym, OutContext); + const MCExpr *Value = MCSymbolRefExpr::create( + OutContext.getOrCreateSymbol(MI.getOperand(0).getSymbolName()), + OutContext); + OutStreamer->emitRelocDirective(*Dot, "BFD_RELOC_NONE", Value, SMLoc()); + break; + } default: emitInstruction(&MI); diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index be1b51f546819..4f6a19fe6633b 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2686,6 +2686,13 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID, case Intrinsic::experimental_convergence_entry: case Intrinsic::experimental_convergence_loop: return translateConvergenceControlIntrinsic(CI, ID, MIRBuilder); + case Intrinsic::reloc_none: { + Metadata *MD = cast(CI.getArgOperand(0))->getMetadata(); + StringRef SymbolName = cast(MD)->getString(); + MIRBuilder.buildInstr(TargetOpcode::RELOC_NONE) + .addExternalSymbol(SymbolName.data()); + return true; + } } return false; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index f14d80ae190d8..2f598b2f03e24 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -7811,6 +7811,17 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, return; } + case Intrinsic::reloc_none: { + Metadata *MD = cast(I.getArgOperand(0))->getMetadata(); + StringRef SymbolName = cast(MD)->getString(); + SDValue Ops[2] = { + getRoot(), + DAG.getTargetExternalSymbol( + SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))}; + DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops)); + return; + } + case Intrinsic::eh_exceptionpointer: case Intrinsic::eh_exceptioncode: { // Get the exception pointer vreg, copy from it, and resize it to fit. diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp index 77377d348b836..d3e162879304d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp @@ -472,6 +472,8 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const { case ISD::LIFETIME_END: return "lifetime.end"; case ISD::FAKE_USE: return "fake_use"; + case ISD::RELOC_NONE: + return "reloc_none"; case ISD::PSEUDO_PROBE: return "pseudoprobe"; case ISD::GC_TRANSITION_START: return "gc_transition.start"; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 6c11c5b815b6b..8bc5d2f3e421f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2550,6 +2550,11 @@ void SelectionDAGISel::Select_FAKE_USE(SDNode *N) { N->getOperand(1), N->getOperand(0)); } +void SelectionDAGISel::Select_RELOC_NONE(SDNode *N) { + CurDAG->SelectNodeTo(N, TargetOpcode::RELOC_NONE, N->getValueType(0), + N->getOperand(1), N->getOperand(0)); +} + void SelectionDAGISel::Select_FREEZE(SDNode *N) { // TODO: We don't have FREEZE pseudo-instruction in MachineInstr-level now. // If FREEZE instruction is added later, the code below must be changed as @@ -3325,6 +3330,9 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch, case ISD::FAKE_USE: Select_FAKE_USE(NodeToMatch); return; + case ISD::RELOC_NONE: + Select_RELOC_NONE(NodeToMatch); + return; case ISD::FREEZE: Select_FREEZE(NodeToMatch); return; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 24f90bf6de7f5..f1e473a78e3ac 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6013,6 +6013,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { Check(cast(Call.getArgOperand(3))->getZExtValue() < 2, "cache type argument to llvm.prefetch must be 0-1", Call); break; + case Intrinsic::reloc_none: { + Check(isa( + cast(Call.getArgOperand(0))->getMetadata()), + "llvm.reloc.none argument must be a metadata string", &Call); + break; + } case Intrinsic::stackprotector: Check(isa(Call.getArgOperand(1)->stripPointerCasts()), "llvm.stackprotector parameter #2 must resolve to an alloca.", Call); diff --git a/llvm/test/CodeGen/Generic/reloc-none.ll b/llvm/test/CodeGen/Generic/reloc-none.ll new file mode 100644 index 0000000000000..0c8b7a57aca83 --- /dev/null +++ b/llvm/test/CodeGen/Generic/reloc-none.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s | FileCheck %s + +; CHECK: .reloc {{.*}}, BFD_RELOC_NONE, foo + +define void @test_reloc_none() { + call void @llvm.reloc.none(metadata !"foo") + ret void +} + +declare void @llvm.reloc.none(metadata) diff --git a/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_print.txt b/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_print.txt index 000c67efb1de7..8af4277f12c65 100644 --- a/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_print.txt +++ b/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_print.txt @@ -1531,6 +1531,7 @@ Key: RDSSPQ: [ 0.00 0.00 ] Key: RDTSC: [ 0.00 0.00 ] Key: RDTSCP: [ 0.00 0.00 ] Key: REG_SEQUENCE: [ 0.00 0.00 ] +Key: RELOC_NONE: [ 0.00 0.00 ] Key: REPNE_PREFIX: [ 0.00 0.00 ] Key: REP_MOVSB: [ 0.00 0.00 ] Key: REP_MOVSD: [ 0.00 0.00 ] diff --git a/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_wo=0.5_print.txt b/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_wo=0.5_print.txt index bb72886f73bfd..e13342641d359 100644 --- a/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_wo=0.5_print.txt +++ b/llvm/test/CodeGen/MIR2Vec/Inputs/reference_x86_vocab_wo=0.5_print.txt @@ -1531,6 +1531,7 @@ Key: RDSSPQ: [ 0.00 0.00 ] Key: RDTSC: [ 0.00 0.00 ] Key: RDTSCP: [ 0.00 0.00 ] Key: REG_SEQUENCE: [ 0.00 0.00 ] +Key: RELOC_NONE: [ 0.00 0.00 ] Key: REPNE_PREFIX: [ 0.00 0.00 ] Key: REP_MOVSB: [ 0.00 0.00 ] Key: REP_MOVSD: [ 0.00 0.00 ] diff --git a/llvm/test/CodeGen/X86/GlobalISel/reloc-none.ll b/llvm/test/CodeGen/X86/GlobalISel/reloc-none.ll new file mode 100644 index 0000000000000..841c9a6d62d9e --- /dev/null +++ b/llvm/test/CodeGen/X86/GlobalISel/reloc-none.ll @@ -0,0 +1,14 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=CHECK + +define void @test_reloc_none() { +; CHECK-LABEL: test_reloc_none: +; CHECK: # %bb.0: +; CHECK-NEXT: .Lreloc_none0: +; CHECK-NEXT: .reloc .Lreloc_none0, BFD_RELOC_NONE, foo +; CHECK-NEXT: retq + call void @llvm.reloc.none(metadata !"foo") + ret void +} + +declare void @llvm.reloc.none(metadata) diff --git a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td index 18960b43ab97d..3170f2c06c00b 100644 --- a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td +++ b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td @@ -96,7 +96,7 @@ def MyCombiner: GICombiner<"GenMyCombiner", [ // CHECK: const uint8_t *GenMyCombiner::getMatchTable() const { // CHECK-NEXT: constexpr static uint8_t MatchTable0[] = { -// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(99), GIMT_Encode2(211), /*)*//*default:*//*Label 5*/ GIMT_Encode4(524), +// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(100), GIMT_Encode2(212), /*)*//*default:*//*Label 5*/ GIMT_Encode4(524), // CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(458), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), // CHECK-NEXT: /* 182 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(476), GIMT_Encode4(0), // CHECK-NEXT: /* 190 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(488), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), diff --git a/llvm/test/TableGen/get-named-operand-idx.td b/llvm/test/TableGen/get-named-operand-idx.td index 4500ad1638c17..8bb4f2f68b5fe 100644 --- a/llvm/test/TableGen/get-named-operand-idx.td +++ b/llvm/test/TableGen/get-named-operand-idx.td @@ -95,7 +95,8 @@ def InstD : InstBase { // CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, +// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, +// CHECK-NEXT: 0, // CHECK-NEXT: }; // CHECK-NEXT: return InstructionIndex[Opcode]; // CHECK-NEXT: } diff --git a/llvm/test/Verifier/reloc-none.ll b/llvm/test/Verifier/reloc-none.ll new file mode 100644 index 0000000000000..9c96799a36a36 --- /dev/null +++ b/llvm/test/Verifier/reloc-none.ll @@ -0,0 +1,13 @@ +; RUN: not llvm-as -disable-output 2>&1 %s | FileCheck %s + +; CHECK: llvm.reloc.none argument must be a metadata string +; CHECK-NEXT: call void @llvm.reloc.none(metadata !0) + +define void @test_reloc_none_bad_arg() { + call void @llvm.reloc.none(metadata !0) + ret void +} + +declare void @llvm.reloc.none(metadata) + +!0 = !{} diff --git a/llvm/test/tools/llvm-ir2vec/output/reference_triplets.txt b/llvm/test/tools/llvm-ir2vec/output/reference_triplets.txt index 141a56ad10903..ec061ff9185f2 100644 --- a/llvm/test/tools/llvm-ir2vec/output/reference_triplets.txt +++ b/llvm/test/tools/llvm-ir2vec/output/reference_triplets.txt @@ -1,33 +1,33 @@ MAX_RELATION=4 -187 7051 1 -187 6948 2 -187 187 0 -187 7051 1 +187 7052 1 187 6949 2 +187 187 0 +187 7052 1 +187 6950 2 187 10 0 -10 7051 1 -10 7051 2 -10 7051 3 -10 6941 4 +10 7052 1 +10 7052 2 +10 7052 3 +10 6942 4 10 187 0 -187 6932 1 -187 7051 2 -187 1543 0 -1543 6862 1 -1543 6932 2 -187 7051 1 -187 6948 2 -187 187 0 -187 7051 1 +187 6933 1 +187 7052 2 +187 1544 0 +1544 6863 1 +1544 6933 2 +187 7052 1 187 6949 2 +187 187 0 +187 7052 1 +187 6950 2 187 601 0 -601 7051 1 -601 7051 2 -601 7051 3 -601 6941 4 +601 7052 1 +601 7052 2 +601 7052 3 +601 6942 4 601 187 0 -187 6932 1 -187 7051 2 -187 1543 0 -1543 6862 1 -1543 6932 2 +187 6933 1 +187 7052 2 +187 1544 0 +1544 6863 1 +1544 6933 2 diff --git a/llvm/test/tools/llvm-ir2vec/output/reference_x86_entities.txt b/llvm/test/tools/llvm-ir2vec/output/reference_x86_entities.txt index dbbbbc746a769..1b90a8a75a80e 100644 --- a/llvm/test/tools/llvm-ir2vec/output/reference_x86_entities.txt +++ b/llvm/test/tools/llvm-ir2vec/output/reference_x86_entities.txt @@ -1,4 +1,4 @@ -7151 +7152 AAA 0 AAD 1 AADD 2 @@ -1532,5621 +1532,5622 @@ RDSSPQ 1529 RDTSC 1530 RDTSCP 1531 REG_SEQUENCE 1532 -REPNE_PREFIX 1533 -REP_MOVSB 1534 -REP_MOVSD 1535 -REP_MOVSQ 1536 -REP_MOVSW 1537 -REP_PREFIX 1538 -REP_STOSB 1539 -REP_STOSD 1540 -REP_STOSQ 1541 -REP_STOSW 1542 -RET 1543 -RETI 1544 -REX 1545 -RMPADJUST 1546 -RMPQUERY 1547 -RMPUPDATE 1548 -ROL 1549 -ROR 1550 -RORX 1551 -ROUNDPDmi 1552 -ROUNDPDri 1553 -ROUNDPSmi 1554 -ROUNDPSri 1555 -ROUNDSDmi 1556 -ROUNDSDmi_Int 1557 -ROUNDSDri 1558 -ROUNDSDri_Int 1559 -ROUNDSSmi 1560 -ROUNDSSmi_Int 1561 -ROUNDSSri 1562 -ROUNDSSri_Int 1563 -RSM 1564 -RSQRTPSm 1565 -RSQRTPSr 1566 -RSQRTSSm 1567 -RSQRTSSm_Int 1568 -RSQRTSSr 1569 -RSQRTSSr_Int 1570 -RSTORSSP 1571 -SAHF 1572 -SALC 1573 -SAR 1574 -SARX 1575 -SAVEPREVSSP 1576 -SBB 1577 -SCASB 1578 -SCASL 1579 -SCASQ 1580 -SCASW 1581 -SEAMCALL 1582 -SEAMOPS 1583 -SEAMRET 1584 -SEG_ALLOCA 1585 -SEH_BeginEpilogue 1586 -SEH_EndEpilogue 1587 -SEH_EndPrologue 1588 -SEH_PushFrame 1589 -SEH_PushReg 1590 -SEH_SaveReg 1591 -SEH_SaveXMM 1592 -SEH_SetFrame 1593 -SEH_StackAlign 1594 -SEH_StackAlloc 1595 -SEH_UnwindV 1596 -SEH_UnwindVersion 1597 -SENDUIPI 1598 -SERIALIZE 1599 -SETB_C 1600 -SETCCm 1601 -SETCCm_EVEX 1602 -SETCCr 1603 -SETCCr_EVEX 1604 -SETSSBSY 1605 -SETZUCCm 1606 -SETZUCCr 1607 -SFENCE 1608 -SGDT 1609 -SHA 1610 -SHL 1611 -SHLD 1612 -SHLDROT 1613 -SHLX 1614 -SHR 1615 -SHRD 1616 -SHRDROT 1617 -SHRX 1618 -SHUFPDrmi 1619 -SHUFPDrri 1620 -SHUFPSrmi 1621 -SHUFPSrri 1622 -SIDT 1623 -SKINIT 1624 -SLDT 1625 -SLWPCB 1626 -SMSW 1627 -SQRTPDm 1628 -SQRTPDr 1629 -SQRTPSm 1630 -SQRTPSr 1631 -SQRTSDm 1632 -SQRTSDm_Int 1633 -SQRTSDr 1634 -SQRTSDr_Int 1635 -SQRTSSm 1636 -SQRTSSm_Int 1637 -SQRTSSr 1638 -SQRTSSr_Int 1639 -SQRT_F 1640 -SQRT_Fp 1641 -SS_PREFIX 1642 -STAC 1643 -STACKALLOC_W_PROBING 1644 -STACKMAP 1645 -STATEPOINT 1646 -STC 1647 -STD 1648 -STGI 1649 -STI 1650 -STMXCSR 1651 -STOSB 1652 -STOSL 1653 -STOSQ 1654 -STOSW 1655 -STR 1656 -STRm 1657 -STTILECFG 1658 -STTILECFG_EVEX 1659 -STUI 1660 -ST_F 1661 -ST_FP 1662 -ST_FPrr 1663 -ST_Fp 1664 -ST_FpP 1665 -ST_Frr 1666 -SUB 1667 -SUBPDrm 1668 -SUBPDrr 1669 -SUBPSrm 1670 -SUBPSrr 1671 -SUBREG_TO_REG 1672 -SUBR_F 1673 -SUBR_FI 1674 -SUBR_FPrST 1675 -SUBR_FST 1676 -SUBR_Fp 1677 -SUBR_FpI 1678 -SUBR_FrST 1679 -SUBSDrm 1680 -SUBSDrm_Int 1681 -SUBSDrr 1682 -SUBSDrr_Int 1683 -SUBSSrm 1684 -SUBSSrm_Int 1685 -SUBSSrr 1686 -SUBSSrr_Int 1687 -SUB_F 1688 -SUB_FI 1689 -SUB_FPrST 1690 -SUB_FST 1691 -SUB_Fp 1692 -SUB_FpI 1693 -SUB_FrST 1694 -SWAPGS 1695 -SYSCALL 1696 -SYSENTER 1697 -SYSEXIT 1698 -SYSRET 1699 -T 1700 -TAILJMPd 1701 -TAILJMPd_CC 1702 -TAILJMPm 1703 -TAILJMPr 1704 -TCMMIMFP 1705 -TCMMRLFP 1706 -TCRETURN_HIPE 1707 -TCRETURN_WIN 1708 -TCRETURN_WINmi 1709 -TCRETURNdi 1710 -TCRETURNdicc 1711 -TCRETURNmi 1712 -TCRETURNri 1713 -TCVTROWD 1714 -TCVTROWPS 1715 -TDCALL 1716 -TDPBF 1717 -TDPBHF 1718 -TDPBSSD 1719 -TDPBSUD 1720 -TDPBUSD 1721 -TDPBUUD 1722 -TDPFP 1723 -TDPHBF 1724 -TDPHF 1725 -TEST 1726 -TESTUI 1727 -TILELOADD 1728 -TILELOADDRS 1729 -TILELOADDRST 1730 -TILELOADDRS_EVEX 1731 -TILELOADDT 1732 -TILELOADD_EVEX 1733 -TILEMOVROWrre 1734 -TILEMOVROWrri 1735 -TILERELEASE 1736 -TILESTORED 1737 -TILESTORED_EVEX 1738 -TILEZERO 1739 -TLBSYNC 1740 -TLSCall 1741 -TLS_addr 1742 -TLS_addrX 1743 -TLS_base_addr 1744 -TLS_base_addrX 1745 -TLS_desc 1746 -TMMULTF 1747 -TPAUSE 1748 -TRAP 1749 -TST_F 1750 -TST_Fp 1751 -TZCNT 1752 -TZMSK 1753 -UBSAN_UD 1754 -UCOMISDrm 1755 -UCOMISDrm_Int 1756 -UCOMISDrr 1757 -UCOMISDrr_Int 1758 -UCOMISSrm 1759 -UCOMISSrm_Int 1760 -UCOMISSrr 1761 -UCOMISSrr_Int 1762 -UCOM_FIPr 1763 -UCOM_FIr 1764 -UCOM_FPPr 1765 -UCOM_FPr 1766 -UCOM_FpIr 1767 -UCOM_Fpr 1768 -UCOM_Fr 1769 -UD 1770 -UIRET 1771 -UMONITOR 1772 -UMWAIT 1773 -UNPCKHPDrm 1774 -UNPCKHPDrr 1775 -UNPCKHPSrm 1776 -UNPCKHPSrr 1777 -UNPCKLPDrm 1778 -UNPCKLPDrr 1779 -UNPCKLPSrm 1780 -UNPCKLPSrr 1781 -URDMSRri 1782 -URDMSRri_EVEX 1783 -URDMSRrr 1784 -URDMSRrr_EVEX 1785 -UWRMSRir 1786 -UWRMSRir_EVEX 1787 -UWRMSRrr 1788 -UWRMSRrr_EVEX 1789 -V 1790 -VAARG 1791 -VAARG_X 1792 -VADDBF 1793 -VADDPDYrm 1794 -VADDPDYrr 1795 -VADDPDZ 1796 -VADDPDZrm 1797 -VADDPDZrmb 1798 -VADDPDZrmbk 1799 -VADDPDZrmbkz 1800 -VADDPDZrmk 1801 -VADDPDZrmkz 1802 -VADDPDZrr 1803 -VADDPDZrrb 1804 -VADDPDZrrbk 1805 -VADDPDZrrbkz 1806 -VADDPDZrrk 1807 -VADDPDZrrkz 1808 -VADDPDrm 1809 -VADDPDrr 1810 -VADDPHZ 1811 -VADDPHZrm 1812 -VADDPHZrmb 1813 -VADDPHZrmbk 1814 -VADDPHZrmbkz 1815 -VADDPHZrmk 1816 -VADDPHZrmkz 1817 -VADDPHZrr 1818 -VADDPHZrrb 1819 -VADDPHZrrbk 1820 -VADDPHZrrbkz 1821 -VADDPHZrrk 1822 -VADDPHZrrkz 1823 -VADDPSYrm 1824 -VADDPSYrr 1825 -VADDPSZ 1826 -VADDPSZrm 1827 -VADDPSZrmb 1828 -VADDPSZrmbk 1829 -VADDPSZrmbkz 1830 -VADDPSZrmk 1831 -VADDPSZrmkz 1832 -VADDPSZrr 1833 -VADDPSZrrb 1834 -VADDPSZrrbk 1835 -VADDPSZrrbkz 1836 -VADDPSZrrk 1837 -VADDPSZrrkz 1838 -VADDPSrm 1839 -VADDPSrr 1840 -VADDSDZrm 1841 -VADDSDZrm_Int 1842 -VADDSDZrmk_Int 1843 -VADDSDZrmkz_Int 1844 -VADDSDZrr 1845 -VADDSDZrr_Int 1846 -VADDSDZrrb_Int 1847 -VADDSDZrrbk_Int 1848 -VADDSDZrrbkz_Int 1849 -VADDSDZrrk_Int 1850 -VADDSDZrrkz_Int 1851 -VADDSDrm 1852 -VADDSDrm_Int 1853 -VADDSDrr 1854 -VADDSDrr_Int 1855 -VADDSHZrm 1856 -VADDSHZrm_Int 1857 -VADDSHZrmk_Int 1858 -VADDSHZrmkz_Int 1859 -VADDSHZrr 1860 -VADDSHZrr_Int 1861 -VADDSHZrrb_Int 1862 -VADDSHZrrbk_Int 1863 -VADDSHZrrbkz_Int 1864 -VADDSHZrrk_Int 1865 -VADDSHZrrkz_Int 1866 -VADDSSZrm 1867 -VADDSSZrm_Int 1868 -VADDSSZrmk_Int 1869 -VADDSSZrmkz_Int 1870 -VADDSSZrr 1871 -VADDSSZrr_Int 1872 -VADDSSZrrb_Int 1873 -VADDSSZrrbk_Int 1874 -VADDSSZrrbkz_Int 1875 -VADDSSZrrk_Int 1876 -VADDSSZrrkz_Int 1877 -VADDSSrm 1878 -VADDSSrm_Int 1879 -VADDSSrr 1880 -VADDSSrr_Int 1881 -VADDSUBPDYrm 1882 -VADDSUBPDYrr 1883 -VADDSUBPDrm 1884 -VADDSUBPDrr 1885 -VADDSUBPSYrm 1886 -VADDSUBPSYrr 1887 -VADDSUBPSrm 1888 -VADDSUBPSrr 1889 -VAESDECLASTYrm 1890 -VAESDECLASTYrr 1891 -VAESDECLASTZ 1892 -VAESDECLASTZrm 1893 -VAESDECLASTZrr 1894 -VAESDECLASTrm 1895 -VAESDECLASTrr 1896 -VAESDECYrm 1897 -VAESDECYrr 1898 -VAESDECZ 1899 -VAESDECZrm 1900 -VAESDECZrr 1901 -VAESDECrm 1902 -VAESDECrr 1903 -VAESENCLASTYrm 1904 -VAESENCLASTYrr 1905 -VAESENCLASTZ 1906 -VAESENCLASTZrm 1907 -VAESENCLASTZrr 1908 -VAESENCLASTrm 1909 -VAESENCLASTrr 1910 -VAESENCYrm 1911 -VAESENCYrr 1912 -VAESENCZ 1913 -VAESENCZrm 1914 -VAESENCZrr 1915 -VAESENCrm 1916 -VAESENCrr 1917 -VAESIMCrm 1918 -VAESIMCrr 1919 -VAESKEYGENASSISTrmi 1920 -VAESKEYGENASSISTrri 1921 -VALIGNDZ 1922 -VALIGNDZrmbi 1923 -VALIGNDZrmbik 1924 -VALIGNDZrmbikz 1925 -VALIGNDZrmi 1926 -VALIGNDZrmik 1927 -VALIGNDZrmikz 1928 -VALIGNDZrri 1929 -VALIGNDZrrik 1930 -VALIGNDZrrikz 1931 -VALIGNQZ 1932 -VALIGNQZrmbi 1933 -VALIGNQZrmbik 1934 -VALIGNQZrmbikz 1935 -VALIGNQZrmi 1936 -VALIGNQZrmik 1937 -VALIGNQZrmikz 1938 -VALIGNQZrri 1939 -VALIGNQZrrik 1940 -VALIGNQZrrikz 1941 -VANDNPDYrm 1942 -VANDNPDYrr 1943 -VANDNPDZ 1944 -VANDNPDZrm 1945 -VANDNPDZrmb 1946 -VANDNPDZrmbk 1947 -VANDNPDZrmbkz 1948 -VANDNPDZrmk 1949 -VANDNPDZrmkz 1950 -VANDNPDZrr 1951 -VANDNPDZrrk 1952 -VANDNPDZrrkz 1953 -VANDNPDrm 1954 -VANDNPDrr 1955 -VANDNPSYrm 1956 -VANDNPSYrr 1957 -VANDNPSZ 1958 -VANDNPSZrm 1959 -VANDNPSZrmb 1960 -VANDNPSZrmbk 1961 -VANDNPSZrmbkz 1962 -VANDNPSZrmk 1963 -VANDNPSZrmkz 1964 -VANDNPSZrr 1965 -VANDNPSZrrk 1966 -VANDNPSZrrkz 1967 -VANDNPSrm 1968 -VANDNPSrr 1969 -VANDPDYrm 1970 -VANDPDYrr 1971 -VANDPDZ 1972 -VANDPDZrm 1973 -VANDPDZrmb 1974 -VANDPDZrmbk 1975 -VANDPDZrmbkz 1976 -VANDPDZrmk 1977 -VANDPDZrmkz 1978 -VANDPDZrr 1979 -VANDPDZrrk 1980 -VANDPDZrrkz 1981 -VANDPDrm 1982 -VANDPDrr 1983 -VANDPSYrm 1984 -VANDPSYrr 1985 -VANDPSZ 1986 -VANDPSZrm 1987 -VANDPSZrmb 1988 -VANDPSZrmbk 1989 -VANDPSZrmbkz 1990 -VANDPSZrmk 1991 -VANDPSZrmkz 1992 -VANDPSZrr 1993 -VANDPSZrrk 1994 -VANDPSZrrkz 1995 -VANDPSrm 1996 -VANDPSrr 1997 -VASTART_SAVE_XMM_REGS 1998 -VBCSTNEBF 1999 -VBCSTNESH 2000 -VBLENDMPDZ 2001 -VBLENDMPDZrm 2002 -VBLENDMPDZrmb 2003 -VBLENDMPDZrmbk 2004 -VBLENDMPDZrmbkz 2005 -VBLENDMPDZrmk 2006 -VBLENDMPDZrmkz 2007 -VBLENDMPDZrr 2008 -VBLENDMPDZrrk 2009 -VBLENDMPDZrrkz 2010 -VBLENDMPSZ 2011 -VBLENDMPSZrm 2012 -VBLENDMPSZrmb 2013 -VBLENDMPSZrmbk 2014 -VBLENDMPSZrmbkz 2015 -VBLENDMPSZrmk 2016 -VBLENDMPSZrmkz 2017 -VBLENDMPSZrr 2018 -VBLENDMPSZrrk 2019 -VBLENDMPSZrrkz 2020 -VBLENDPDYrmi 2021 -VBLENDPDYrri 2022 -VBLENDPDrmi 2023 -VBLENDPDrri 2024 -VBLENDPSYrmi 2025 -VBLENDPSYrri 2026 -VBLENDPSrmi 2027 -VBLENDPSrri 2028 -VBLENDVPDYrmr 2029 -VBLENDVPDYrrr 2030 -VBLENDVPDrmr 2031 -VBLENDVPDrrr 2032 -VBLENDVPSYrmr 2033 -VBLENDVPSYrrr 2034 -VBLENDVPSrmr 2035 -VBLENDVPSrrr 2036 -VBROADCASTF 2037 -VBROADCASTI 2038 -VBROADCASTSDYrm 2039 -VBROADCASTSDYrr 2040 -VBROADCASTSDZ 2041 -VBROADCASTSDZrm 2042 -VBROADCASTSDZrmk 2043 -VBROADCASTSDZrmkz 2044 -VBROADCASTSDZrr 2045 -VBROADCASTSDZrrk 2046 -VBROADCASTSDZrrkz 2047 -VBROADCASTSSYrm 2048 -VBROADCASTSSYrr 2049 -VBROADCASTSSZ 2050 -VBROADCASTSSZrm 2051 -VBROADCASTSSZrmk 2052 -VBROADCASTSSZrmkz 2053 -VBROADCASTSSZrr 2054 -VBROADCASTSSZrrk 2055 -VBROADCASTSSZrrkz 2056 -VBROADCASTSSrm 2057 -VBROADCASTSSrr 2058 -VCMPBF 2059 -VCMPPDYrmi 2060 -VCMPPDYrri 2061 -VCMPPDZ 2062 -VCMPPDZrmbi 2063 -VCMPPDZrmbik 2064 -VCMPPDZrmi 2065 -VCMPPDZrmik 2066 -VCMPPDZrri 2067 -VCMPPDZrrib 2068 -VCMPPDZrribk 2069 -VCMPPDZrrik 2070 -VCMPPDrmi 2071 -VCMPPDrri 2072 -VCMPPHZ 2073 -VCMPPHZrmbi 2074 -VCMPPHZrmbik 2075 -VCMPPHZrmi 2076 -VCMPPHZrmik 2077 -VCMPPHZrri 2078 -VCMPPHZrrib 2079 -VCMPPHZrribk 2080 -VCMPPHZrrik 2081 -VCMPPSYrmi 2082 -VCMPPSYrri 2083 -VCMPPSZ 2084 -VCMPPSZrmbi 2085 -VCMPPSZrmbik 2086 -VCMPPSZrmi 2087 -VCMPPSZrmik 2088 -VCMPPSZrri 2089 -VCMPPSZrrib 2090 -VCMPPSZrribk 2091 -VCMPPSZrrik 2092 -VCMPPSrmi 2093 -VCMPPSrri 2094 -VCMPSDZrmi 2095 -VCMPSDZrmi_Int 2096 -VCMPSDZrmik_Int 2097 -VCMPSDZrri 2098 -VCMPSDZrri_Int 2099 -VCMPSDZrrib_Int 2100 -VCMPSDZrribk_Int 2101 -VCMPSDZrrik_Int 2102 -VCMPSDrmi 2103 -VCMPSDrmi_Int 2104 -VCMPSDrri 2105 -VCMPSDrri_Int 2106 -VCMPSHZrmi 2107 -VCMPSHZrmi_Int 2108 -VCMPSHZrmik_Int 2109 -VCMPSHZrri 2110 -VCMPSHZrri_Int 2111 -VCMPSHZrrib_Int 2112 -VCMPSHZrribk_Int 2113 -VCMPSHZrrik_Int 2114 -VCMPSSZrmi 2115 -VCMPSSZrmi_Int 2116 -VCMPSSZrmik_Int 2117 -VCMPSSZrri 2118 -VCMPSSZrri_Int 2119 -VCMPSSZrrib_Int 2120 -VCMPSSZrribk_Int 2121 -VCMPSSZrrik_Int 2122 -VCMPSSrmi 2123 -VCMPSSrmi_Int 2124 -VCMPSSrri 2125 -VCMPSSrri_Int 2126 -VCOMISBF 2127 -VCOMISDZrm 2128 -VCOMISDZrm_Int 2129 -VCOMISDZrr 2130 -VCOMISDZrr_Int 2131 -VCOMISDZrrb 2132 -VCOMISDrm 2133 -VCOMISDrm_Int 2134 -VCOMISDrr 2135 -VCOMISDrr_Int 2136 -VCOMISHZrm 2137 -VCOMISHZrm_Int 2138 -VCOMISHZrr 2139 -VCOMISHZrr_Int 2140 -VCOMISHZrrb 2141 -VCOMISSZrm 2142 -VCOMISSZrm_Int 2143 -VCOMISSZrr 2144 -VCOMISSZrr_Int 2145 -VCOMISSZrrb 2146 -VCOMISSrm 2147 -VCOMISSrm_Int 2148 -VCOMISSrr 2149 -VCOMISSrr_Int 2150 -VCOMPRESSPDZ 2151 -VCOMPRESSPDZmr 2152 -VCOMPRESSPDZmrk 2153 -VCOMPRESSPDZrr 2154 -VCOMPRESSPDZrrk 2155 -VCOMPRESSPDZrrkz 2156 -VCOMPRESSPSZ 2157 -VCOMPRESSPSZmr 2158 -VCOMPRESSPSZmrk 2159 -VCOMPRESSPSZrr 2160 -VCOMPRESSPSZrrk 2161 -VCOMPRESSPSZrrkz 2162 -VCOMXSDZrm_Int 2163 -VCOMXSDZrr_Int 2164 -VCOMXSDZrrb_Int 2165 -VCOMXSHZrm_Int 2166 -VCOMXSHZrr_Int 2167 -VCOMXSHZrrb_Int 2168 -VCOMXSSZrm_Int 2169 -VCOMXSSZrr_Int 2170 -VCOMXSSZrrb_Int 2171 -VCVT 2172 -VCVTBF 2173 -VCVTBIASPH 2174 -VCVTDQ 2175 -VCVTHF 2176 -VCVTNE 2177 -VCVTNEEBF 2178 -VCVTNEEPH 2179 -VCVTNEOBF 2180 -VCVTNEOPH 2181 -VCVTNEPS 2182 -VCVTPD 2183 -VCVTPH 2184 -VCVTPS 2185 -VCVTQQ 2186 -VCVTSD 2187 -VCVTSH 2188 -VCVTSI 2189 -VCVTSS 2190 -VCVTTBF 2191 -VCVTTPD 2192 -VCVTTPH 2193 -VCVTTPS 2194 -VCVTTSD 2195 -VCVTTSH 2196 -VCVTTSS 2197 -VCVTUDQ 2198 -VCVTUQQ 2199 -VCVTUSI 2200 -VCVTUW 2201 -VCVTW 2202 -VDBPSADBWZ 2203 -VDBPSADBWZrmi 2204 -VDBPSADBWZrmik 2205 -VDBPSADBWZrmikz 2206 -VDBPSADBWZrri 2207 -VDBPSADBWZrrik 2208 -VDBPSADBWZrrikz 2209 -VDIVBF 2210 -VDIVPDYrm 2211 -VDIVPDYrr 2212 -VDIVPDZ 2213 -VDIVPDZrm 2214 -VDIVPDZrmb 2215 -VDIVPDZrmbk 2216 -VDIVPDZrmbkz 2217 -VDIVPDZrmk 2218 -VDIVPDZrmkz 2219 -VDIVPDZrr 2220 -VDIVPDZrrb 2221 -VDIVPDZrrbk 2222 -VDIVPDZrrbkz 2223 -VDIVPDZrrk 2224 -VDIVPDZrrkz 2225 -VDIVPDrm 2226 -VDIVPDrr 2227 -VDIVPHZ 2228 -VDIVPHZrm 2229 -VDIVPHZrmb 2230 -VDIVPHZrmbk 2231 -VDIVPHZrmbkz 2232 -VDIVPHZrmk 2233 -VDIVPHZrmkz 2234 -VDIVPHZrr 2235 -VDIVPHZrrb 2236 -VDIVPHZrrbk 2237 -VDIVPHZrrbkz 2238 -VDIVPHZrrk 2239 -VDIVPHZrrkz 2240 -VDIVPSYrm 2241 -VDIVPSYrr 2242 -VDIVPSZ 2243 -VDIVPSZrm 2244 -VDIVPSZrmb 2245 -VDIVPSZrmbk 2246 -VDIVPSZrmbkz 2247 -VDIVPSZrmk 2248 -VDIVPSZrmkz 2249 -VDIVPSZrr 2250 -VDIVPSZrrb 2251 -VDIVPSZrrbk 2252 -VDIVPSZrrbkz 2253 -VDIVPSZrrk 2254 -VDIVPSZrrkz 2255 -VDIVPSrm 2256 -VDIVPSrr 2257 -VDIVSDZrm 2258 -VDIVSDZrm_Int 2259 -VDIVSDZrmk_Int 2260 -VDIVSDZrmkz_Int 2261 -VDIVSDZrr 2262 -VDIVSDZrr_Int 2263 -VDIVSDZrrb_Int 2264 -VDIVSDZrrbk_Int 2265 -VDIVSDZrrbkz_Int 2266 -VDIVSDZrrk_Int 2267 -VDIVSDZrrkz_Int 2268 -VDIVSDrm 2269 -VDIVSDrm_Int 2270 -VDIVSDrr 2271 -VDIVSDrr_Int 2272 -VDIVSHZrm 2273 -VDIVSHZrm_Int 2274 -VDIVSHZrmk_Int 2275 -VDIVSHZrmkz_Int 2276 -VDIVSHZrr 2277 -VDIVSHZrr_Int 2278 -VDIVSHZrrb_Int 2279 -VDIVSHZrrbk_Int 2280 -VDIVSHZrrbkz_Int 2281 -VDIVSHZrrk_Int 2282 -VDIVSHZrrkz_Int 2283 -VDIVSSZrm 2284 -VDIVSSZrm_Int 2285 -VDIVSSZrmk_Int 2286 -VDIVSSZrmkz_Int 2287 -VDIVSSZrr 2288 -VDIVSSZrr_Int 2289 -VDIVSSZrrb_Int 2290 -VDIVSSZrrbk_Int 2291 -VDIVSSZrrbkz_Int 2292 -VDIVSSZrrk_Int 2293 -VDIVSSZrrkz_Int 2294 -VDIVSSrm 2295 -VDIVSSrm_Int 2296 -VDIVSSrr 2297 -VDIVSSrr_Int 2298 -VDPBF 2299 -VDPPDrmi 2300 -VDPPDrri 2301 -VDPPHPSZ 2302 -VDPPHPSZm 2303 -VDPPHPSZmb 2304 -VDPPHPSZmbk 2305 -VDPPHPSZmbkz 2306 -VDPPHPSZmk 2307 -VDPPHPSZmkz 2308 -VDPPHPSZr 2309 -VDPPHPSZrk 2310 -VDPPHPSZrkz 2311 -VDPPSYrmi 2312 -VDPPSYrri 2313 -VDPPSrmi 2314 -VDPPSrri 2315 -VERRm 2316 -VERRr 2317 -VERWm 2318 -VERWr 2319 -VEXP 2320 -VEXPANDPDZ 2321 -VEXPANDPDZrm 2322 -VEXPANDPDZrmk 2323 -VEXPANDPDZrmkz 2324 -VEXPANDPDZrr 2325 -VEXPANDPDZrrk 2326 -VEXPANDPDZrrkz 2327 -VEXPANDPSZ 2328 -VEXPANDPSZrm 2329 -VEXPANDPSZrmk 2330 -VEXPANDPSZrmkz 2331 -VEXPANDPSZrr 2332 -VEXPANDPSZrrk 2333 -VEXPANDPSZrrkz 2334 -VEXTRACTF 2335 -VEXTRACTI 2336 -VEXTRACTPSZmri 2337 -VEXTRACTPSZrri 2338 -VEXTRACTPSmri 2339 -VEXTRACTPSrri 2340 -VFCMADDCPHZ 2341 -VFCMADDCPHZm 2342 -VFCMADDCPHZmb 2343 -VFCMADDCPHZmbk 2344 -VFCMADDCPHZmbkz 2345 -VFCMADDCPHZmk 2346 -VFCMADDCPHZmkz 2347 -VFCMADDCPHZr 2348 -VFCMADDCPHZrb 2349 -VFCMADDCPHZrbk 2350 -VFCMADDCPHZrbkz 2351 -VFCMADDCPHZrk 2352 -VFCMADDCPHZrkz 2353 -VFCMADDCSHZm 2354 -VFCMADDCSHZmk 2355 -VFCMADDCSHZmkz 2356 -VFCMADDCSHZr 2357 -VFCMADDCSHZrb 2358 -VFCMADDCSHZrbk 2359 -VFCMADDCSHZrbkz 2360 -VFCMADDCSHZrk 2361 -VFCMADDCSHZrkz 2362 -VFCMULCPHZ 2363 -VFCMULCPHZrm 2364 -VFCMULCPHZrmb 2365 -VFCMULCPHZrmbk 2366 -VFCMULCPHZrmbkz 2367 -VFCMULCPHZrmk 2368 -VFCMULCPHZrmkz 2369 -VFCMULCPHZrr 2370 -VFCMULCPHZrrb 2371 -VFCMULCPHZrrbk 2372 -VFCMULCPHZrrbkz 2373 -VFCMULCPHZrrk 2374 -VFCMULCPHZrrkz 2375 -VFCMULCSHZrm 2376 -VFCMULCSHZrmk 2377 -VFCMULCSHZrmkz 2378 -VFCMULCSHZrr 2379 -VFCMULCSHZrrb 2380 -VFCMULCSHZrrbk 2381 -VFCMULCSHZrrbkz 2382 -VFCMULCSHZrrk 2383 -VFCMULCSHZrrkz 2384 -VFIXUPIMMPDZ 2385 -VFIXUPIMMPDZrmbi 2386 -VFIXUPIMMPDZrmbik 2387 -VFIXUPIMMPDZrmbikz 2388 -VFIXUPIMMPDZrmi 2389 -VFIXUPIMMPDZrmik 2390 -VFIXUPIMMPDZrmikz 2391 -VFIXUPIMMPDZrri 2392 -VFIXUPIMMPDZrrib 2393 -VFIXUPIMMPDZrribk 2394 -VFIXUPIMMPDZrribkz 2395 -VFIXUPIMMPDZrrik 2396 -VFIXUPIMMPDZrrikz 2397 -VFIXUPIMMPSZ 2398 -VFIXUPIMMPSZrmbi 2399 -VFIXUPIMMPSZrmbik 2400 -VFIXUPIMMPSZrmbikz 2401 -VFIXUPIMMPSZrmi 2402 -VFIXUPIMMPSZrmik 2403 -VFIXUPIMMPSZrmikz 2404 -VFIXUPIMMPSZrri 2405 -VFIXUPIMMPSZrrib 2406 -VFIXUPIMMPSZrribk 2407 -VFIXUPIMMPSZrribkz 2408 -VFIXUPIMMPSZrrik 2409 -VFIXUPIMMPSZrrikz 2410 -VFIXUPIMMSDZrmi 2411 -VFIXUPIMMSDZrmik 2412 -VFIXUPIMMSDZrmikz 2413 -VFIXUPIMMSDZrri 2414 -VFIXUPIMMSDZrrib 2415 -VFIXUPIMMSDZrribk 2416 -VFIXUPIMMSDZrribkz 2417 -VFIXUPIMMSDZrrik 2418 -VFIXUPIMMSDZrrikz 2419 -VFIXUPIMMSSZrmi 2420 -VFIXUPIMMSSZrmik 2421 -VFIXUPIMMSSZrmikz 2422 -VFIXUPIMMSSZrri 2423 -VFIXUPIMMSSZrrib 2424 -VFIXUPIMMSSZrribk 2425 -VFIXUPIMMSSZrribkz 2426 -VFIXUPIMMSSZrrik 2427 -VFIXUPIMMSSZrrikz 2428 -VFMADD 2429 -VFMADDCPHZ 2430 -VFMADDCPHZm 2431 -VFMADDCPHZmb 2432 -VFMADDCPHZmbk 2433 -VFMADDCPHZmbkz 2434 -VFMADDCPHZmk 2435 -VFMADDCPHZmkz 2436 -VFMADDCPHZr 2437 -VFMADDCPHZrb 2438 -VFMADDCPHZrbk 2439 -VFMADDCPHZrbkz 2440 -VFMADDCPHZrk 2441 -VFMADDCPHZrkz 2442 -VFMADDCSHZm 2443 -VFMADDCSHZmk 2444 -VFMADDCSHZmkz 2445 -VFMADDCSHZr 2446 -VFMADDCSHZrb 2447 -VFMADDCSHZrbk 2448 -VFMADDCSHZrbkz 2449 -VFMADDCSHZrk 2450 -VFMADDCSHZrkz 2451 -VFMADDPD 2452 -VFMADDPS 2453 -VFMADDSD 2454 -VFMADDSS 2455 -VFMADDSUB 2456 -VFMADDSUBPD 2457 -VFMADDSUBPS 2458 -VFMSUB 2459 -VFMSUBADD 2460 -VFMSUBADDPD 2461 -VFMSUBADDPS 2462 -VFMSUBPD 2463 -VFMSUBPS 2464 -VFMSUBSD 2465 -VFMSUBSS 2466 -VFMULCPHZ 2467 -VFMULCPHZrm 2468 -VFMULCPHZrmb 2469 -VFMULCPHZrmbk 2470 -VFMULCPHZrmbkz 2471 -VFMULCPHZrmk 2472 -VFMULCPHZrmkz 2473 -VFMULCPHZrr 2474 -VFMULCPHZrrb 2475 -VFMULCPHZrrbk 2476 -VFMULCPHZrrbkz 2477 -VFMULCPHZrrk 2478 -VFMULCPHZrrkz 2479 -VFMULCSHZrm 2480 -VFMULCSHZrmk 2481 -VFMULCSHZrmkz 2482 -VFMULCSHZrr 2483 -VFMULCSHZrrb 2484 -VFMULCSHZrrbk 2485 -VFMULCSHZrrbkz 2486 -VFMULCSHZrrk 2487 -VFMULCSHZrrkz 2488 -VFNMADD 2489 -VFNMADDPD 2490 -VFNMADDPS 2491 -VFNMADDSD 2492 -VFNMADDSS 2493 -VFNMSUB 2494 -VFNMSUBPD 2495 -VFNMSUBPS 2496 -VFNMSUBSD 2497 -VFNMSUBSS 2498 -VFPCLASSBF 2499 -VFPCLASSPDZ 2500 -VFPCLASSPDZmbi 2501 -VFPCLASSPDZmbik 2502 -VFPCLASSPDZmi 2503 -VFPCLASSPDZmik 2504 -VFPCLASSPDZri 2505 -VFPCLASSPDZrik 2506 -VFPCLASSPHZ 2507 -VFPCLASSPHZmbi 2508 -VFPCLASSPHZmbik 2509 -VFPCLASSPHZmi 2510 -VFPCLASSPHZmik 2511 -VFPCLASSPHZri 2512 -VFPCLASSPHZrik 2513 -VFPCLASSPSZ 2514 -VFPCLASSPSZmbi 2515 -VFPCLASSPSZmbik 2516 -VFPCLASSPSZmi 2517 -VFPCLASSPSZmik 2518 -VFPCLASSPSZri 2519 -VFPCLASSPSZrik 2520 -VFPCLASSSDZmi 2521 -VFPCLASSSDZmik 2522 -VFPCLASSSDZri 2523 -VFPCLASSSDZrik 2524 -VFPCLASSSHZmi 2525 -VFPCLASSSHZmik 2526 -VFPCLASSSHZri 2527 -VFPCLASSSHZrik 2528 -VFPCLASSSSZmi 2529 -VFPCLASSSSZmik 2530 -VFPCLASSSSZri 2531 -VFPCLASSSSZrik 2532 -VFRCZPDYrm 2533 -VFRCZPDYrr 2534 -VFRCZPDrm 2535 -VFRCZPDrr 2536 -VFRCZPSYrm 2537 -VFRCZPSYrr 2538 -VFRCZPSrm 2539 -VFRCZPSrr 2540 -VFRCZSDrm 2541 -VFRCZSDrr 2542 -VFRCZSSrm 2543 -VFRCZSSrr 2544 -VGATHERDPDYrm 2545 -VGATHERDPDZ 2546 -VGATHERDPDZrm 2547 -VGATHERDPDrm 2548 -VGATHERDPSYrm 2549 -VGATHERDPSZ 2550 -VGATHERDPSZrm 2551 -VGATHERDPSrm 2552 -VGATHERPF 2553 -VGATHERQPDYrm 2554 -VGATHERQPDZ 2555 -VGATHERQPDZrm 2556 -VGATHERQPDrm 2557 -VGATHERQPSYrm 2558 -VGATHERQPSZ 2559 -VGATHERQPSZrm 2560 -VGATHERQPSrm 2561 -VGETEXPBF 2562 -VGETEXPPDZ 2563 -VGETEXPPDZm 2564 -VGETEXPPDZmb 2565 -VGETEXPPDZmbk 2566 -VGETEXPPDZmbkz 2567 -VGETEXPPDZmk 2568 -VGETEXPPDZmkz 2569 -VGETEXPPDZr 2570 -VGETEXPPDZrb 2571 -VGETEXPPDZrbk 2572 -VGETEXPPDZrbkz 2573 -VGETEXPPDZrk 2574 -VGETEXPPDZrkz 2575 -VGETEXPPHZ 2576 -VGETEXPPHZm 2577 -VGETEXPPHZmb 2578 -VGETEXPPHZmbk 2579 -VGETEXPPHZmbkz 2580 -VGETEXPPHZmk 2581 -VGETEXPPHZmkz 2582 -VGETEXPPHZr 2583 -VGETEXPPHZrb 2584 -VGETEXPPHZrbk 2585 -VGETEXPPHZrbkz 2586 -VGETEXPPHZrk 2587 -VGETEXPPHZrkz 2588 -VGETEXPPSZ 2589 -VGETEXPPSZm 2590 -VGETEXPPSZmb 2591 -VGETEXPPSZmbk 2592 -VGETEXPPSZmbkz 2593 -VGETEXPPSZmk 2594 -VGETEXPPSZmkz 2595 -VGETEXPPSZr 2596 -VGETEXPPSZrb 2597 -VGETEXPPSZrbk 2598 -VGETEXPPSZrbkz 2599 -VGETEXPPSZrk 2600 -VGETEXPPSZrkz 2601 -VGETEXPSDZm 2602 -VGETEXPSDZmk 2603 -VGETEXPSDZmkz 2604 -VGETEXPSDZr 2605 -VGETEXPSDZrb 2606 -VGETEXPSDZrbk 2607 -VGETEXPSDZrbkz 2608 -VGETEXPSDZrk 2609 -VGETEXPSDZrkz 2610 -VGETEXPSHZm 2611 -VGETEXPSHZmk 2612 -VGETEXPSHZmkz 2613 -VGETEXPSHZr 2614 -VGETEXPSHZrb 2615 -VGETEXPSHZrbk 2616 -VGETEXPSHZrbkz 2617 -VGETEXPSHZrk 2618 -VGETEXPSHZrkz 2619 -VGETEXPSSZm 2620 -VGETEXPSSZmk 2621 -VGETEXPSSZmkz 2622 -VGETEXPSSZr 2623 -VGETEXPSSZrb 2624 -VGETEXPSSZrbk 2625 -VGETEXPSSZrbkz 2626 -VGETEXPSSZrk 2627 -VGETEXPSSZrkz 2628 -VGETMANTBF 2629 -VGETMANTPDZ 2630 -VGETMANTPDZrmbi 2631 -VGETMANTPDZrmbik 2632 -VGETMANTPDZrmbikz 2633 -VGETMANTPDZrmi 2634 -VGETMANTPDZrmik 2635 -VGETMANTPDZrmikz 2636 -VGETMANTPDZrri 2637 -VGETMANTPDZrrib 2638 -VGETMANTPDZrribk 2639 -VGETMANTPDZrribkz 2640 -VGETMANTPDZrrik 2641 -VGETMANTPDZrrikz 2642 -VGETMANTPHZ 2643 -VGETMANTPHZrmbi 2644 -VGETMANTPHZrmbik 2645 -VGETMANTPHZrmbikz 2646 -VGETMANTPHZrmi 2647 -VGETMANTPHZrmik 2648 -VGETMANTPHZrmikz 2649 -VGETMANTPHZrri 2650 -VGETMANTPHZrrib 2651 -VGETMANTPHZrribk 2652 -VGETMANTPHZrribkz 2653 -VGETMANTPHZrrik 2654 -VGETMANTPHZrrikz 2655 -VGETMANTPSZ 2656 -VGETMANTPSZrmbi 2657 -VGETMANTPSZrmbik 2658 -VGETMANTPSZrmbikz 2659 -VGETMANTPSZrmi 2660 -VGETMANTPSZrmik 2661 -VGETMANTPSZrmikz 2662 -VGETMANTPSZrri 2663 -VGETMANTPSZrrib 2664 -VGETMANTPSZrribk 2665 -VGETMANTPSZrribkz 2666 -VGETMANTPSZrrik 2667 -VGETMANTPSZrrikz 2668 -VGETMANTSDZrmi 2669 -VGETMANTSDZrmik 2670 -VGETMANTSDZrmikz 2671 -VGETMANTSDZrri 2672 -VGETMANTSDZrrib 2673 -VGETMANTSDZrribk 2674 -VGETMANTSDZrribkz 2675 -VGETMANTSDZrrik 2676 -VGETMANTSDZrrikz 2677 -VGETMANTSHZrmi 2678 -VGETMANTSHZrmik 2679 -VGETMANTSHZrmikz 2680 -VGETMANTSHZrri 2681 -VGETMANTSHZrrib 2682 -VGETMANTSHZrribk 2683 -VGETMANTSHZrribkz 2684 -VGETMANTSHZrrik 2685 -VGETMANTSHZrrikz 2686 -VGETMANTSSZrmi 2687 -VGETMANTSSZrmik 2688 -VGETMANTSSZrmikz 2689 -VGETMANTSSZrri 2690 -VGETMANTSSZrrib 2691 -VGETMANTSSZrribk 2692 -VGETMANTSSZrribkz 2693 -VGETMANTSSZrrik 2694 -VGETMANTSSZrrikz 2695 -VGF 2696 -VHADDPDYrm 2697 -VHADDPDYrr 2698 -VHADDPDrm 2699 -VHADDPDrr 2700 -VHADDPSYrm 2701 -VHADDPSYrr 2702 -VHADDPSrm 2703 -VHADDPSrr 2704 -VHSUBPDYrm 2705 -VHSUBPDYrr 2706 -VHSUBPDrm 2707 -VHSUBPDrr 2708 -VHSUBPSYrm 2709 -VHSUBPSYrr 2710 -VHSUBPSrm 2711 -VHSUBPSrr 2712 -VINSERTF 2713 -VINSERTI 2714 -VINSERTPSZrmi 2715 -VINSERTPSZrri 2716 -VINSERTPSrmi 2717 -VINSERTPSrri 2718 -VLDDQUYrm 2719 -VLDDQUrm 2720 -VLDMXCSR 2721 -VMASKMOVDQU 2722 -VMASKMOVPDYmr 2723 -VMASKMOVPDYrm 2724 -VMASKMOVPDmr 2725 -VMASKMOVPDrm 2726 -VMASKMOVPSYmr 2727 -VMASKMOVPSYrm 2728 -VMASKMOVPSmr 2729 -VMASKMOVPSrm 2730 -VMAXBF 2731 -VMAXCPDYrm 2732 -VMAXCPDYrr 2733 -VMAXCPDZ 2734 -VMAXCPDZrm 2735 -VMAXCPDZrmb 2736 -VMAXCPDZrmbk 2737 -VMAXCPDZrmbkz 2738 -VMAXCPDZrmk 2739 -VMAXCPDZrmkz 2740 -VMAXCPDZrr 2741 -VMAXCPDZrrk 2742 -VMAXCPDZrrkz 2743 -VMAXCPDrm 2744 -VMAXCPDrr 2745 -VMAXCPHZ 2746 -VMAXCPHZrm 2747 -VMAXCPHZrmb 2748 -VMAXCPHZrmbk 2749 -VMAXCPHZrmbkz 2750 -VMAXCPHZrmk 2751 -VMAXCPHZrmkz 2752 -VMAXCPHZrr 2753 -VMAXCPHZrrk 2754 -VMAXCPHZrrkz 2755 -VMAXCPSYrm 2756 -VMAXCPSYrr 2757 -VMAXCPSZ 2758 -VMAXCPSZrm 2759 -VMAXCPSZrmb 2760 -VMAXCPSZrmbk 2761 -VMAXCPSZrmbkz 2762 -VMAXCPSZrmk 2763 -VMAXCPSZrmkz 2764 -VMAXCPSZrr 2765 -VMAXCPSZrrk 2766 -VMAXCPSZrrkz 2767 -VMAXCPSrm 2768 -VMAXCPSrr 2769 -VMAXCSDZrm 2770 -VMAXCSDZrr 2771 -VMAXCSDrm 2772 -VMAXCSDrr 2773 -VMAXCSHZrm 2774 -VMAXCSHZrr 2775 -VMAXCSSZrm 2776 -VMAXCSSZrr 2777 -VMAXCSSrm 2778 -VMAXCSSrr 2779 -VMAXPDYrm 2780 -VMAXPDYrr 2781 -VMAXPDZ 2782 -VMAXPDZrm 2783 -VMAXPDZrmb 2784 -VMAXPDZrmbk 2785 -VMAXPDZrmbkz 2786 -VMAXPDZrmk 2787 -VMAXPDZrmkz 2788 -VMAXPDZrr 2789 -VMAXPDZrrb 2790 -VMAXPDZrrbk 2791 -VMAXPDZrrbkz 2792 -VMAXPDZrrk 2793 -VMAXPDZrrkz 2794 -VMAXPDrm 2795 -VMAXPDrr 2796 -VMAXPHZ 2797 -VMAXPHZrm 2798 -VMAXPHZrmb 2799 -VMAXPHZrmbk 2800 -VMAXPHZrmbkz 2801 -VMAXPHZrmk 2802 -VMAXPHZrmkz 2803 -VMAXPHZrr 2804 -VMAXPHZrrb 2805 -VMAXPHZrrbk 2806 -VMAXPHZrrbkz 2807 -VMAXPHZrrk 2808 -VMAXPHZrrkz 2809 -VMAXPSYrm 2810 -VMAXPSYrr 2811 -VMAXPSZ 2812 -VMAXPSZrm 2813 -VMAXPSZrmb 2814 -VMAXPSZrmbk 2815 -VMAXPSZrmbkz 2816 -VMAXPSZrmk 2817 -VMAXPSZrmkz 2818 -VMAXPSZrr 2819 -VMAXPSZrrb 2820 -VMAXPSZrrbk 2821 -VMAXPSZrrbkz 2822 -VMAXPSZrrk 2823 -VMAXPSZrrkz 2824 -VMAXPSrm 2825 -VMAXPSrr 2826 -VMAXSDZrm 2827 -VMAXSDZrm_Int 2828 -VMAXSDZrmk_Int 2829 -VMAXSDZrmkz_Int 2830 -VMAXSDZrr 2831 -VMAXSDZrr_Int 2832 -VMAXSDZrrb_Int 2833 -VMAXSDZrrbk_Int 2834 -VMAXSDZrrbkz_Int 2835 -VMAXSDZrrk_Int 2836 -VMAXSDZrrkz_Int 2837 -VMAXSDrm 2838 -VMAXSDrm_Int 2839 -VMAXSDrr 2840 -VMAXSDrr_Int 2841 -VMAXSHZrm 2842 -VMAXSHZrm_Int 2843 -VMAXSHZrmk_Int 2844 -VMAXSHZrmkz_Int 2845 -VMAXSHZrr 2846 -VMAXSHZrr_Int 2847 -VMAXSHZrrb_Int 2848 -VMAXSHZrrbk_Int 2849 -VMAXSHZrrbkz_Int 2850 -VMAXSHZrrk_Int 2851 -VMAXSHZrrkz_Int 2852 -VMAXSSZrm 2853 -VMAXSSZrm_Int 2854 -VMAXSSZrmk_Int 2855 -VMAXSSZrmkz_Int 2856 -VMAXSSZrr 2857 -VMAXSSZrr_Int 2858 -VMAXSSZrrb_Int 2859 -VMAXSSZrrbk_Int 2860 -VMAXSSZrrbkz_Int 2861 -VMAXSSZrrk_Int 2862 -VMAXSSZrrkz_Int 2863 -VMAXSSrm 2864 -VMAXSSrm_Int 2865 -VMAXSSrr 2866 -VMAXSSrr_Int 2867 -VMCALL 2868 -VMCLEARm 2869 -VMFUNC 2870 -VMINBF 2871 -VMINCPDYrm 2872 -VMINCPDYrr 2873 -VMINCPDZ 2874 -VMINCPDZrm 2875 -VMINCPDZrmb 2876 -VMINCPDZrmbk 2877 -VMINCPDZrmbkz 2878 -VMINCPDZrmk 2879 -VMINCPDZrmkz 2880 -VMINCPDZrr 2881 -VMINCPDZrrk 2882 -VMINCPDZrrkz 2883 -VMINCPDrm 2884 -VMINCPDrr 2885 -VMINCPHZ 2886 -VMINCPHZrm 2887 -VMINCPHZrmb 2888 -VMINCPHZrmbk 2889 -VMINCPHZrmbkz 2890 -VMINCPHZrmk 2891 -VMINCPHZrmkz 2892 -VMINCPHZrr 2893 -VMINCPHZrrk 2894 -VMINCPHZrrkz 2895 -VMINCPSYrm 2896 -VMINCPSYrr 2897 -VMINCPSZ 2898 -VMINCPSZrm 2899 -VMINCPSZrmb 2900 -VMINCPSZrmbk 2901 -VMINCPSZrmbkz 2902 -VMINCPSZrmk 2903 -VMINCPSZrmkz 2904 -VMINCPSZrr 2905 -VMINCPSZrrk 2906 -VMINCPSZrrkz 2907 -VMINCPSrm 2908 -VMINCPSrr 2909 -VMINCSDZrm 2910 -VMINCSDZrr 2911 -VMINCSDrm 2912 -VMINCSDrr 2913 -VMINCSHZrm 2914 -VMINCSHZrr 2915 -VMINCSSZrm 2916 -VMINCSSZrr 2917 -VMINCSSrm 2918 -VMINCSSrr 2919 -VMINMAXBF 2920 -VMINMAXPDZ 2921 -VMINMAXPDZrmbi 2922 -VMINMAXPDZrmbik 2923 -VMINMAXPDZrmbikz 2924 -VMINMAXPDZrmi 2925 -VMINMAXPDZrmik 2926 -VMINMAXPDZrmikz 2927 -VMINMAXPDZrri 2928 -VMINMAXPDZrrib 2929 -VMINMAXPDZrribk 2930 -VMINMAXPDZrribkz 2931 -VMINMAXPDZrrik 2932 -VMINMAXPDZrrikz 2933 -VMINMAXPHZ 2934 -VMINMAXPHZrmbi 2935 -VMINMAXPHZrmbik 2936 -VMINMAXPHZrmbikz 2937 -VMINMAXPHZrmi 2938 -VMINMAXPHZrmik 2939 -VMINMAXPHZrmikz 2940 -VMINMAXPHZrri 2941 -VMINMAXPHZrrib 2942 -VMINMAXPHZrribk 2943 -VMINMAXPHZrribkz 2944 -VMINMAXPHZrrik 2945 -VMINMAXPHZrrikz 2946 -VMINMAXPSZ 2947 -VMINMAXPSZrmbi 2948 -VMINMAXPSZrmbik 2949 -VMINMAXPSZrmbikz 2950 -VMINMAXPSZrmi 2951 -VMINMAXPSZrmik 2952 -VMINMAXPSZrmikz 2953 -VMINMAXPSZrri 2954 -VMINMAXPSZrrib 2955 -VMINMAXPSZrribk 2956 -VMINMAXPSZrribkz 2957 -VMINMAXPSZrrik 2958 -VMINMAXPSZrrikz 2959 -VMINMAXSDrmi 2960 -VMINMAXSDrmi_Int 2961 -VMINMAXSDrmik_Int 2962 -VMINMAXSDrmikz_Int 2963 -VMINMAXSDrri 2964 -VMINMAXSDrri_Int 2965 -VMINMAXSDrrib_Int 2966 -VMINMAXSDrribk_Int 2967 -VMINMAXSDrribkz_Int 2968 -VMINMAXSDrrik_Int 2969 -VMINMAXSDrrikz_Int 2970 -VMINMAXSHrmi 2971 -VMINMAXSHrmi_Int 2972 -VMINMAXSHrmik_Int 2973 -VMINMAXSHrmikz_Int 2974 -VMINMAXSHrri 2975 -VMINMAXSHrri_Int 2976 -VMINMAXSHrrib_Int 2977 -VMINMAXSHrribk_Int 2978 -VMINMAXSHrribkz_Int 2979 -VMINMAXSHrrik_Int 2980 -VMINMAXSHrrikz_Int 2981 -VMINMAXSSrmi 2982 -VMINMAXSSrmi_Int 2983 -VMINMAXSSrmik_Int 2984 -VMINMAXSSrmikz_Int 2985 -VMINMAXSSrri 2986 -VMINMAXSSrri_Int 2987 -VMINMAXSSrrib_Int 2988 -VMINMAXSSrribk_Int 2989 -VMINMAXSSrribkz_Int 2990 -VMINMAXSSrrik_Int 2991 -VMINMAXSSrrikz_Int 2992 -VMINPDYrm 2993 -VMINPDYrr 2994 -VMINPDZ 2995 -VMINPDZrm 2996 -VMINPDZrmb 2997 -VMINPDZrmbk 2998 -VMINPDZrmbkz 2999 -VMINPDZrmk 3000 -VMINPDZrmkz 3001 -VMINPDZrr 3002 -VMINPDZrrb 3003 -VMINPDZrrbk 3004 -VMINPDZrrbkz 3005 -VMINPDZrrk 3006 -VMINPDZrrkz 3007 -VMINPDrm 3008 -VMINPDrr 3009 -VMINPHZ 3010 -VMINPHZrm 3011 -VMINPHZrmb 3012 -VMINPHZrmbk 3013 -VMINPHZrmbkz 3014 -VMINPHZrmk 3015 -VMINPHZrmkz 3016 -VMINPHZrr 3017 -VMINPHZrrb 3018 -VMINPHZrrbk 3019 -VMINPHZrrbkz 3020 -VMINPHZrrk 3021 -VMINPHZrrkz 3022 -VMINPSYrm 3023 -VMINPSYrr 3024 -VMINPSZ 3025 -VMINPSZrm 3026 -VMINPSZrmb 3027 -VMINPSZrmbk 3028 -VMINPSZrmbkz 3029 -VMINPSZrmk 3030 -VMINPSZrmkz 3031 -VMINPSZrr 3032 -VMINPSZrrb 3033 -VMINPSZrrbk 3034 -VMINPSZrrbkz 3035 -VMINPSZrrk 3036 -VMINPSZrrkz 3037 -VMINPSrm 3038 -VMINPSrr 3039 -VMINSDZrm 3040 -VMINSDZrm_Int 3041 -VMINSDZrmk_Int 3042 -VMINSDZrmkz_Int 3043 -VMINSDZrr 3044 -VMINSDZrr_Int 3045 -VMINSDZrrb_Int 3046 -VMINSDZrrbk_Int 3047 -VMINSDZrrbkz_Int 3048 -VMINSDZrrk_Int 3049 -VMINSDZrrkz_Int 3050 -VMINSDrm 3051 -VMINSDrm_Int 3052 -VMINSDrr 3053 -VMINSDrr_Int 3054 -VMINSHZrm 3055 -VMINSHZrm_Int 3056 -VMINSHZrmk_Int 3057 -VMINSHZrmkz_Int 3058 -VMINSHZrr 3059 -VMINSHZrr_Int 3060 -VMINSHZrrb_Int 3061 -VMINSHZrrbk_Int 3062 -VMINSHZrrbkz_Int 3063 -VMINSHZrrk_Int 3064 -VMINSHZrrkz_Int 3065 -VMINSSZrm 3066 -VMINSSZrm_Int 3067 -VMINSSZrmk_Int 3068 -VMINSSZrmkz_Int 3069 -VMINSSZrr 3070 -VMINSSZrr_Int 3071 -VMINSSZrrb_Int 3072 -VMINSSZrrbk_Int 3073 -VMINSSZrrbkz_Int 3074 -VMINSSZrrk_Int 3075 -VMINSSZrrkz_Int 3076 -VMINSSrm 3077 -VMINSSrm_Int 3078 -VMINSSrr 3079 -VMINSSrr_Int 3080 -VMLAUNCH 3081 -VMLOAD 3082 -VMMCALL 3083 -VMOV 3084 -VMOVAPDYmr 3085 -VMOVAPDYrm 3086 -VMOVAPDYrr 3087 -VMOVAPDYrr_REV 3088 -VMOVAPDZ 3089 -VMOVAPDZmr 3090 -VMOVAPDZmrk 3091 -VMOVAPDZrm 3092 -VMOVAPDZrmk 3093 -VMOVAPDZrmkz 3094 -VMOVAPDZrr 3095 -VMOVAPDZrr_REV 3096 -VMOVAPDZrrk 3097 -VMOVAPDZrrk_REV 3098 -VMOVAPDZrrkz 3099 -VMOVAPDZrrkz_REV 3100 -VMOVAPDmr 3101 -VMOVAPDrm 3102 -VMOVAPDrr 3103 -VMOVAPDrr_REV 3104 -VMOVAPSYmr 3105 -VMOVAPSYrm 3106 -VMOVAPSYrr 3107 -VMOVAPSYrr_REV 3108 -VMOVAPSZ 3109 -VMOVAPSZmr 3110 -VMOVAPSZmrk 3111 -VMOVAPSZrm 3112 -VMOVAPSZrmk 3113 -VMOVAPSZrmkz 3114 -VMOVAPSZrr 3115 -VMOVAPSZrr_REV 3116 -VMOVAPSZrrk 3117 -VMOVAPSZrrk_REV 3118 -VMOVAPSZrrkz 3119 -VMOVAPSZrrkz_REV 3120 -VMOVAPSmr 3121 -VMOVAPSrm 3122 -VMOVAPSrr 3123 -VMOVAPSrr_REV 3124 -VMOVDDUPYrm 3125 -VMOVDDUPYrr 3126 -VMOVDDUPZ 3127 -VMOVDDUPZrm 3128 -VMOVDDUPZrmk 3129 -VMOVDDUPZrmkz 3130 -VMOVDDUPZrr 3131 -VMOVDDUPZrrk 3132 -VMOVDDUPZrrkz 3133 -VMOVDDUPrm 3134 -VMOVDDUPrr 3135 -VMOVDI 3136 -VMOVDQA 3137 -VMOVDQAYmr 3138 -VMOVDQAYrm 3139 -VMOVDQAYrr 3140 -VMOVDQAYrr_REV 3141 -VMOVDQAmr 3142 -VMOVDQArm 3143 -VMOVDQArr 3144 -VMOVDQArr_REV 3145 -VMOVDQU 3146 -VMOVDQUYmr 3147 -VMOVDQUYrm 3148 -VMOVDQUYrr 3149 -VMOVDQUYrr_REV 3150 -VMOVDQUmr 3151 -VMOVDQUrm 3152 -VMOVDQUrr 3153 -VMOVDQUrr_REV 3154 -VMOVHLPSZrr 3155 -VMOVHLPSrr 3156 -VMOVHPDZ 3157 -VMOVHPDmr 3158 -VMOVHPDrm 3159 -VMOVHPSZ 3160 -VMOVHPSmr 3161 -VMOVHPSrm 3162 -VMOVLHPSZrr 3163 -VMOVLHPSrr 3164 -VMOVLPDZ 3165 -VMOVLPDmr 3166 -VMOVLPDrm 3167 -VMOVLPSZ 3168 -VMOVLPSmr 3169 -VMOVLPSrm 3170 -VMOVMSKPDYrr 3171 -VMOVMSKPDrr 3172 -VMOVMSKPSYrr 3173 -VMOVMSKPSrr 3174 -VMOVNTDQAYrm 3175 -VMOVNTDQAZ 3176 -VMOVNTDQAZrm 3177 -VMOVNTDQArm 3178 -VMOVNTDQYmr 3179 -VMOVNTDQZ 3180 -VMOVNTDQZmr 3181 -VMOVNTDQmr 3182 -VMOVNTPDYmr 3183 -VMOVNTPDZ 3184 -VMOVNTPDZmr 3185 -VMOVNTPDmr 3186 -VMOVNTPSYmr 3187 -VMOVNTPSZ 3188 -VMOVNTPSZmr 3189 -VMOVNTPSmr 3190 -VMOVPDI 3191 -VMOVPQI 3192 -VMOVPQIto 3193 -VMOVQI 3194 -VMOVRSBZ 3195 -VMOVRSBZm 3196 -VMOVRSBZmk 3197 -VMOVRSBZmkz 3198 -VMOVRSDZ 3199 -VMOVRSDZm 3200 -VMOVRSDZmk 3201 -VMOVRSDZmkz 3202 -VMOVRSQZ 3203 -VMOVRSQZm 3204 -VMOVRSQZmk 3205 -VMOVRSQZmkz 3206 -VMOVRSWZ 3207 -VMOVRSWZm 3208 -VMOVRSWZmk 3209 -VMOVRSWZmkz 3210 -VMOVSDZmr 3211 -VMOVSDZmrk 3212 -VMOVSDZrm 3213 -VMOVSDZrm_alt 3214 -VMOVSDZrmk 3215 -VMOVSDZrmkz 3216 -VMOVSDZrr 3217 -VMOVSDZrr_REV 3218 -VMOVSDZrrk 3219 -VMOVSDZrrk_REV 3220 -VMOVSDZrrkz 3221 -VMOVSDZrrkz_REV 3222 -VMOVSDmr 3223 -VMOVSDrm 3224 -VMOVSDrm_alt 3225 -VMOVSDrr 3226 -VMOVSDrr_REV 3227 -VMOVSDto 3228 -VMOVSH 3229 -VMOVSHDUPYrm 3230 -VMOVSHDUPYrr 3231 -VMOVSHDUPZ 3232 -VMOVSHDUPZrm 3233 -VMOVSHDUPZrmk 3234 -VMOVSHDUPZrmkz 3235 -VMOVSHDUPZrr 3236 -VMOVSHDUPZrrk 3237 -VMOVSHDUPZrrkz 3238 -VMOVSHDUPrm 3239 -VMOVSHDUPrr 3240 -VMOVSHZmr 3241 -VMOVSHZmrk 3242 -VMOVSHZrm 3243 -VMOVSHZrm_alt 3244 -VMOVSHZrmk 3245 -VMOVSHZrmkz 3246 -VMOVSHZrr 3247 -VMOVSHZrr_REV 3248 -VMOVSHZrrk 3249 -VMOVSHZrrk_REV 3250 -VMOVSHZrrkz 3251 -VMOVSHZrrkz_REV 3252 -VMOVSHtoW 3253 -VMOVSLDUPYrm 3254 -VMOVSLDUPYrr 3255 -VMOVSLDUPZ 3256 -VMOVSLDUPZrm 3257 -VMOVSLDUPZrmk 3258 -VMOVSLDUPZrmkz 3259 -VMOVSLDUPZrr 3260 -VMOVSLDUPZrrk 3261 -VMOVSLDUPZrrkz 3262 -VMOVSLDUPrm 3263 -VMOVSLDUPrr 3264 -VMOVSS 3265 -VMOVSSZmr 3266 -VMOVSSZmrk 3267 -VMOVSSZrm 3268 -VMOVSSZrm_alt 3269 -VMOVSSZrmk 3270 -VMOVSSZrmkz 3271 -VMOVSSZrr 3272 -VMOVSSZrr_REV 3273 -VMOVSSZrrk 3274 -VMOVSSZrrk_REV 3275 -VMOVSSZrrkz 3276 -VMOVSSZrrkz_REV 3277 -VMOVSSmr 3278 -VMOVSSrm 3279 -VMOVSSrm_alt 3280 -VMOVSSrr 3281 -VMOVSSrr_REV 3282 -VMOVUPDYmr 3283 -VMOVUPDYrm 3284 -VMOVUPDYrr 3285 -VMOVUPDYrr_REV 3286 -VMOVUPDZ 3287 -VMOVUPDZmr 3288 -VMOVUPDZmrk 3289 -VMOVUPDZrm 3290 -VMOVUPDZrmk 3291 -VMOVUPDZrmkz 3292 -VMOVUPDZrr 3293 -VMOVUPDZrr_REV 3294 -VMOVUPDZrrk 3295 -VMOVUPDZrrk_REV 3296 -VMOVUPDZrrkz 3297 -VMOVUPDZrrkz_REV 3298 -VMOVUPDmr 3299 -VMOVUPDrm 3300 -VMOVUPDrr 3301 -VMOVUPDrr_REV 3302 -VMOVUPSYmr 3303 -VMOVUPSYrm 3304 -VMOVUPSYrr 3305 -VMOVUPSYrr_REV 3306 -VMOVUPSZ 3307 -VMOVUPSZmr 3308 -VMOVUPSZmrk 3309 -VMOVUPSZrm 3310 -VMOVUPSZrmk 3311 -VMOVUPSZrmkz 3312 -VMOVUPSZrr 3313 -VMOVUPSZrr_REV 3314 -VMOVUPSZrrk 3315 -VMOVUPSZrrk_REV 3316 -VMOVUPSZrrkz 3317 -VMOVUPSZrrkz_REV 3318 -VMOVUPSmr 3319 -VMOVUPSrm 3320 -VMOVUPSrr 3321 -VMOVUPSrr_REV 3322 -VMOVW 3323 -VMOVWmr 3324 -VMOVWrm 3325 -VMOVZPDILo 3326 -VMOVZPQILo 3327 -VMOVZPWILo 3328 -VMPSADBWYrmi 3329 -VMPSADBWYrri 3330 -VMPSADBWZ 3331 -VMPSADBWZrmi 3332 -VMPSADBWZrmik 3333 -VMPSADBWZrmikz 3334 -VMPSADBWZrri 3335 -VMPSADBWZrrik 3336 -VMPSADBWZrrikz 3337 -VMPSADBWrmi 3338 -VMPSADBWrri 3339 -VMPTRLDm 3340 -VMPTRSTm 3341 -VMREAD 3342 -VMRESUME 3343 -VMRUN 3344 -VMSAVE 3345 -VMULBF 3346 -VMULPDYrm 3347 -VMULPDYrr 3348 -VMULPDZ 3349 -VMULPDZrm 3350 -VMULPDZrmb 3351 -VMULPDZrmbk 3352 -VMULPDZrmbkz 3353 -VMULPDZrmk 3354 -VMULPDZrmkz 3355 -VMULPDZrr 3356 -VMULPDZrrb 3357 -VMULPDZrrbk 3358 -VMULPDZrrbkz 3359 -VMULPDZrrk 3360 -VMULPDZrrkz 3361 -VMULPDrm 3362 -VMULPDrr 3363 -VMULPHZ 3364 -VMULPHZrm 3365 -VMULPHZrmb 3366 -VMULPHZrmbk 3367 -VMULPHZrmbkz 3368 -VMULPHZrmk 3369 -VMULPHZrmkz 3370 -VMULPHZrr 3371 -VMULPHZrrb 3372 -VMULPHZrrbk 3373 -VMULPHZrrbkz 3374 -VMULPHZrrk 3375 -VMULPHZrrkz 3376 -VMULPSYrm 3377 -VMULPSYrr 3378 -VMULPSZ 3379 -VMULPSZrm 3380 -VMULPSZrmb 3381 -VMULPSZrmbk 3382 -VMULPSZrmbkz 3383 -VMULPSZrmk 3384 -VMULPSZrmkz 3385 -VMULPSZrr 3386 -VMULPSZrrb 3387 -VMULPSZrrbk 3388 -VMULPSZrrbkz 3389 -VMULPSZrrk 3390 -VMULPSZrrkz 3391 -VMULPSrm 3392 -VMULPSrr 3393 -VMULSDZrm 3394 -VMULSDZrm_Int 3395 -VMULSDZrmk_Int 3396 -VMULSDZrmkz_Int 3397 -VMULSDZrr 3398 -VMULSDZrr_Int 3399 -VMULSDZrrb_Int 3400 -VMULSDZrrbk_Int 3401 -VMULSDZrrbkz_Int 3402 -VMULSDZrrk_Int 3403 -VMULSDZrrkz_Int 3404 -VMULSDrm 3405 -VMULSDrm_Int 3406 -VMULSDrr 3407 -VMULSDrr_Int 3408 -VMULSHZrm 3409 -VMULSHZrm_Int 3410 -VMULSHZrmk_Int 3411 -VMULSHZrmkz_Int 3412 -VMULSHZrr 3413 -VMULSHZrr_Int 3414 -VMULSHZrrb_Int 3415 -VMULSHZrrbk_Int 3416 -VMULSHZrrbkz_Int 3417 -VMULSHZrrk_Int 3418 -VMULSHZrrkz_Int 3419 -VMULSSZrm 3420 -VMULSSZrm_Int 3421 -VMULSSZrmk_Int 3422 -VMULSSZrmkz_Int 3423 -VMULSSZrr 3424 -VMULSSZrr_Int 3425 -VMULSSZrrb_Int 3426 -VMULSSZrrbk_Int 3427 -VMULSSZrrbkz_Int 3428 -VMULSSZrrk_Int 3429 -VMULSSZrrkz_Int 3430 -VMULSSrm 3431 -VMULSSrm_Int 3432 -VMULSSrr 3433 -VMULSSrr_Int 3434 -VMWRITE 3435 -VMXOFF 3436 -VMXON 3437 -VORPDYrm 3438 -VORPDYrr 3439 -VORPDZ 3440 -VORPDZrm 3441 -VORPDZrmb 3442 -VORPDZrmbk 3443 -VORPDZrmbkz 3444 -VORPDZrmk 3445 -VORPDZrmkz 3446 -VORPDZrr 3447 -VORPDZrrk 3448 -VORPDZrrkz 3449 -VORPDrm 3450 -VORPDrr 3451 -VORPSYrm 3452 -VORPSYrr 3453 -VORPSZ 3454 -VORPSZrm 3455 -VORPSZrmb 3456 -VORPSZrmbk 3457 -VORPSZrmbkz 3458 -VORPSZrmk 3459 -VORPSZrmkz 3460 -VORPSZrr 3461 -VORPSZrrk 3462 -VORPSZrrkz 3463 -VORPSrm 3464 -VORPSrr 3465 -VP 3466 -VPABSBYrm 3467 -VPABSBYrr 3468 -VPABSBZ 3469 -VPABSBZrm 3470 -VPABSBZrmk 3471 -VPABSBZrmkz 3472 -VPABSBZrr 3473 -VPABSBZrrk 3474 -VPABSBZrrkz 3475 -VPABSBrm 3476 -VPABSBrr 3477 -VPABSDYrm 3478 -VPABSDYrr 3479 -VPABSDZ 3480 -VPABSDZrm 3481 -VPABSDZrmb 3482 -VPABSDZrmbk 3483 -VPABSDZrmbkz 3484 -VPABSDZrmk 3485 -VPABSDZrmkz 3486 -VPABSDZrr 3487 -VPABSDZrrk 3488 -VPABSDZrrkz 3489 -VPABSDrm 3490 -VPABSDrr 3491 -VPABSQZ 3492 -VPABSQZrm 3493 -VPABSQZrmb 3494 -VPABSQZrmbk 3495 -VPABSQZrmbkz 3496 -VPABSQZrmk 3497 -VPABSQZrmkz 3498 -VPABSQZrr 3499 -VPABSQZrrk 3500 -VPABSQZrrkz 3501 -VPABSWYrm 3502 -VPABSWYrr 3503 -VPABSWZ 3504 -VPABSWZrm 3505 -VPABSWZrmk 3506 -VPABSWZrmkz 3507 -VPABSWZrr 3508 -VPABSWZrrk 3509 -VPABSWZrrkz 3510 -VPABSWrm 3511 -VPABSWrr 3512 -VPACKSSDWYrm 3513 -VPACKSSDWYrr 3514 -VPACKSSDWZ 3515 -VPACKSSDWZrm 3516 -VPACKSSDWZrmb 3517 -VPACKSSDWZrmbk 3518 -VPACKSSDWZrmbkz 3519 -VPACKSSDWZrmk 3520 -VPACKSSDWZrmkz 3521 -VPACKSSDWZrr 3522 -VPACKSSDWZrrk 3523 -VPACKSSDWZrrkz 3524 -VPACKSSDWrm 3525 -VPACKSSDWrr 3526 -VPACKSSWBYrm 3527 -VPACKSSWBYrr 3528 -VPACKSSWBZ 3529 -VPACKSSWBZrm 3530 -VPACKSSWBZrmk 3531 -VPACKSSWBZrmkz 3532 -VPACKSSWBZrr 3533 -VPACKSSWBZrrk 3534 -VPACKSSWBZrrkz 3535 -VPACKSSWBrm 3536 -VPACKSSWBrr 3537 -VPACKUSDWYrm 3538 -VPACKUSDWYrr 3539 -VPACKUSDWZ 3540 -VPACKUSDWZrm 3541 -VPACKUSDWZrmb 3542 -VPACKUSDWZrmbk 3543 -VPACKUSDWZrmbkz 3544 -VPACKUSDWZrmk 3545 -VPACKUSDWZrmkz 3546 -VPACKUSDWZrr 3547 -VPACKUSDWZrrk 3548 -VPACKUSDWZrrkz 3549 -VPACKUSDWrm 3550 -VPACKUSDWrr 3551 -VPACKUSWBYrm 3552 -VPACKUSWBYrr 3553 -VPACKUSWBZ 3554 -VPACKUSWBZrm 3555 -VPACKUSWBZrmk 3556 -VPACKUSWBZrmkz 3557 -VPACKUSWBZrr 3558 -VPACKUSWBZrrk 3559 -VPACKUSWBZrrkz 3560 -VPACKUSWBrm 3561 -VPACKUSWBrr 3562 -VPADDBYrm 3563 -VPADDBYrr 3564 -VPADDBZ 3565 -VPADDBZrm 3566 -VPADDBZrmk 3567 -VPADDBZrmkz 3568 -VPADDBZrr 3569 -VPADDBZrrk 3570 -VPADDBZrrkz 3571 -VPADDBrm 3572 -VPADDBrr 3573 -VPADDDYrm 3574 -VPADDDYrr 3575 -VPADDDZ 3576 -VPADDDZrm 3577 -VPADDDZrmb 3578 -VPADDDZrmbk 3579 -VPADDDZrmbkz 3580 -VPADDDZrmk 3581 -VPADDDZrmkz 3582 -VPADDDZrr 3583 -VPADDDZrrk 3584 -VPADDDZrrkz 3585 -VPADDDrm 3586 -VPADDDrr 3587 -VPADDQYrm 3588 -VPADDQYrr 3589 -VPADDQZ 3590 -VPADDQZrm 3591 -VPADDQZrmb 3592 -VPADDQZrmbk 3593 -VPADDQZrmbkz 3594 -VPADDQZrmk 3595 -VPADDQZrmkz 3596 -VPADDQZrr 3597 -VPADDQZrrk 3598 -VPADDQZrrkz 3599 -VPADDQrm 3600 -VPADDQrr 3601 -VPADDSBYrm 3602 -VPADDSBYrr 3603 -VPADDSBZ 3604 -VPADDSBZrm 3605 -VPADDSBZrmk 3606 -VPADDSBZrmkz 3607 -VPADDSBZrr 3608 -VPADDSBZrrk 3609 -VPADDSBZrrkz 3610 -VPADDSBrm 3611 -VPADDSBrr 3612 -VPADDSWYrm 3613 -VPADDSWYrr 3614 -VPADDSWZ 3615 -VPADDSWZrm 3616 -VPADDSWZrmk 3617 -VPADDSWZrmkz 3618 -VPADDSWZrr 3619 -VPADDSWZrrk 3620 -VPADDSWZrrkz 3621 -VPADDSWrm 3622 -VPADDSWrr 3623 -VPADDUSBYrm 3624 -VPADDUSBYrr 3625 -VPADDUSBZ 3626 -VPADDUSBZrm 3627 -VPADDUSBZrmk 3628 -VPADDUSBZrmkz 3629 -VPADDUSBZrr 3630 -VPADDUSBZrrk 3631 -VPADDUSBZrrkz 3632 -VPADDUSBrm 3633 -VPADDUSBrr 3634 -VPADDUSWYrm 3635 -VPADDUSWYrr 3636 -VPADDUSWZ 3637 -VPADDUSWZrm 3638 -VPADDUSWZrmk 3639 -VPADDUSWZrmkz 3640 -VPADDUSWZrr 3641 -VPADDUSWZrrk 3642 -VPADDUSWZrrkz 3643 -VPADDUSWrm 3644 -VPADDUSWrr 3645 -VPADDWYrm 3646 -VPADDWYrr 3647 -VPADDWZ 3648 -VPADDWZrm 3649 -VPADDWZrmk 3650 -VPADDWZrmkz 3651 -VPADDWZrr 3652 -VPADDWZrrk 3653 -VPADDWZrrkz 3654 -VPADDWrm 3655 -VPADDWrr 3656 -VPALIGNRYrmi 3657 -VPALIGNRYrri 3658 -VPALIGNRZ 3659 -VPALIGNRZrmi 3660 -VPALIGNRZrmik 3661 -VPALIGNRZrmikz 3662 -VPALIGNRZrri 3663 -VPALIGNRZrrik 3664 -VPALIGNRZrrikz 3665 -VPALIGNRrmi 3666 -VPALIGNRrri 3667 -VPANDDZ 3668 -VPANDDZrm 3669 -VPANDDZrmb 3670 -VPANDDZrmbk 3671 -VPANDDZrmbkz 3672 -VPANDDZrmk 3673 -VPANDDZrmkz 3674 -VPANDDZrr 3675 -VPANDDZrrk 3676 -VPANDDZrrkz 3677 -VPANDNDZ 3678 -VPANDNDZrm 3679 -VPANDNDZrmb 3680 -VPANDNDZrmbk 3681 -VPANDNDZrmbkz 3682 -VPANDNDZrmk 3683 -VPANDNDZrmkz 3684 -VPANDNDZrr 3685 -VPANDNDZrrk 3686 -VPANDNDZrrkz 3687 -VPANDNQZ 3688 -VPANDNQZrm 3689 -VPANDNQZrmb 3690 -VPANDNQZrmbk 3691 -VPANDNQZrmbkz 3692 -VPANDNQZrmk 3693 -VPANDNQZrmkz 3694 -VPANDNQZrr 3695 -VPANDNQZrrk 3696 -VPANDNQZrrkz 3697 -VPANDNYrm 3698 -VPANDNYrr 3699 -VPANDNrm 3700 -VPANDNrr 3701 -VPANDQZ 3702 -VPANDQZrm 3703 -VPANDQZrmb 3704 -VPANDQZrmbk 3705 -VPANDQZrmbkz 3706 -VPANDQZrmk 3707 -VPANDQZrmkz 3708 -VPANDQZrr 3709 -VPANDQZrrk 3710 -VPANDQZrrkz 3711 -VPANDYrm 3712 -VPANDYrr 3713 -VPANDrm 3714 -VPANDrr 3715 -VPAVGBYrm 3716 -VPAVGBYrr 3717 -VPAVGBZ 3718 -VPAVGBZrm 3719 -VPAVGBZrmk 3720 -VPAVGBZrmkz 3721 -VPAVGBZrr 3722 -VPAVGBZrrk 3723 -VPAVGBZrrkz 3724 -VPAVGBrm 3725 -VPAVGBrr 3726 -VPAVGWYrm 3727 -VPAVGWYrr 3728 -VPAVGWZ 3729 -VPAVGWZrm 3730 -VPAVGWZrmk 3731 -VPAVGWZrmkz 3732 -VPAVGWZrr 3733 -VPAVGWZrrk 3734 -VPAVGWZrrkz 3735 -VPAVGWrm 3736 -VPAVGWrr 3737 -VPBLENDDYrmi 3738 -VPBLENDDYrri 3739 -VPBLENDDrmi 3740 -VPBLENDDrri 3741 -VPBLENDMBZ 3742 -VPBLENDMBZrm 3743 -VPBLENDMBZrmk 3744 -VPBLENDMBZrmkz 3745 -VPBLENDMBZrr 3746 -VPBLENDMBZrrk 3747 -VPBLENDMBZrrkz 3748 -VPBLENDMDZ 3749 -VPBLENDMDZrm 3750 -VPBLENDMDZrmb 3751 -VPBLENDMDZrmbk 3752 -VPBLENDMDZrmbkz 3753 -VPBLENDMDZrmk 3754 -VPBLENDMDZrmkz 3755 -VPBLENDMDZrr 3756 -VPBLENDMDZrrk 3757 -VPBLENDMDZrrkz 3758 -VPBLENDMQZ 3759 -VPBLENDMQZrm 3760 -VPBLENDMQZrmb 3761 -VPBLENDMQZrmbk 3762 -VPBLENDMQZrmbkz 3763 -VPBLENDMQZrmk 3764 -VPBLENDMQZrmkz 3765 -VPBLENDMQZrr 3766 -VPBLENDMQZrrk 3767 -VPBLENDMQZrrkz 3768 -VPBLENDMWZ 3769 -VPBLENDMWZrm 3770 -VPBLENDMWZrmk 3771 -VPBLENDMWZrmkz 3772 -VPBLENDMWZrr 3773 -VPBLENDMWZrrk 3774 -VPBLENDMWZrrkz 3775 -VPBLENDVBYrmr 3776 -VPBLENDVBYrrr 3777 -VPBLENDVBrmr 3778 -VPBLENDVBrrr 3779 -VPBLENDWYrmi 3780 -VPBLENDWYrri 3781 -VPBLENDWrmi 3782 -VPBLENDWrri 3783 -VPBROADCASTBYrm 3784 -VPBROADCASTBYrr 3785 -VPBROADCASTBZ 3786 -VPBROADCASTBZrm 3787 -VPBROADCASTBZrmk 3788 -VPBROADCASTBZrmkz 3789 -VPBROADCASTBZrr 3790 -VPBROADCASTBZrrk 3791 -VPBROADCASTBZrrkz 3792 -VPBROADCASTBrZ 3793 -VPBROADCASTBrZrr 3794 -VPBROADCASTBrZrrk 3795 -VPBROADCASTBrZrrkz 3796 -VPBROADCASTBrm 3797 -VPBROADCASTBrr 3798 -VPBROADCASTDYrm 3799 -VPBROADCASTDYrr 3800 -VPBROADCASTDZ 3801 -VPBROADCASTDZrm 3802 -VPBROADCASTDZrmk 3803 -VPBROADCASTDZrmkz 3804 -VPBROADCASTDZrr 3805 -VPBROADCASTDZrrk 3806 -VPBROADCASTDZrrkz 3807 -VPBROADCASTDrZ 3808 -VPBROADCASTDrZrr 3809 -VPBROADCASTDrZrrk 3810 -VPBROADCASTDrZrrkz 3811 -VPBROADCASTDrm 3812 -VPBROADCASTDrr 3813 -VPBROADCASTMB 3814 -VPBROADCASTMW 3815 -VPBROADCASTQYrm 3816 -VPBROADCASTQYrr 3817 -VPBROADCASTQZ 3818 -VPBROADCASTQZrm 3819 -VPBROADCASTQZrmk 3820 -VPBROADCASTQZrmkz 3821 -VPBROADCASTQZrr 3822 -VPBROADCASTQZrrk 3823 -VPBROADCASTQZrrkz 3824 -VPBROADCASTQrZ 3825 -VPBROADCASTQrZrr 3826 -VPBROADCASTQrZrrk 3827 -VPBROADCASTQrZrrkz 3828 -VPBROADCASTQrm 3829 -VPBROADCASTQrr 3830 -VPBROADCASTWYrm 3831 -VPBROADCASTWYrr 3832 -VPBROADCASTWZ 3833 -VPBROADCASTWZrm 3834 -VPBROADCASTWZrmk 3835 -VPBROADCASTWZrmkz 3836 -VPBROADCASTWZrr 3837 -VPBROADCASTWZrrk 3838 -VPBROADCASTWZrrkz 3839 -VPBROADCASTWrZ 3840 -VPBROADCASTWrZrr 3841 -VPBROADCASTWrZrrk 3842 -VPBROADCASTWrZrrkz 3843 -VPBROADCASTWrm 3844 -VPBROADCASTWrr 3845 -VPCLMULQDQYrmi 3846 -VPCLMULQDQYrri 3847 -VPCLMULQDQZ 3848 -VPCLMULQDQZrmi 3849 -VPCLMULQDQZrri 3850 -VPCLMULQDQrmi 3851 -VPCLMULQDQrri 3852 -VPCMOVYrmr 3853 -VPCMOVYrrm 3854 -VPCMOVYrrr 3855 -VPCMOVYrrr_REV 3856 -VPCMOVrmr 3857 -VPCMOVrrm 3858 -VPCMOVrrr 3859 -VPCMOVrrr_REV 3860 -VPCMPBZ 3861 -VPCMPBZrmi 3862 -VPCMPBZrmik 3863 -VPCMPBZrri 3864 -VPCMPBZrrik 3865 -VPCMPDZ 3866 -VPCMPDZrmbi 3867 -VPCMPDZrmbik 3868 -VPCMPDZrmi 3869 -VPCMPDZrmik 3870 -VPCMPDZrri 3871 -VPCMPDZrrik 3872 -VPCMPEQBYrm 3873 -VPCMPEQBYrr 3874 -VPCMPEQBZ 3875 -VPCMPEQBZrm 3876 -VPCMPEQBZrmk 3877 -VPCMPEQBZrr 3878 -VPCMPEQBZrrk 3879 -VPCMPEQBrm 3880 -VPCMPEQBrr 3881 -VPCMPEQDYrm 3882 -VPCMPEQDYrr 3883 -VPCMPEQDZ 3884 -VPCMPEQDZrm 3885 -VPCMPEQDZrmb 3886 -VPCMPEQDZrmbk 3887 -VPCMPEQDZrmk 3888 -VPCMPEQDZrr 3889 -VPCMPEQDZrrk 3890 -VPCMPEQDrm 3891 -VPCMPEQDrr 3892 -VPCMPEQQYrm 3893 -VPCMPEQQYrr 3894 -VPCMPEQQZ 3895 -VPCMPEQQZrm 3896 -VPCMPEQQZrmb 3897 -VPCMPEQQZrmbk 3898 -VPCMPEQQZrmk 3899 -VPCMPEQQZrr 3900 -VPCMPEQQZrrk 3901 -VPCMPEQQrm 3902 -VPCMPEQQrr 3903 -VPCMPEQWYrm 3904 -VPCMPEQWYrr 3905 -VPCMPEQWZ 3906 -VPCMPEQWZrm 3907 -VPCMPEQWZrmk 3908 -VPCMPEQWZrr 3909 -VPCMPEQWZrrk 3910 -VPCMPEQWrm 3911 -VPCMPEQWrr 3912 -VPCMPESTRIrmi 3913 -VPCMPESTRIrri 3914 -VPCMPESTRMrmi 3915 -VPCMPESTRMrri 3916 -VPCMPGTBYrm 3917 -VPCMPGTBYrr 3918 -VPCMPGTBZ 3919 -VPCMPGTBZrm 3920 -VPCMPGTBZrmk 3921 -VPCMPGTBZrr 3922 -VPCMPGTBZrrk 3923 -VPCMPGTBrm 3924 -VPCMPGTBrr 3925 -VPCMPGTDYrm 3926 -VPCMPGTDYrr 3927 -VPCMPGTDZ 3928 -VPCMPGTDZrm 3929 -VPCMPGTDZrmb 3930 -VPCMPGTDZrmbk 3931 -VPCMPGTDZrmk 3932 -VPCMPGTDZrr 3933 -VPCMPGTDZrrk 3934 -VPCMPGTDrm 3935 -VPCMPGTDrr 3936 -VPCMPGTQYrm 3937 -VPCMPGTQYrr 3938 -VPCMPGTQZ 3939 -VPCMPGTQZrm 3940 -VPCMPGTQZrmb 3941 -VPCMPGTQZrmbk 3942 -VPCMPGTQZrmk 3943 -VPCMPGTQZrr 3944 -VPCMPGTQZrrk 3945 -VPCMPGTQrm 3946 -VPCMPGTQrr 3947 -VPCMPGTWYrm 3948 -VPCMPGTWYrr 3949 -VPCMPGTWZ 3950 -VPCMPGTWZrm 3951 -VPCMPGTWZrmk 3952 -VPCMPGTWZrr 3953 -VPCMPGTWZrrk 3954 -VPCMPGTWrm 3955 -VPCMPGTWrr 3956 -VPCMPISTRIrmi 3957 -VPCMPISTRIrri 3958 -VPCMPISTRMrmi 3959 -VPCMPISTRMrri 3960 -VPCMPQZ 3961 -VPCMPQZrmbi 3962 -VPCMPQZrmbik 3963 -VPCMPQZrmi 3964 -VPCMPQZrmik 3965 -VPCMPQZrri 3966 -VPCMPQZrrik 3967 -VPCMPUBZ 3968 -VPCMPUBZrmi 3969 -VPCMPUBZrmik 3970 -VPCMPUBZrri 3971 -VPCMPUBZrrik 3972 -VPCMPUDZ 3973 -VPCMPUDZrmbi 3974 -VPCMPUDZrmbik 3975 -VPCMPUDZrmi 3976 -VPCMPUDZrmik 3977 -VPCMPUDZrri 3978 -VPCMPUDZrrik 3979 -VPCMPUQZ 3980 -VPCMPUQZrmbi 3981 -VPCMPUQZrmbik 3982 -VPCMPUQZrmi 3983 -VPCMPUQZrmik 3984 -VPCMPUQZrri 3985 -VPCMPUQZrrik 3986 -VPCMPUWZ 3987 -VPCMPUWZrmi 3988 -VPCMPUWZrmik 3989 -VPCMPUWZrri 3990 -VPCMPUWZrrik 3991 -VPCMPWZ 3992 -VPCMPWZrmi 3993 -VPCMPWZrmik 3994 -VPCMPWZrri 3995 -VPCMPWZrrik 3996 -VPCOMBmi 3997 -VPCOMBri 3998 -VPCOMDmi 3999 -VPCOMDri 4000 -VPCOMPRESSBZ 4001 -VPCOMPRESSBZmr 4002 -VPCOMPRESSBZmrk 4003 -VPCOMPRESSBZrr 4004 -VPCOMPRESSBZrrk 4005 -VPCOMPRESSBZrrkz 4006 -VPCOMPRESSDZ 4007 -VPCOMPRESSDZmr 4008 -VPCOMPRESSDZmrk 4009 -VPCOMPRESSDZrr 4010 -VPCOMPRESSDZrrk 4011 -VPCOMPRESSDZrrkz 4012 -VPCOMPRESSQZ 4013 -VPCOMPRESSQZmr 4014 -VPCOMPRESSQZmrk 4015 -VPCOMPRESSQZrr 4016 -VPCOMPRESSQZrrk 4017 -VPCOMPRESSQZrrkz 4018 -VPCOMPRESSWZ 4019 -VPCOMPRESSWZmr 4020 -VPCOMPRESSWZmrk 4021 -VPCOMPRESSWZrr 4022 -VPCOMPRESSWZrrk 4023 -VPCOMPRESSWZrrkz 4024 -VPCOMQmi 4025 -VPCOMQri 4026 -VPCOMUBmi 4027 -VPCOMUBri 4028 -VPCOMUDmi 4029 -VPCOMUDri 4030 -VPCOMUQmi 4031 -VPCOMUQri 4032 -VPCOMUWmi 4033 -VPCOMUWri 4034 -VPCOMWmi 4035 -VPCOMWri 4036 -VPCONFLICTDZ 4037 -VPCONFLICTDZrm 4038 -VPCONFLICTDZrmb 4039 -VPCONFLICTDZrmbk 4040 -VPCONFLICTDZrmbkz 4041 -VPCONFLICTDZrmk 4042 -VPCONFLICTDZrmkz 4043 -VPCONFLICTDZrr 4044 -VPCONFLICTDZrrk 4045 -VPCONFLICTDZrrkz 4046 -VPCONFLICTQZ 4047 -VPCONFLICTQZrm 4048 -VPCONFLICTQZrmb 4049 -VPCONFLICTQZrmbk 4050 -VPCONFLICTQZrmbkz 4051 -VPCONFLICTQZrmk 4052 -VPCONFLICTQZrmkz 4053 -VPCONFLICTQZrr 4054 -VPCONFLICTQZrrk 4055 -VPCONFLICTQZrrkz 4056 -VPDPBSSDSYrm 4057 -VPDPBSSDSYrr 4058 -VPDPBSSDSZ 4059 -VPDPBSSDSZrm 4060 -VPDPBSSDSZrmb 4061 -VPDPBSSDSZrmbk 4062 -VPDPBSSDSZrmbkz 4063 -VPDPBSSDSZrmk 4064 -VPDPBSSDSZrmkz 4065 -VPDPBSSDSZrr 4066 -VPDPBSSDSZrrk 4067 -VPDPBSSDSZrrkz 4068 -VPDPBSSDSrm 4069 -VPDPBSSDSrr 4070 -VPDPBSSDYrm 4071 -VPDPBSSDYrr 4072 -VPDPBSSDZ 4073 -VPDPBSSDZrm 4074 -VPDPBSSDZrmb 4075 -VPDPBSSDZrmbk 4076 -VPDPBSSDZrmbkz 4077 -VPDPBSSDZrmk 4078 -VPDPBSSDZrmkz 4079 -VPDPBSSDZrr 4080 -VPDPBSSDZrrk 4081 -VPDPBSSDZrrkz 4082 -VPDPBSSDrm 4083 -VPDPBSSDrr 4084 -VPDPBSUDSYrm 4085 -VPDPBSUDSYrr 4086 -VPDPBSUDSZ 4087 -VPDPBSUDSZrm 4088 -VPDPBSUDSZrmb 4089 -VPDPBSUDSZrmbk 4090 -VPDPBSUDSZrmbkz 4091 -VPDPBSUDSZrmk 4092 -VPDPBSUDSZrmkz 4093 -VPDPBSUDSZrr 4094 -VPDPBSUDSZrrk 4095 -VPDPBSUDSZrrkz 4096 -VPDPBSUDSrm 4097 -VPDPBSUDSrr 4098 -VPDPBSUDYrm 4099 -VPDPBSUDYrr 4100 -VPDPBSUDZ 4101 -VPDPBSUDZrm 4102 -VPDPBSUDZrmb 4103 -VPDPBSUDZrmbk 4104 -VPDPBSUDZrmbkz 4105 -VPDPBSUDZrmk 4106 -VPDPBSUDZrmkz 4107 -VPDPBSUDZrr 4108 -VPDPBSUDZrrk 4109 -VPDPBSUDZrrkz 4110 -VPDPBSUDrm 4111 -VPDPBSUDrr 4112 -VPDPBUSDSYrm 4113 -VPDPBUSDSYrr 4114 -VPDPBUSDSZ 4115 -VPDPBUSDSZrm 4116 -VPDPBUSDSZrmb 4117 -VPDPBUSDSZrmbk 4118 -VPDPBUSDSZrmbkz 4119 -VPDPBUSDSZrmk 4120 -VPDPBUSDSZrmkz 4121 -VPDPBUSDSZrr 4122 -VPDPBUSDSZrrk 4123 -VPDPBUSDSZrrkz 4124 -VPDPBUSDSrm 4125 -VPDPBUSDSrr 4126 -VPDPBUSDYrm 4127 -VPDPBUSDYrr 4128 -VPDPBUSDZ 4129 -VPDPBUSDZrm 4130 -VPDPBUSDZrmb 4131 -VPDPBUSDZrmbk 4132 -VPDPBUSDZrmbkz 4133 -VPDPBUSDZrmk 4134 -VPDPBUSDZrmkz 4135 -VPDPBUSDZrr 4136 -VPDPBUSDZrrk 4137 -VPDPBUSDZrrkz 4138 -VPDPBUSDrm 4139 -VPDPBUSDrr 4140 -VPDPBUUDSYrm 4141 -VPDPBUUDSYrr 4142 -VPDPBUUDSZ 4143 -VPDPBUUDSZrm 4144 -VPDPBUUDSZrmb 4145 -VPDPBUUDSZrmbk 4146 -VPDPBUUDSZrmbkz 4147 -VPDPBUUDSZrmk 4148 -VPDPBUUDSZrmkz 4149 -VPDPBUUDSZrr 4150 -VPDPBUUDSZrrk 4151 -VPDPBUUDSZrrkz 4152 -VPDPBUUDSrm 4153 -VPDPBUUDSrr 4154 -VPDPBUUDYrm 4155 -VPDPBUUDYrr 4156 -VPDPBUUDZ 4157 -VPDPBUUDZrm 4158 -VPDPBUUDZrmb 4159 -VPDPBUUDZrmbk 4160 -VPDPBUUDZrmbkz 4161 -VPDPBUUDZrmk 4162 -VPDPBUUDZrmkz 4163 -VPDPBUUDZrr 4164 -VPDPBUUDZrrk 4165 -VPDPBUUDZrrkz 4166 -VPDPBUUDrm 4167 -VPDPBUUDrr 4168 -VPDPWSSDSYrm 4169 -VPDPWSSDSYrr 4170 -VPDPWSSDSZ 4171 -VPDPWSSDSZrm 4172 -VPDPWSSDSZrmb 4173 -VPDPWSSDSZrmbk 4174 -VPDPWSSDSZrmbkz 4175 -VPDPWSSDSZrmk 4176 -VPDPWSSDSZrmkz 4177 -VPDPWSSDSZrr 4178 -VPDPWSSDSZrrk 4179 -VPDPWSSDSZrrkz 4180 -VPDPWSSDSrm 4181 -VPDPWSSDSrr 4182 -VPDPWSSDYrm 4183 -VPDPWSSDYrr 4184 -VPDPWSSDZ 4185 -VPDPWSSDZrm 4186 -VPDPWSSDZrmb 4187 -VPDPWSSDZrmbk 4188 -VPDPWSSDZrmbkz 4189 -VPDPWSSDZrmk 4190 -VPDPWSSDZrmkz 4191 -VPDPWSSDZrr 4192 -VPDPWSSDZrrk 4193 -VPDPWSSDZrrkz 4194 -VPDPWSSDrm 4195 -VPDPWSSDrr 4196 -VPDPWSUDSYrm 4197 -VPDPWSUDSYrr 4198 -VPDPWSUDSZ 4199 -VPDPWSUDSZrm 4200 -VPDPWSUDSZrmb 4201 -VPDPWSUDSZrmbk 4202 -VPDPWSUDSZrmbkz 4203 -VPDPWSUDSZrmk 4204 -VPDPWSUDSZrmkz 4205 -VPDPWSUDSZrr 4206 -VPDPWSUDSZrrk 4207 -VPDPWSUDSZrrkz 4208 -VPDPWSUDSrm 4209 -VPDPWSUDSrr 4210 -VPDPWSUDYrm 4211 -VPDPWSUDYrr 4212 -VPDPWSUDZ 4213 -VPDPWSUDZrm 4214 -VPDPWSUDZrmb 4215 -VPDPWSUDZrmbk 4216 -VPDPWSUDZrmbkz 4217 -VPDPWSUDZrmk 4218 -VPDPWSUDZrmkz 4219 -VPDPWSUDZrr 4220 -VPDPWSUDZrrk 4221 -VPDPWSUDZrrkz 4222 -VPDPWSUDrm 4223 -VPDPWSUDrr 4224 -VPDPWUSDSYrm 4225 -VPDPWUSDSYrr 4226 -VPDPWUSDSZ 4227 -VPDPWUSDSZrm 4228 -VPDPWUSDSZrmb 4229 -VPDPWUSDSZrmbk 4230 -VPDPWUSDSZrmbkz 4231 -VPDPWUSDSZrmk 4232 -VPDPWUSDSZrmkz 4233 -VPDPWUSDSZrr 4234 -VPDPWUSDSZrrk 4235 -VPDPWUSDSZrrkz 4236 -VPDPWUSDSrm 4237 -VPDPWUSDSrr 4238 -VPDPWUSDYrm 4239 -VPDPWUSDYrr 4240 -VPDPWUSDZ 4241 -VPDPWUSDZrm 4242 -VPDPWUSDZrmb 4243 -VPDPWUSDZrmbk 4244 -VPDPWUSDZrmbkz 4245 -VPDPWUSDZrmk 4246 -VPDPWUSDZrmkz 4247 -VPDPWUSDZrr 4248 -VPDPWUSDZrrk 4249 -VPDPWUSDZrrkz 4250 -VPDPWUSDrm 4251 -VPDPWUSDrr 4252 -VPDPWUUDSYrm 4253 -VPDPWUUDSYrr 4254 -VPDPWUUDSZ 4255 -VPDPWUUDSZrm 4256 -VPDPWUUDSZrmb 4257 -VPDPWUUDSZrmbk 4258 -VPDPWUUDSZrmbkz 4259 -VPDPWUUDSZrmk 4260 -VPDPWUUDSZrmkz 4261 -VPDPWUUDSZrr 4262 -VPDPWUUDSZrrk 4263 -VPDPWUUDSZrrkz 4264 -VPDPWUUDSrm 4265 -VPDPWUUDSrr 4266 -VPDPWUUDYrm 4267 -VPDPWUUDYrr 4268 -VPDPWUUDZ 4269 -VPDPWUUDZrm 4270 -VPDPWUUDZrmb 4271 -VPDPWUUDZrmbk 4272 -VPDPWUUDZrmbkz 4273 -VPDPWUUDZrmk 4274 -VPDPWUUDZrmkz 4275 -VPDPWUUDZrr 4276 -VPDPWUUDZrrk 4277 -VPDPWUUDZrrkz 4278 -VPDPWUUDrm 4279 -VPDPWUUDrr 4280 -VPERM 4281 -VPERMBZ 4282 -VPERMBZrm 4283 -VPERMBZrmk 4284 -VPERMBZrmkz 4285 -VPERMBZrr 4286 -VPERMBZrrk 4287 -VPERMBZrrkz 4288 -VPERMDYrm 4289 -VPERMDYrr 4290 -VPERMDZ 4291 -VPERMDZrm 4292 -VPERMDZrmb 4293 -VPERMDZrmbk 4294 -VPERMDZrmbkz 4295 -VPERMDZrmk 4296 -VPERMDZrmkz 4297 -VPERMDZrr 4298 -VPERMDZrrk 4299 -VPERMDZrrkz 4300 -VPERMI 4301 -VPERMIL 4302 -VPERMILPDYmi 4303 -VPERMILPDYri 4304 -VPERMILPDYrm 4305 -VPERMILPDYrr 4306 -VPERMILPDZ 4307 -VPERMILPDZmbi 4308 -VPERMILPDZmbik 4309 -VPERMILPDZmbikz 4310 -VPERMILPDZmi 4311 -VPERMILPDZmik 4312 -VPERMILPDZmikz 4313 -VPERMILPDZri 4314 -VPERMILPDZrik 4315 -VPERMILPDZrikz 4316 -VPERMILPDZrm 4317 -VPERMILPDZrmb 4318 -VPERMILPDZrmbk 4319 -VPERMILPDZrmbkz 4320 -VPERMILPDZrmk 4321 -VPERMILPDZrmkz 4322 -VPERMILPDZrr 4323 -VPERMILPDZrrk 4324 -VPERMILPDZrrkz 4325 -VPERMILPDmi 4326 -VPERMILPDri 4327 -VPERMILPDrm 4328 -VPERMILPDrr 4329 -VPERMILPSYmi 4330 -VPERMILPSYri 4331 -VPERMILPSYrm 4332 -VPERMILPSYrr 4333 -VPERMILPSZ 4334 -VPERMILPSZmbi 4335 -VPERMILPSZmbik 4336 -VPERMILPSZmbikz 4337 -VPERMILPSZmi 4338 -VPERMILPSZmik 4339 -VPERMILPSZmikz 4340 -VPERMILPSZri 4341 -VPERMILPSZrik 4342 -VPERMILPSZrikz 4343 -VPERMILPSZrm 4344 -VPERMILPSZrmb 4345 -VPERMILPSZrmbk 4346 -VPERMILPSZrmbkz 4347 -VPERMILPSZrmk 4348 -VPERMILPSZrmkz 4349 -VPERMILPSZrr 4350 -VPERMILPSZrrk 4351 -VPERMILPSZrrkz 4352 -VPERMILPSmi 4353 -VPERMILPSri 4354 -VPERMILPSrm 4355 -VPERMILPSrr 4356 -VPERMPDYmi 4357 -VPERMPDYri 4358 -VPERMPDZ 4359 -VPERMPDZmbi 4360 -VPERMPDZmbik 4361 -VPERMPDZmbikz 4362 -VPERMPDZmi 4363 -VPERMPDZmik 4364 -VPERMPDZmikz 4365 -VPERMPDZri 4366 -VPERMPDZrik 4367 -VPERMPDZrikz 4368 -VPERMPDZrm 4369 -VPERMPDZrmb 4370 -VPERMPDZrmbk 4371 -VPERMPDZrmbkz 4372 -VPERMPDZrmk 4373 -VPERMPDZrmkz 4374 -VPERMPDZrr 4375 -VPERMPDZrrk 4376 -VPERMPDZrrkz 4377 -VPERMPSYrm 4378 -VPERMPSYrr 4379 -VPERMPSZ 4380 -VPERMPSZrm 4381 -VPERMPSZrmb 4382 -VPERMPSZrmbk 4383 -VPERMPSZrmbkz 4384 -VPERMPSZrmk 4385 -VPERMPSZrmkz 4386 -VPERMPSZrr 4387 -VPERMPSZrrk 4388 -VPERMPSZrrkz 4389 -VPERMQYmi 4390 -VPERMQYri 4391 -VPERMQZ 4392 -VPERMQZmbi 4393 -VPERMQZmbik 4394 -VPERMQZmbikz 4395 -VPERMQZmi 4396 -VPERMQZmik 4397 -VPERMQZmikz 4398 -VPERMQZri 4399 -VPERMQZrik 4400 -VPERMQZrikz 4401 -VPERMQZrm 4402 -VPERMQZrmb 4403 -VPERMQZrmbk 4404 -VPERMQZrmbkz 4405 -VPERMQZrmk 4406 -VPERMQZrmkz 4407 -VPERMQZrr 4408 -VPERMQZrrk 4409 -VPERMQZrrkz 4410 -VPERMT 4411 -VPERMWZ 4412 -VPERMWZrm 4413 -VPERMWZrmk 4414 -VPERMWZrmkz 4415 -VPERMWZrr 4416 -VPERMWZrrk 4417 -VPERMWZrrkz 4418 -VPEXPANDBZ 4419 -VPEXPANDBZrm 4420 -VPEXPANDBZrmk 4421 -VPEXPANDBZrmkz 4422 -VPEXPANDBZrr 4423 -VPEXPANDBZrrk 4424 -VPEXPANDBZrrkz 4425 -VPEXPANDDZ 4426 -VPEXPANDDZrm 4427 -VPEXPANDDZrmk 4428 -VPEXPANDDZrmkz 4429 -VPEXPANDDZrr 4430 -VPEXPANDDZrrk 4431 -VPEXPANDDZrrkz 4432 -VPEXPANDQZ 4433 -VPEXPANDQZrm 4434 -VPEXPANDQZrmk 4435 -VPEXPANDQZrmkz 4436 -VPEXPANDQZrr 4437 -VPEXPANDQZrrk 4438 -VPEXPANDQZrrkz 4439 -VPEXPANDWZ 4440 -VPEXPANDWZrm 4441 -VPEXPANDWZrmk 4442 -VPEXPANDWZrmkz 4443 -VPEXPANDWZrr 4444 -VPEXPANDWZrrk 4445 -VPEXPANDWZrrkz 4446 -VPEXTRBZmri 4447 -VPEXTRBZrri 4448 -VPEXTRBmri 4449 -VPEXTRBrri 4450 -VPEXTRDZmri 4451 -VPEXTRDZrri 4452 -VPEXTRDmri 4453 -VPEXTRDrri 4454 -VPEXTRQZmri 4455 -VPEXTRQZrri 4456 -VPEXTRQmri 4457 -VPEXTRQrri 4458 -VPEXTRWZmri 4459 -VPEXTRWZrri 4460 -VPEXTRWZrri_REV 4461 -VPEXTRWmri 4462 -VPEXTRWrri 4463 -VPEXTRWrri_REV 4464 -VPGATHERDDYrm 4465 -VPGATHERDDZ 4466 -VPGATHERDDZrm 4467 -VPGATHERDDrm 4468 -VPGATHERDQYrm 4469 -VPGATHERDQZ 4470 -VPGATHERDQZrm 4471 -VPGATHERDQrm 4472 -VPGATHERQDYrm 4473 -VPGATHERQDZ 4474 -VPGATHERQDZrm 4475 -VPGATHERQDrm 4476 -VPGATHERQQYrm 4477 -VPGATHERQQZ 4478 -VPGATHERQQZrm 4479 -VPGATHERQQrm 4480 -VPHADDBDrm 4481 -VPHADDBDrr 4482 -VPHADDBQrm 4483 -VPHADDBQrr 4484 -VPHADDBWrm 4485 -VPHADDBWrr 4486 -VPHADDDQrm 4487 -VPHADDDQrr 4488 -VPHADDDYrm 4489 -VPHADDDYrr 4490 -VPHADDDrm 4491 -VPHADDDrr 4492 -VPHADDSWYrm 4493 -VPHADDSWYrr 4494 -VPHADDSWrm 4495 -VPHADDSWrr 4496 -VPHADDUBDrm 4497 -VPHADDUBDrr 4498 -VPHADDUBQrm 4499 -VPHADDUBQrr 4500 -VPHADDUBWrm 4501 -VPHADDUBWrr 4502 -VPHADDUDQrm 4503 -VPHADDUDQrr 4504 -VPHADDUWDrm 4505 -VPHADDUWDrr 4506 -VPHADDUWQrm 4507 -VPHADDUWQrr 4508 -VPHADDWDrm 4509 -VPHADDWDrr 4510 -VPHADDWQrm 4511 -VPHADDWQrr 4512 -VPHADDWYrm 4513 -VPHADDWYrr 4514 -VPHADDWrm 4515 -VPHADDWrr 4516 -VPHMINPOSUWrm 4517 -VPHMINPOSUWrr 4518 -VPHSUBBWrm 4519 -VPHSUBBWrr 4520 -VPHSUBDQrm 4521 -VPHSUBDQrr 4522 -VPHSUBDYrm 4523 -VPHSUBDYrr 4524 -VPHSUBDrm 4525 -VPHSUBDrr 4526 -VPHSUBSWYrm 4527 -VPHSUBSWYrr 4528 -VPHSUBSWrm 4529 -VPHSUBSWrr 4530 -VPHSUBWDrm 4531 -VPHSUBWDrr 4532 -VPHSUBWYrm 4533 -VPHSUBWYrr 4534 -VPHSUBWrm 4535 -VPHSUBWrr 4536 -VPINSRBZrmi 4537 -VPINSRBZrri 4538 -VPINSRBrmi 4539 -VPINSRBrri 4540 -VPINSRDZrmi 4541 -VPINSRDZrri 4542 -VPINSRDrmi 4543 -VPINSRDrri 4544 -VPINSRQZrmi 4545 -VPINSRQZrri 4546 -VPINSRQrmi 4547 -VPINSRQrri 4548 -VPINSRWZrmi 4549 -VPINSRWZrri 4550 -VPINSRWrmi 4551 -VPINSRWrri 4552 -VPLZCNTDZ 4553 -VPLZCNTDZrm 4554 -VPLZCNTDZrmb 4555 -VPLZCNTDZrmbk 4556 -VPLZCNTDZrmbkz 4557 -VPLZCNTDZrmk 4558 -VPLZCNTDZrmkz 4559 -VPLZCNTDZrr 4560 -VPLZCNTDZrrk 4561 -VPLZCNTDZrrkz 4562 -VPLZCNTQZ 4563 -VPLZCNTQZrm 4564 -VPLZCNTQZrmb 4565 -VPLZCNTQZrmbk 4566 -VPLZCNTQZrmbkz 4567 -VPLZCNTQZrmk 4568 -VPLZCNTQZrmkz 4569 -VPLZCNTQZrr 4570 -VPLZCNTQZrrk 4571 -VPLZCNTQZrrkz 4572 -VPMACSDDrm 4573 -VPMACSDDrr 4574 -VPMACSDQHrm 4575 -VPMACSDQHrr 4576 -VPMACSDQLrm 4577 -VPMACSDQLrr 4578 -VPMACSSDDrm 4579 -VPMACSSDDrr 4580 -VPMACSSDQHrm 4581 -VPMACSSDQHrr 4582 -VPMACSSDQLrm 4583 -VPMACSSDQLrr 4584 -VPMACSSWDrm 4585 -VPMACSSWDrr 4586 -VPMACSSWWrm 4587 -VPMACSSWWrr 4588 -VPMACSWDrm 4589 -VPMACSWDrr 4590 -VPMACSWWrm 4591 -VPMACSWWrr 4592 -VPMADCSSWDrm 4593 -VPMADCSSWDrr 4594 -VPMADCSWDrm 4595 -VPMADCSWDrr 4596 -VPMADD 4597 -VPMADDUBSWYrm 4598 -VPMADDUBSWYrr 4599 -VPMADDUBSWZ 4600 -VPMADDUBSWZrm 4601 -VPMADDUBSWZrmk 4602 -VPMADDUBSWZrmkz 4603 -VPMADDUBSWZrr 4604 -VPMADDUBSWZrrk 4605 -VPMADDUBSWZrrkz 4606 -VPMADDUBSWrm 4607 -VPMADDUBSWrr 4608 -VPMADDWDYrm 4609 -VPMADDWDYrr 4610 -VPMADDWDZ 4611 -VPMADDWDZrm 4612 -VPMADDWDZrmk 4613 -VPMADDWDZrmkz 4614 -VPMADDWDZrr 4615 -VPMADDWDZrrk 4616 -VPMADDWDZrrkz 4617 -VPMADDWDrm 4618 -VPMADDWDrr 4619 -VPMASKMOVDYmr 4620 -VPMASKMOVDYrm 4621 -VPMASKMOVDmr 4622 -VPMASKMOVDrm 4623 -VPMASKMOVQYmr 4624 -VPMASKMOVQYrm 4625 -VPMASKMOVQmr 4626 -VPMASKMOVQrm 4627 -VPMAXSBYrm 4628 -VPMAXSBYrr 4629 -VPMAXSBZ 4630 -VPMAXSBZrm 4631 -VPMAXSBZrmk 4632 -VPMAXSBZrmkz 4633 -VPMAXSBZrr 4634 -VPMAXSBZrrk 4635 -VPMAXSBZrrkz 4636 -VPMAXSBrm 4637 -VPMAXSBrr 4638 -VPMAXSDYrm 4639 -VPMAXSDYrr 4640 -VPMAXSDZ 4641 -VPMAXSDZrm 4642 -VPMAXSDZrmb 4643 -VPMAXSDZrmbk 4644 -VPMAXSDZrmbkz 4645 -VPMAXSDZrmk 4646 -VPMAXSDZrmkz 4647 -VPMAXSDZrr 4648 -VPMAXSDZrrk 4649 -VPMAXSDZrrkz 4650 -VPMAXSDrm 4651 -VPMAXSDrr 4652 -VPMAXSQZ 4653 -VPMAXSQZrm 4654 -VPMAXSQZrmb 4655 -VPMAXSQZrmbk 4656 -VPMAXSQZrmbkz 4657 -VPMAXSQZrmk 4658 -VPMAXSQZrmkz 4659 -VPMAXSQZrr 4660 -VPMAXSQZrrk 4661 -VPMAXSQZrrkz 4662 -VPMAXSWYrm 4663 -VPMAXSWYrr 4664 -VPMAXSWZ 4665 -VPMAXSWZrm 4666 -VPMAXSWZrmk 4667 -VPMAXSWZrmkz 4668 -VPMAXSWZrr 4669 -VPMAXSWZrrk 4670 -VPMAXSWZrrkz 4671 -VPMAXSWrm 4672 -VPMAXSWrr 4673 -VPMAXUBYrm 4674 -VPMAXUBYrr 4675 -VPMAXUBZ 4676 -VPMAXUBZrm 4677 -VPMAXUBZrmk 4678 -VPMAXUBZrmkz 4679 -VPMAXUBZrr 4680 -VPMAXUBZrrk 4681 -VPMAXUBZrrkz 4682 -VPMAXUBrm 4683 -VPMAXUBrr 4684 -VPMAXUDYrm 4685 -VPMAXUDYrr 4686 -VPMAXUDZ 4687 -VPMAXUDZrm 4688 -VPMAXUDZrmb 4689 -VPMAXUDZrmbk 4690 -VPMAXUDZrmbkz 4691 -VPMAXUDZrmk 4692 -VPMAXUDZrmkz 4693 -VPMAXUDZrr 4694 -VPMAXUDZrrk 4695 -VPMAXUDZrrkz 4696 -VPMAXUDrm 4697 -VPMAXUDrr 4698 -VPMAXUQZ 4699 -VPMAXUQZrm 4700 -VPMAXUQZrmb 4701 -VPMAXUQZrmbk 4702 -VPMAXUQZrmbkz 4703 -VPMAXUQZrmk 4704 -VPMAXUQZrmkz 4705 -VPMAXUQZrr 4706 -VPMAXUQZrrk 4707 -VPMAXUQZrrkz 4708 -VPMAXUWYrm 4709 -VPMAXUWYrr 4710 -VPMAXUWZ 4711 -VPMAXUWZrm 4712 -VPMAXUWZrmk 4713 -VPMAXUWZrmkz 4714 -VPMAXUWZrr 4715 -VPMAXUWZrrk 4716 -VPMAXUWZrrkz 4717 -VPMAXUWrm 4718 -VPMAXUWrr 4719 -VPMINSBYrm 4720 -VPMINSBYrr 4721 -VPMINSBZ 4722 -VPMINSBZrm 4723 -VPMINSBZrmk 4724 -VPMINSBZrmkz 4725 -VPMINSBZrr 4726 -VPMINSBZrrk 4727 -VPMINSBZrrkz 4728 -VPMINSBrm 4729 -VPMINSBrr 4730 -VPMINSDYrm 4731 -VPMINSDYrr 4732 -VPMINSDZ 4733 -VPMINSDZrm 4734 -VPMINSDZrmb 4735 -VPMINSDZrmbk 4736 -VPMINSDZrmbkz 4737 -VPMINSDZrmk 4738 -VPMINSDZrmkz 4739 -VPMINSDZrr 4740 -VPMINSDZrrk 4741 -VPMINSDZrrkz 4742 -VPMINSDrm 4743 -VPMINSDrr 4744 -VPMINSQZ 4745 -VPMINSQZrm 4746 -VPMINSQZrmb 4747 -VPMINSQZrmbk 4748 -VPMINSQZrmbkz 4749 -VPMINSQZrmk 4750 -VPMINSQZrmkz 4751 -VPMINSQZrr 4752 -VPMINSQZrrk 4753 -VPMINSQZrrkz 4754 -VPMINSWYrm 4755 -VPMINSWYrr 4756 -VPMINSWZ 4757 -VPMINSWZrm 4758 -VPMINSWZrmk 4759 -VPMINSWZrmkz 4760 -VPMINSWZrr 4761 -VPMINSWZrrk 4762 -VPMINSWZrrkz 4763 -VPMINSWrm 4764 -VPMINSWrr 4765 -VPMINUBYrm 4766 -VPMINUBYrr 4767 -VPMINUBZ 4768 -VPMINUBZrm 4769 -VPMINUBZrmk 4770 -VPMINUBZrmkz 4771 -VPMINUBZrr 4772 -VPMINUBZrrk 4773 -VPMINUBZrrkz 4774 -VPMINUBrm 4775 -VPMINUBrr 4776 -VPMINUDYrm 4777 -VPMINUDYrr 4778 -VPMINUDZ 4779 -VPMINUDZrm 4780 -VPMINUDZrmb 4781 -VPMINUDZrmbk 4782 -VPMINUDZrmbkz 4783 -VPMINUDZrmk 4784 -VPMINUDZrmkz 4785 -VPMINUDZrr 4786 -VPMINUDZrrk 4787 -VPMINUDZrrkz 4788 -VPMINUDrm 4789 -VPMINUDrr 4790 -VPMINUQZ 4791 -VPMINUQZrm 4792 -VPMINUQZrmb 4793 -VPMINUQZrmbk 4794 -VPMINUQZrmbkz 4795 -VPMINUQZrmk 4796 -VPMINUQZrmkz 4797 -VPMINUQZrr 4798 -VPMINUQZrrk 4799 -VPMINUQZrrkz 4800 -VPMINUWYrm 4801 -VPMINUWYrr 4802 -VPMINUWZ 4803 -VPMINUWZrm 4804 -VPMINUWZrmk 4805 -VPMINUWZrmkz 4806 -VPMINUWZrr 4807 -VPMINUWZrrk 4808 -VPMINUWZrrkz 4809 -VPMINUWrm 4810 -VPMINUWrr 4811 -VPMOVB 4812 -VPMOVD 4813 -VPMOVDBZ 4814 -VPMOVDBZmr 4815 -VPMOVDBZmrk 4816 -VPMOVDBZrr 4817 -VPMOVDBZrrk 4818 -VPMOVDBZrrkz 4819 -VPMOVDWZ 4820 -VPMOVDWZmr 4821 -VPMOVDWZmrk 4822 -VPMOVDWZrr 4823 -VPMOVDWZrrk 4824 -VPMOVDWZrrkz 4825 -VPMOVM 4826 -VPMOVMSKBYrr 4827 -VPMOVMSKBrr 4828 -VPMOVQ 4829 -VPMOVQBZ 4830 -VPMOVQBZmr 4831 -VPMOVQBZmrk 4832 -VPMOVQBZrr 4833 -VPMOVQBZrrk 4834 -VPMOVQBZrrkz 4835 -VPMOVQDZ 4836 -VPMOVQDZmr 4837 -VPMOVQDZmrk 4838 -VPMOVQDZrr 4839 -VPMOVQDZrrk 4840 -VPMOVQDZrrkz 4841 -VPMOVQWZ 4842 -VPMOVQWZmr 4843 -VPMOVQWZmrk 4844 -VPMOVQWZrr 4845 -VPMOVQWZrrk 4846 -VPMOVQWZrrkz 4847 -VPMOVSDBZ 4848 -VPMOVSDBZmr 4849 -VPMOVSDBZmrk 4850 -VPMOVSDBZrr 4851 -VPMOVSDBZrrk 4852 -VPMOVSDBZrrkz 4853 -VPMOVSDWZ 4854 -VPMOVSDWZmr 4855 -VPMOVSDWZmrk 4856 -VPMOVSDWZrr 4857 -VPMOVSDWZrrk 4858 -VPMOVSDWZrrkz 4859 -VPMOVSQBZ 4860 -VPMOVSQBZmr 4861 -VPMOVSQBZmrk 4862 -VPMOVSQBZrr 4863 -VPMOVSQBZrrk 4864 -VPMOVSQBZrrkz 4865 -VPMOVSQDZ 4866 -VPMOVSQDZmr 4867 -VPMOVSQDZmrk 4868 -VPMOVSQDZrr 4869 -VPMOVSQDZrrk 4870 -VPMOVSQDZrrkz 4871 -VPMOVSQWZ 4872 -VPMOVSQWZmr 4873 -VPMOVSQWZmrk 4874 -VPMOVSQWZrr 4875 -VPMOVSQWZrrk 4876 -VPMOVSQWZrrkz 4877 -VPMOVSWBZ 4878 -VPMOVSWBZmr 4879 -VPMOVSWBZmrk 4880 -VPMOVSWBZrr 4881 -VPMOVSWBZrrk 4882 -VPMOVSWBZrrkz 4883 -VPMOVSXBDYrm 4884 -VPMOVSXBDYrr 4885 -VPMOVSXBDZ 4886 -VPMOVSXBDZrm 4887 -VPMOVSXBDZrmk 4888 -VPMOVSXBDZrmkz 4889 -VPMOVSXBDZrr 4890 -VPMOVSXBDZrrk 4891 -VPMOVSXBDZrrkz 4892 -VPMOVSXBDrm 4893 -VPMOVSXBDrr 4894 -VPMOVSXBQYrm 4895 -VPMOVSXBQYrr 4896 -VPMOVSXBQZ 4897 -VPMOVSXBQZrm 4898 -VPMOVSXBQZrmk 4899 -VPMOVSXBQZrmkz 4900 -VPMOVSXBQZrr 4901 -VPMOVSXBQZrrk 4902 -VPMOVSXBQZrrkz 4903 -VPMOVSXBQrm 4904 -VPMOVSXBQrr 4905 -VPMOVSXBWYrm 4906 -VPMOVSXBWYrr 4907 -VPMOVSXBWZ 4908 -VPMOVSXBWZrm 4909 -VPMOVSXBWZrmk 4910 -VPMOVSXBWZrmkz 4911 -VPMOVSXBWZrr 4912 -VPMOVSXBWZrrk 4913 -VPMOVSXBWZrrkz 4914 -VPMOVSXBWrm 4915 -VPMOVSXBWrr 4916 -VPMOVSXDQYrm 4917 -VPMOVSXDQYrr 4918 -VPMOVSXDQZ 4919 -VPMOVSXDQZrm 4920 -VPMOVSXDQZrmk 4921 -VPMOVSXDQZrmkz 4922 -VPMOVSXDQZrr 4923 -VPMOVSXDQZrrk 4924 -VPMOVSXDQZrrkz 4925 -VPMOVSXDQrm 4926 -VPMOVSXDQrr 4927 -VPMOVSXWDYrm 4928 -VPMOVSXWDYrr 4929 -VPMOVSXWDZ 4930 -VPMOVSXWDZrm 4931 -VPMOVSXWDZrmk 4932 -VPMOVSXWDZrmkz 4933 -VPMOVSXWDZrr 4934 -VPMOVSXWDZrrk 4935 -VPMOVSXWDZrrkz 4936 -VPMOVSXWDrm 4937 -VPMOVSXWDrr 4938 -VPMOVSXWQYrm 4939 -VPMOVSXWQYrr 4940 -VPMOVSXWQZ 4941 -VPMOVSXWQZrm 4942 -VPMOVSXWQZrmk 4943 -VPMOVSXWQZrmkz 4944 -VPMOVSXWQZrr 4945 -VPMOVSXWQZrrk 4946 -VPMOVSXWQZrrkz 4947 -VPMOVSXWQrm 4948 -VPMOVSXWQrr 4949 -VPMOVUSDBZ 4950 -VPMOVUSDBZmr 4951 -VPMOVUSDBZmrk 4952 -VPMOVUSDBZrr 4953 -VPMOVUSDBZrrk 4954 -VPMOVUSDBZrrkz 4955 -VPMOVUSDWZ 4956 -VPMOVUSDWZmr 4957 -VPMOVUSDWZmrk 4958 -VPMOVUSDWZrr 4959 -VPMOVUSDWZrrk 4960 -VPMOVUSDWZrrkz 4961 -VPMOVUSQBZ 4962 -VPMOVUSQBZmr 4963 -VPMOVUSQBZmrk 4964 -VPMOVUSQBZrr 4965 -VPMOVUSQBZrrk 4966 -VPMOVUSQBZrrkz 4967 -VPMOVUSQDZ 4968 -VPMOVUSQDZmr 4969 -VPMOVUSQDZmrk 4970 -VPMOVUSQDZrr 4971 -VPMOVUSQDZrrk 4972 -VPMOVUSQDZrrkz 4973 -VPMOVUSQWZ 4974 -VPMOVUSQWZmr 4975 -VPMOVUSQWZmrk 4976 -VPMOVUSQWZrr 4977 -VPMOVUSQWZrrk 4978 -VPMOVUSQWZrrkz 4979 -VPMOVUSWBZ 4980 -VPMOVUSWBZmr 4981 -VPMOVUSWBZmrk 4982 -VPMOVUSWBZrr 4983 -VPMOVUSWBZrrk 4984 -VPMOVUSWBZrrkz 4985 -VPMOVW 4986 -VPMOVWBZ 4987 -VPMOVWBZmr 4988 -VPMOVWBZmrk 4989 -VPMOVWBZrr 4990 -VPMOVWBZrrk 4991 -VPMOVWBZrrkz 4992 -VPMOVZXBDYrm 4993 -VPMOVZXBDYrr 4994 -VPMOVZXBDZ 4995 -VPMOVZXBDZrm 4996 -VPMOVZXBDZrmk 4997 -VPMOVZXBDZrmkz 4998 -VPMOVZXBDZrr 4999 -VPMOVZXBDZrrk 5000 -VPMOVZXBDZrrkz 5001 -VPMOVZXBDrm 5002 -VPMOVZXBDrr 5003 -VPMOVZXBQYrm 5004 -VPMOVZXBQYrr 5005 -VPMOVZXBQZ 5006 -VPMOVZXBQZrm 5007 -VPMOVZXBQZrmk 5008 -VPMOVZXBQZrmkz 5009 -VPMOVZXBQZrr 5010 -VPMOVZXBQZrrk 5011 -VPMOVZXBQZrrkz 5012 -VPMOVZXBQrm 5013 -VPMOVZXBQrr 5014 -VPMOVZXBWYrm 5015 -VPMOVZXBWYrr 5016 -VPMOVZXBWZ 5017 -VPMOVZXBWZrm 5018 -VPMOVZXBWZrmk 5019 -VPMOVZXBWZrmkz 5020 -VPMOVZXBWZrr 5021 -VPMOVZXBWZrrk 5022 -VPMOVZXBWZrrkz 5023 -VPMOVZXBWrm 5024 -VPMOVZXBWrr 5025 -VPMOVZXDQYrm 5026 -VPMOVZXDQYrr 5027 -VPMOVZXDQZ 5028 -VPMOVZXDQZrm 5029 -VPMOVZXDQZrmk 5030 -VPMOVZXDQZrmkz 5031 -VPMOVZXDQZrr 5032 -VPMOVZXDQZrrk 5033 -VPMOVZXDQZrrkz 5034 -VPMOVZXDQrm 5035 -VPMOVZXDQrr 5036 -VPMOVZXWDYrm 5037 -VPMOVZXWDYrr 5038 -VPMOVZXWDZ 5039 -VPMOVZXWDZrm 5040 -VPMOVZXWDZrmk 5041 -VPMOVZXWDZrmkz 5042 -VPMOVZXWDZrr 5043 -VPMOVZXWDZrrk 5044 -VPMOVZXWDZrrkz 5045 -VPMOVZXWDrm 5046 -VPMOVZXWDrr 5047 -VPMOVZXWQYrm 5048 -VPMOVZXWQYrr 5049 -VPMOVZXWQZ 5050 -VPMOVZXWQZrm 5051 -VPMOVZXWQZrmk 5052 -VPMOVZXWQZrmkz 5053 -VPMOVZXWQZrr 5054 -VPMOVZXWQZrrk 5055 -VPMOVZXWQZrrkz 5056 -VPMOVZXWQrm 5057 -VPMOVZXWQrr 5058 -VPMULDQYrm 5059 -VPMULDQYrr 5060 -VPMULDQZ 5061 -VPMULDQZrm 5062 -VPMULDQZrmb 5063 -VPMULDQZrmbk 5064 -VPMULDQZrmbkz 5065 -VPMULDQZrmk 5066 -VPMULDQZrmkz 5067 -VPMULDQZrr 5068 -VPMULDQZrrk 5069 -VPMULDQZrrkz 5070 -VPMULDQrm 5071 -VPMULDQrr 5072 -VPMULHRSWYrm 5073 -VPMULHRSWYrr 5074 -VPMULHRSWZ 5075 -VPMULHRSWZrm 5076 -VPMULHRSWZrmk 5077 -VPMULHRSWZrmkz 5078 -VPMULHRSWZrr 5079 -VPMULHRSWZrrk 5080 -VPMULHRSWZrrkz 5081 -VPMULHRSWrm 5082 -VPMULHRSWrr 5083 -VPMULHUWYrm 5084 -VPMULHUWYrr 5085 -VPMULHUWZ 5086 -VPMULHUWZrm 5087 -VPMULHUWZrmk 5088 -VPMULHUWZrmkz 5089 -VPMULHUWZrr 5090 -VPMULHUWZrrk 5091 -VPMULHUWZrrkz 5092 -VPMULHUWrm 5093 -VPMULHUWrr 5094 -VPMULHWYrm 5095 -VPMULHWYrr 5096 -VPMULHWZ 5097 -VPMULHWZrm 5098 -VPMULHWZrmk 5099 -VPMULHWZrmkz 5100 -VPMULHWZrr 5101 -VPMULHWZrrk 5102 -VPMULHWZrrkz 5103 -VPMULHWrm 5104 -VPMULHWrr 5105 -VPMULLDYrm 5106 -VPMULLDYrr 5107 -VPMULLDZ 5108 -VPMULLDZrm 5109 -VPMULLDZrmb 5110 -VPMULLDZrmbk 5111 -VPMULLDZrmbkz 5112 -VPMULLDZrmk 5113 -VPMULLDZrmkz 5114 -VPMULLDZrr 5115 -VPMULLDZrrk 5116 -VPMULLDZrrkz 5117 -VPMULLDrm 5118 -VPMULLDrr 5119 -VPMULLQZ 5120 -VPMULLQZrm 5121 -VPMULLQZrmb 5122 -VPMULLQZrmbk 5123 -VPMULLQZrmbkz 5124 -VPMULLQZrmk 5125 -VPMULLQZrmkz 5126 -VPMULLQZrr 5127 -VPMULLQZrrk 5128 -VPMULLQZrrkz 5129 -VPMULLWYrm 5130 -VPMULLWYrr 5131 -VPMULLWZ 5132 -VPMULLWZrm 5133 -VPMULLWZrmk 5134 -VPMULLWZrmkz 5135 -VPMULLWZrr 5136 -VPMULLWZrrk 5137 -VPMULLWZrrkz 5138 -VPMULLWrm 5139 -VPMULLWrr 5140 -VPMULTISHIFTQBZ 5141 -VPMULTISHIFTQBZrm 5142 -VPMULTISHIFTQBZrmb 5143 -VPMULTISHIFTQBZrmbk 5144 -VPMULTISHIFTQBZrmbkz 5145 -VPMULTISHIFTQBZrmk 5146 -VPMULTISHIFTQBZrmkz 5147 -VPMULTISHIFTQBZrr 5148 -VPMULTISHIFTQBZrrk 5149 -VPMULTISHIFTQBZrrkz 5150 -VPMULUDQYrm 5151 -VPMULUDQYrr 5152 -VPMULUDQZ 5153 -VPMULUDQZrm 5154 -VPMULUDQZrmb 5155 -VPMULUDQZrmbk 5156 -VPMULUDQZrmbkz 5157 -VPMULUDQZrmk 5158 -VPMULUDQZrmkz 5159 -VPMULUDQZrr 5160 -VPMULUDQZrrk 5161 -VPMULUDQZrrkz 5162 -VPMULUDQrm 5163 -VPMULUDQrr 5164 -VPOPCNTBZ 5165 -VPOPCNTBZrm 5166 -VPOPCNTBZrmk 5167 -VPOPCNTBZrmkz 5168 -VPOPCNTBZrr 5169 -VPOPCNTBZrrk 5170 -VPOPCNTBZrrkz 5171 -VPOPCNTDZ 5172 -VPOPCNTDZrm 5173 -VPOPCNTDZrmb 5174 -VPOPCNTDZrmbk 5175 -VPOPCNTDZrmbkz 5176 -VPOPCNTDZrmk 5177 -VPOPCNTDZrmkz 5178 -VPOPCNTDZrr 5179 -VPOPCNTDZrrk 5180 -VPOPCNTDZrrkz 5181 -VPOPCNTQZ 5182 -VPOPCNTQZrm 5183 -VPOPCNTQZrmb 5184 -VPOPCNTQZrmbk 5185 -VPOPCNTQZrmbkz 5186 -VPOPCNTQZrmk 5187 -VPOPCNTQZrmkz 5188 -VPOPCNTQZrr 5189 -VPOPCNTQZrrk 5190 -VPOPCNTQZrrkz 5191 -VPOPCNTWZ 5192 -VPOPCNTWZrm 5193 -VPOPCNTWZrmk 5194 -VPOPCNTWZrmkz 5195 -VPOPCNTWZrr 5196 -VPOPCNTWZrrk 5197 -VPOPCNTWZrrkz 5198 -VPORDZ 5199 -VPORDZrm 5200 -VPORDZrmb 5201 -VPORDZrmbk 5202 -VPORDZrmbkz 5203 -VPORDZrmk 5204 -VPORDZrmkz 5205 -VPORDZrr 5206 -VPORDZrrk 5207 -VPORDZrrkz 5208 -VPORQZ 5209 -VPORQZrm 5210 -VPORQZrmb 5211 -VPORQZrmbk 5212 -VPORQZrmbkz 5213 -VPORQZrmk 5214 -VPORQZrmkz 5215 -VPORQZrr 5216 -VPORQZrrk 5217 -VPORQZrrkz 5218 -VPORYrm 5219 -VPORYrr 5220 -VPORrm 5221 -VPORrr 5222 -VPPERMrmr 5223 -VPPERMrrm 5224 -VPPERMrrr 5225 -VPPERMrrr_REV 5226 -VPROLDZ 5227 -VPROLDZmbi 5228 -VPROLDZmbik 5229 -VPROLDZmbikz 5230 -VPROLDZmi 5231 -VPROLDZmik 5232 -VPROLDZmikz 5233 -VPROLDZri 5234 -VPROLDZrik 5235 -VPROLDZrikz 5236 -VPROLQZ 5237 -VPROLQZmbi 5238 -VPROLQZmbik 5239 -VPROLQZmbikz 5240 -VPROLQZmi 5241 -VPROLQZmik 5242 -VPROLQZmikz 5243 -VPROLQZri 5244 -VPROLQZrik 5245 -VPROLQZrikz 5246 -VPROLVDZ 5247 -VPROLVDZrm 5248 -VPROLVDZrmb 5249 -VPROLVDZrmbk 5250 -VPROLVDZrmbkz 5251 -VPROLVDZrmk 5252 -VPROLVDZrmkz 5253 -VPROLVDZrr 5254 -VPROLVDZrrk 5255 -VPROLVDZrrkz 5256 -VPROLVQZ 5257 -VPROLVQZrm 5258 -VPROLVQZrmb 5259 -VPROLVQZrmbk 5260 -VPROLVQZrmbkz 5261 -VPROLVQZrmk 5262 -VPROLVQZrmkz 5263 -VPROLVQZrr 5264 -VPROLVQZrrk 5265 -VPROLVQZrrkz 5266 -VPRORDZ 5267 -VPRORDZmbi 5268 -VPRORDZmbik 5269 -VPRORDZmbikz 5270 -VPRORDZmi 5271 -VPRORDZmik 5272 -VPRORDZmikz 5273 -VPRORDZri 5274 -VPRORDZrik 5275 -VPRORDZrikz 5276 -VPRORQZ 5277 -VPRORQZmbi 5278 -VPRORQZmbik 5279 -VPRORQZmbikz 5280 -VPRORQZmi 5281 -VPRORQZmik 5282 -VPRORQZmikz 5283 -VPRORQZri 5284 -VPRORQZrik 5285 -VPRORQZrikz 5286 -VPRORVDZ 5287 -VPRORVDZrm 5288 -VPRORVDZrmb 5289 -VPRORVDZrmbk 5290 -VPRORVDZrmbkz 5291 -VPRORVDZrmk 5292 -VPRORVDZrmkz 5293 -VPRORVDZrr 5294 -VPRORVDZrrk 5295 -VPRORVDZrrkz 5296 -VPRORVQZ 5297 -VPRORVQZrm 5298 -VPRORVQZrmb 5299 -VPRORVQZrmbk 5300 -VPRORVQZrmbkz 5301 -VPRORVQZrmk 5302 -VPRORVQZrmkz 5303 -VPRORVQZrr 5304 -VPRORVQZrrk 5305 -VPRORVQZrrkz 5306 -VPROTBmi 5307 -VPROTBmr 5308 -VPROTBri 5309 -VPROTBrm 5310 -VPROTBrr 5311 -VPROTBrr_REV 5312 -VPROTDmi 5313 -VPROTDmr 5314 -VPROTDri 5315 -VPROTDrm 5316 -VPROTDrr 5317 -VPROTDrr_REV 5318 -VPROTQmi 5319 -VPROTQmr 5320 -VPROTQri 5321 -VPROTQrm 5322 -VPROTQrr 5323 -VPROTQrr_REV 5324 -VPROTWmi 5325 -VPROTWmr 5326 -VPROTWri 5327 -VPROTWrm 5328 -VPROTWrr 5329 -VPROTWrr_REV 5330 -VPSADBWYrm 5331 -VPSADBWYrr 5332 -VPSADBWZ 5333 -VPSADBWZrm 5334 -VPSADBWZrr 5335 -VPSADBWrm 5336 -VPSADBWrr 5337 -VPSCATTERDDZ 5338 -VPSCATTERDDZmr 5339 -VPSCATTERDQZ 5340 -VPSCATTERDQZmr 5341 -VPSCATTERQDZ 5342 -VPSCATTERQDZmr 5343 -VPSCATTERQQZ 5344 -VPSCATTERQQZmr 5345 -VPSHABmr 5346 -VPSHABrm 5347 -VPSHABrr 5348 -VPSHABrr_REV 5349 -VPSHADmr 5350 -VPSHADrm 5351 -VPSHADrr 5352 -VPSHADrr_REV 5353 -VPSHAQmr 5354 -VPSHAQrm 5355 -VPSHAQrr 5356 -VPSHAQrr_REV 5357 -VPSHAWmr 5358 -VPSHAWrm 5359 -VPSHAWrr 5360 -VPSHAWrr_REV 5361 -VPSHLBmr 5362 -VPSHLBrm 5363 -VPSHLBrr 5364 -VPSHLBrr_REV 5365 -VPSHLDDZ 5366 -VPSHLDDZrmbi 5367 -VPSHLDDZrmbik 5368 -VPSHLDDZrmbikz 5369 -VPSHLDDZrmi 5370 -VPSHLDDZrmik 5371 -VPSHLDDZrmikz 5372 -VPSHLDDZrri 5373 -VPSHLDDZrrik 5374 -VPSHLDDZrrikz 5375 -VPSHLDQZ 5376 -VPSHLDQZrmbi 5377 -VPSHLDQZrmbik 5378 -VPSHLDQZrmbikz 5379 -VPSHLDQZrmi 5380 -VPSHLDQZrmik 5381 -VPSHLDQZrmikz 5382 -VPSHLDQZrri 5383 -VPSHLDQZrrik 5384 -VPSHLDQZrrikz 5385 -VPSHLDVDZ 5386 -VPSHLDVDZm 5387 -VPSHLDVDZmb 5388 -VPSHLDVDZmbk 5389 -VPSHLDVDZmbkz 5390 -VPSHLDVDZmk 5391 -VPSHLDVDZmkz 5392 -VPSHLDVDZr 5393 -VPSHLDVDZrk 5394 -VPSHLDVDZrkz 5395 -VPSHLDVQZ 5396 -VPSHLDVQZm 5397 -VPSHLDVQZmb 5398 -VPSHLDVQZmbk 5399 -VPSHLDVQZmbkz 5400 -VPSHLDVQZmk 5401 -VPSHLDVQZmkz 5402 -VPSHLDVQZr 5403 -VPSHLDVQZrk 5404 -VPSHLDVQZrkz 5405 -VPSHLDVWZ 5406 -VPSHLDVWZm 5407 -VPSHLDVWZmk 5408 -VPSHLDVWZmkz 5409 -VPSHLDVWZr 5410 -VPSHLDVWZrk 5411 -VPSHLDVWZrkz 5412 -VPSHLDWZ 5413 -VPSHLDWZrmi 5414 -VPSHLDWZrmik 5415 -VPSHLDWZrmikz 5416 -VPSHLDWZrri 5417 -VPSHLDWZrrik 5418 -VPSHLDWZrrikz 5419 -VPSHLDmr 5420 -VPSHLDrm 5421 -VPSHLDrr 5422 -VPSHLDrr_REV 5423 -VPSHLQmr 5424 -VPSHLQrm 5425 -VPSHLQrr 5426 -VPSHLQrr_REV 5427 -VPSHLWmr 5428 -VPSHLWrm 5429 -VPSHLWrr 5430 -VPSHLWrr_REV 5431 -VPSHRDDZ 5432 -VPSHRDDZrmbi 5433 -VPSHRDDZrmbik 5434 -VPSHRDDZrmbikz 5435 -VPSHRDDZrmi 5436 -VPSHRDDZrmik 5437 -VPSHRDDZrmikz 5438 -VPSHRDDZrri 5439 -VPSHRDDZrrik 5440 -VPSHRDDZrrikz 5441 -VPSHRDQZ 5442 -VPSHRDQZrmbi 5443 -VPSHRDQZrmbik 5444 -VPSHRDQZrmbikz 5445 -VPSHRDQZrmi 5446 -VPSHRDQZrmik 5447 -VPSHRDQZrmikz 5448 -VPSHRDQZrri 5449 -VPSHRDQZrrik 5450 -VPSHRDQZrrikz 5451 -VPSHRDVDZ 5452 -VPSHRDVDZm 5453 -VPSHRDVDZmb 5454 -VPSHRDVDZmbk 5455 -VPSHRDVDZmbkz 5456 -VPSHRDVDZmk 5457 -VPSHRDVDZmkz 5458 -VPSHRDVDZr 5459 -VPSHRDVDZrk 5460 -VPSHRDVDZrkz 5461 -VPSHRDVQZ 5462 -VPSHRDVQZm 5463 -VPSHRDVQZmb 5464 -VPSHRDVQZmbk 5465 -VPSHRDVQZmbkz 5466 -VPSHRDVQZmk 5467 -VPSHRDVQZmkz 5468 -VPSHRDVQZr 5469 -VPSHRDVQZrk 5470 -VPSHRDVQZrkz 5471 -VPSHRDVWZ 5472 -VPSHRDVWZm 5473 -VPSHRDVWZmk 5474 -VPSHRDVWZmkz 5475 -VPSHRDVWZr 5476 -VPSHRDVWZrk 5477 -VPSHRDVWZrkz 5478 -VPSHRDWZ 5479 -VPSHRDWZrmi 5480 -VPSHRDWZrmik 5481 -VPSHRDWZrmikz 5482 -VPSHRDWZrri 5483 -VPSHRDWZrrik 5484 -VPSHRDWZrrikz 5485 -VPSHUFBITQMBZ 5486 -VPSHUFBITQMBZrm 5487 -VPSHUFBITQMBZrmk 5488 -VPSHUFBITQMBZrr 5489 -VPSHUFBITQMBZrrk 5490 -VPSHUFBYrm 5491 -VPSHUFBYrr 5492 -VPSHUFBZ 5493 -VPSHUFBZrm 5494 -VPSHUFBZrmk 5495 -VPSHUFBZrmkz 5496 -VPSHUFBZrr 5497 -VPSHUFBZrrk 5498 -VPSHUFBZrrkz 5499 -VPSHUFBrm 5500 -VPSHUFBrr 5501 -VPSHUFDYmi 5502 -VPSHUFDYri 5503 -VPSHUFDZ 5504 -VPSHUFDZmbi 5505 -VPSHUFDZmbik 5506 -VPSHUFDZmbikz 5507 -VPSHUFDZmi 5508 -VPSHUFDZmik 5509 -VPSHUFDZmikz 5510 -VPSHUFDZri 5511 -VPSHUFDZrik 5512 -VPSHUFDZrikz 5513 -VPSHUFDmi 5514 -VPSHUFDri 5515 -VPSHUFHWYmi 5516 -VPSHUFHWYri 5517 -VPSHUFHWZ 5518 -VPSHUFHWZmi 5519 -VPSHUFHWZmik 5520 -VPSHUFHWZmikz 5521 -VPSHUFHWZri 5522 -VPSHUFHWZrik 5523 -VPSHUFHWZrikz 5524 -VPSHUFHWmi 5525 -VPSHUFHWri 5526 -VPSHUFLWYmi 5527 -VPSHUFLWYri 5528 -VPSHUFLWZ 5529 -VPSHUFLWZmi 5530 -VPSHUFLWZmik 5531 -VPSHUFLWZmikz 5532 -VPSHUFLWZri 5533 -VPSHUFLWZrik 5534 -VPSHUFLWZrikz 5535 -VPSHUFLWmi 5536 -VPSHUFLWri 5537 -VPSIGNBYrm 5538 -VPSIGNBYrr 5539 -VPSIGNBrm 5540 -VPSIGNBrr 5541 -VPSIGNDYrm 5542 -VPSIGNDYrr 5543 -VPSIGNDrm 5544 -VPSIGNDrr 5545 -VPSIGNWYrm 5546 -VPSIGNWYrr 5547 -VPSIGNWrm 5548 -VPSIGNWrr 5549 -VPSLLDQYri 5550 -VPSLLDQZ 5551 -VPSLLDQZmi 5552 -VPSLLDQZri 5553 -VPSLLDQri 5554 -VPSLLDYri 5555 -VPSLLDYrm 5556 -VPSLLDYrr 5557 -VPSLLDZ 5558 -VPSLLDZmbi 5559 -VPSLLDZmbik 5560 -VPSLLDZmbikz 5561 -VPSLLDZmi 5562 -VPSLLDZmik 5563 -VPSLLDZmikz 5564 -VPSLLDZri 5565 -VPSLLDZrik 5566 -VPSLLDZrikz 5567 -VPSLLDZrm 5568 -VPSLLDZrmk 5569 -VPSLLDZrmkz 5570 -VPSLLDZrr 5571 -VPSLLDZrrk 5572 -VPSLLDZrrkz 5573 -VPSLLDri 5574 -VPSLLDrm 5575 -VPSLLDrr 5576 -VPSLLQYri 5577 -VPSLLQYrm 5578 -VPSLLQYrr 5579 -VPSLLQZ 5580 -VPSLLQZmbi 5581 -VPSLLQZmbik 5582 -VPSLLQZmbikz 5583 -VPSLLQZmi 5584 -VPSLLQZmik 5585 -VPSLLQZmikz 5586 -VPSLLQZri 5587 -VPSLLQZrik 5588 -VPSLLQZrikz 5589 -VPSLLQZrm 5590 -VPSLLQZrmk 5591 -VPSLLQZrmkz 5592 -VPSLLQZrr 5593 -VPSLLQZrrk 5594 -VPSLLQZrrkz 5595 -VPSLLQri 5596 -VPSLLQrm 5597 -VPSLLQrr 5598 -VPSLLVDYrm 5599 -VPSLLVDYrr 5600 -VPSLLVDZ 5601 -VPSLLVDZrm 5602 -VPSLLVDZrmb 5603 -VPSLLVDZrmbk 5604 -VPSLLVDZrmbkz 5605 -VPSLLVDZrmk 5606 -VPSLLVDZrmkz 5607 -VPSLLVDZrr 5608 -VPSLLVDZrrk 5609 -VPSLLVDZrrkz 5610 -VPSLLVDrm 5611 -VPSLLVDrr 5612 -VPSLLVQYrm 5613 -VPSLLVQYrr 5614 -VPSLLVQZ 5615 -VPSLLVQZrm 5616 -VPSLLVQZrmb 5617 -VPSLLVQZrmbk 5618 -VPSLLVQZrmbkz 5619 -VPSLLVQZrmk 5620 -VPSLLVQZrmkz 5621 -VPSLLVQZrr 5622 -VPSLLVQZrrk 5623 -VPSLLVQZrrkz 5624 -VPSLLVQrm 5625 -VPSLLVQrr 5626 -VPSLLVWZ 5627 -VPSLLVWZrm 5628 -VPSLLVWZrmk 5629 -VPSLLVWZrmkz 5630 -VPSLLVWZrr 5631 -VPSLLVWZrrk 5632 -VPSLLVWZrrkz 5633 -VPSLLWYri 5634 -VPSLLWYrm 5635 -VPSLLWYrr 5636 -VPSLLWZ 5637 -VPSLLWZmi 5638 -VPSLLWZmik 5639 -VPSLLWZmikz 5640 -VPSLLWZri 5641 -VPSLLWZrik 5642 -VPSLLWZrikz 5643 -VPSLLWZrm 5644 -VPSLLWZrmk 5645 -VPSLLWZrmkz 5646 -VPSLLWZrr 5647 -VPSLLWZrrk 5648 -VPSLLWZrrkz 5649 -VPSLLWri 5650 -VPSLLWrm 5651 -VPSLLWrr 5652 -VPSRADYri 5653 -VPSRADYrm 5654 -VPSRADYrr 5655 -VPSRADZ 5656 -VPSRADZmbi 5657 -VPSRADZmbik 5658 -VPSRADZmbikz 5659 -VPSRADZmi 5660 -VPSRADZmik 5661 -VPSRADZmikz 5662 -VPSRADZri 5663 -VPSRADZrik 5664 -VPSRADZrikz 5665 -VPSRADZrm 5666 -VPSRADZrmk 5667 -VPSRADZrmkz 5668 -VPSRADZrr 5669 -VPSRADZrrk 5670 -VPSRADZrrkz 5671 -VPSRADri 5672 -VPSRADrm 5673 -VPSRADrr 5674 -VPSRAQZ 5675 -VPSRAQZmbi 5676 -VPSRAQZmbik 5677 -VPSRAQZmbikz 5678 -VPSRAQZmi 5679 -VPSRAQZmik 5680 -VPSRAQZmikz 5681 -VPSRAQZri 5682 -VPSRAQZrik 5683 -VPSRAQZrikz 5684 -VPSRAQZrm 5685 -VPSRAQZrmk 5686 -VPSRAQZrmkz 5687 -VPSRAQZrr 5688 -VPSRAQZrrk 5689 -VPSRAQZrrkz 5690 -VPSRAVDYrm 5691 -VPSRAVDYrr 5692 -VPSRAVDZ 5693 -VPSRAVDZrm 5694 -VPSRAVDZrmb 5695 -VPSRAVDZrmbk 5696 -VPSRAVDZrmbkz 5697 -VPSRAVDZrmk 5698 -VPSRAVDZrmkz 5699 -VPSRAVDZrr 5700 -VPSRAVDZrrk 5701 -VPSRAVDZrrkz 5702 -VPSRAVDrm 5703 -VPSRAVDrr 5704 -VPSRAVQZ 5705 -VPSRAVQZrm 5706 -VPSRAVQZrmb 5707 -VPSRAVQZrmbk 5708 -VPSRAVQZrmbkz 5709 -VPSRAVQZrmk 5710 -VPSRAVQZrmkz 5711 -VPSRAVQZrr 5712 -VPSRAVQZrrk 5713 -VPSRAVQZrrkz 5714 -VPSRAVWZ 5715 -VPSRAVWZrm 5716 -VPSRAVWZrmk 5717 -VPSRAVWZrmkz 5718 -VPSRAVWZrr 5719 -VPSRAVWZrrk 5720 -VPSRAVWZrrkz 5721 -VPSRAWYri 5722 -VPSRAWYrm 5723 -VPSRAWYrr 5724 -VPSRAWZ 5725 -VPSRAWZmi 5726 -VPSRAWZmik 5727 -VPSRAWZmikz 5728 -VPSRAWZri 5729 -VPSRAWZrik 5730 -VPSRAWZrikz 5731 -VPSRAWZrm 5732 -VPSRAWZrmk 5733 -VPSRAWZrmkz 5734 -VPSRAWZrr 5735 -VPSRAWZrrk 5736 -VPSRAWZrrkz 5737 -VPSRAWri 5738 -VPSRAWrm 5739 -VPSRAWrr 5740 -VPSRLDQYri 5741 -VPSRLDQZ 5742 -VPSRLDQZmi 5743 -VPSRLDQZri 5744 -VPSRLDQri 5745 -VPSRLDYri 5746 -VPSRLDYrm 5747 -VPSRLDYrr 5748 -VPSRLDZ 5749 -VPSRLDZmbi 5750 -VPSRLDZmbik 5751 -VPSRLDZmbikz 5752 -VPSRLDZmi 5753 -VPSRLDZmik 5754 -VPSRLDZmikz 5755 -VPSRLDZri 5756 -VPSRLDZrik 5757 -VPSRLDZrikz 5758 -VPSRLDZrm 5759 -VPSRLDZrmk 5760 -VPSRLDZrmkz 5761 -VPSRLDZrr 5762 -VPSRLDZrrk 5763 -VPSRLDZrrkz 5764 -VPSRLDri 5765 -VPSRLDrm 5766 -VPSRLDrr 5767 -VPSRLQYri 5768 -VPSRLQYrm 5769 -VPSRLQYrr 5770 -VPSRLQZ 5771 -VPSRLQZmbi 5772 -VPSRLQZmbik 5773 -VPSRLQZmbikz 5774 -VPSRLQZmi 5775 -VPSRLQZmik 5776 -VPSRLQZmikz 5777 -VPSRLQZri 5778 -VPSRLQZrik 5779 -VPSRLQZrikz 5780 -VPSRLQZrm 5781 -VPSRLQZrmk 5782 -VPSRLQZrmkz 5783 -VPSRLQZrr 5784 -VPSRLQZrrk 5785 -VPSRLQZrrkz 5786 -VPSRLQri 5787 -VPSRLQrm 5788 -VPSRLQrr 5789 -VPSRLVDYrm 5790 -VPSRLVDYrr 5791 -VPSRLVDZ 5792 -VPSRLVDZrm 5793 -VPSRLVDZrmb 5794 -VPSRLVDZrmbk 5795 -VPSRLVDZrmbkz 5796 -VPSRLVDZrmk 5797 -VPSRLVDZrmkz 5798 -VPSRLVDZrr 5799 -VPSRLVDZrrk 5800 -VPSRLVDZrrkz 5801 -VPSRLVDrm 5802 -VPSRLVDrr 5803 -VPSRLVQYrm 5804 -VPSRLVQYrr 5805 -VPSRLVQZ 5806 -VPSRLVQZrm 5807 -VPSRLVQZrmb 5808 -VPSRLVQZrmbk 5809 -VPSRLVQZrmbkz 5810 -VPSRLVQZrmk 5811 -VPSRLVQZrmkz 5812 -VPSRLVQZrr 5813 -VPSRLVQZrrk 5814 -VPSRLVQZrrkz 5815 -VPSRLVQrm 5816 -VPSRLVQrr 5817 -VPSRLVWZ 5818 -VPSRLVWZrm 5819 -VPSRLVWZrmk 5820 -VPSRLVWZrmkz 5821 -VPSRLVWZrr 5822 -VPSRLVWZrrk 5823 -VPSRLVWZrrkz 5824 -VPSRLWYri 5825 -VPSRLWYrm 5826 -VPSRLWYrr 5827 -VPSRLWZ 5828 -VPSRLWZmi 5829 -VPSRLWZmik 5830 -VPSRLWZmikz 5831 -VPSRLWZri 5832 -VPSRLWZrik 5833 -VPSRLWZrikz 5834 -VPSRLWZrm 5835 -VPSRLWZrmk 5836 -VPSRLWZrmkz 5837 -VPSRLWZrr 5838 -VPSRLWZrrk 5839 -VPSRLWZrrkz 5840 -VPSRLWri 5841 -VPSRLWrm 5842 -VPSRLWrr 5843 -VPSUBBYrm 5844 -VPSUBBYrr 5845 -VPSUBBZ 5846 -VPSUBBZrm 5847 -VPSUBBZrmk 5848 -VPSUBBZrmkz 5849 -VPSUBBZrr 5850 -VPSUBBZrrk 5851 -VPSUBBZrrkz 5852 -VPSUBBrm 5853 -VPSUBBrr 5854 -VPSUBDYrm 5855 -VPSUBDYrr 5856 -VPSUBDZ 5857 -VPSUBDZrm 5858 -VPSUBDZrmb 5859 -VPSUBDZrmbk 5860 -VPSUBDZrmbkz 5861 -VPSUBDZrmk 5862 -VPSUBDZrmkz 5863 -VPSUBDZrr 5864 -VPSUBDZrrk 5865 -VPSUBDZrrkz 5866 -VPSUBDrm 5867 -VPSUBDrr 5868 -VPSUBQYrm 5869 -VPSUBQYrr 5870 -VPSUBQZ 5871 -VPSUBQZrm 5872 -VPSUBQZrmb 5873 -VPSUBQZrmbk 5874 -VPSUBQZrmbkz 5875 -VPSUBQZrmk 5876 -VPSUBQZrmkz 5877 -VPSUBQZrr 5878 -VPSUBQZrrk 5879 -VPSUBQZrrkz 5880 -VPSUBQrm 5881 -VPSUBQrr 5882 -VPSUBSBYrm 5883 -VPSUBSBYrr 5884 -VPSUBSBZ 5885 -VPSUBSBZrm 5886 -VPSUBSBZrmk 5887 -VPSUBSBZrmkz 5888 -VPSUBSBZrr 5889 -VPSUBSBZrrk 5890 -VPSUBSBZrrkz 5891 -VPSUBSBrm 5892 -VPSUBSBrr 5893 -VPSUBSWYrm 5894 -VPSUBSWYrr 5895 -VPSUBSWZ 5896 -VPSUBSWZrm 5897 -VPSUBSWZrmk 5898 -VPSUBSWZrmkz 5899 -VPSUBSWZrr 5900 -VPSUBSWZrrk 5901 -VPSUBSWZrrkz 5902 -VPSUBSWrm 5903 -VPSUBSWrr 5904 -VPSUBUSBYrm 5905 -VPSUBUSBYrr 5906 -VPSUBUSBZ 5907 -VPSUBUSBZrm 5908 -VPSUBUSBZrmk 5909 -VPSUBUSBZrmkz 5910 -VPSUBUSBZrr 5911 -VPSUBUSBZrrk 5912 -VPSUBUSBZrrkz 5913 -VPSUBUSBrm 5914 -VPSUBUSBrr 5915 -VPSUBUSWYrm 5916 -VPSUBUSWYrr 5917 -VPSUBUSWZ 5918 -VPSUBUSWZrm 5919 -VPSUBUSWZrmk 5920 -VPSUBUSWZrmkz 5921 -VPSUBUSWZrr 5922 -VPSUBUSWZrrk 5923 -VPSUBUSWZrrkz 5924 -VPSUBUSWrm 5925 -VPSUBUSWrr 5926 -VPSUBWYrm 5927 -VPSUBWYrr 5928 -VPSUBWZ 5929 -VPSUBWZrm 5930 -VPSUBWZrmk 5931 -VPSUBWZrmkz 5932 -VPSUBWZrr 5933 -VPSUBWZrrk 5934 -VPSUBWZrrkz 5935 -VPSUBWrm 5936 -VPSUBWrr 5937 -VPTERNLOGDZ 5938 -VPTERNLOGDZrmbi 5939 -VPTERNLOGDZrmbik 5940 -VPTERNLOGDZrmbikz 5941 -VPTERNLOGDZrmi 5942 -VPTERNLOGDZrmik 5943 -VPTERNLOGDZrmikz 5944 -VPTERNLOGDZrri 5945 -VPTERNLOGDZrrik 5946 -VPTERNLOGDZrrikz 5947 -VPTERNLOGQZ 5948 -VPTERNLOGQZrmbi 5949 -VPTERNLOGQZrmbik 5950 -VPTERNLOGQZrmbikz 5951 -VPTERNLOGQZrmi 5952 -VPTERNLOGQZrmik 5953 -VPTERNLOGQZrmikz 5954 -VPTERNLOGQZrri 5955 -VPTERNLOGQZrrik 5956 -VPTERNLOGQZrrikz 5957 -VPTESTMBZ 5958 -VPTESTMBZrm 5959 -VPTESTMBZrmk 5960 -VPTESTMBZrr 5961 -VPTESTMBZrrk 5962 -VPTESTMDZ 5963 -VPTESTMDZrm 5964 -VPTESTMDZrmb 5965 -VPTESTMDZrmbk 5966 -VPTESTMDZrmk 5967 -VPTESTMDZrr 5968 -VPTESTMDZrrk 5969 -VPTESTMQZ 5970 -VPTESTMQZrm 5971 -VPTESTMQZrmb 5972 -VPTESTMQZrmbk 5973 -VPTESTMQZrmk 5974 -VPTESTMQZrr 5975 -VPTESTMQZrrk 5976 -VPTESTMWZ 5977 -VPTESTMWZrm 5978 -VPTESTMWZrmk 5979 -VPTESTMWZrr 5980 -VPTESTMWZrrk 5981 -VPTESTNMBZ 5982 -VPTESTNMBZrm 5983 -VPTESTNMBZrmk 5984 -VPTESTNMBZrr 5985 -VPTESTNMBZrrk 5986 -VPTESTNMDZ 5987 -VPTESTNMDZrm 5988 -VPTESTNMDZrmb 5989 -VPTESTNMDZrmbk 5990 -VPTESTNMDZrmk 5991 -VPTESTNMDZrr 5992 -VPTESTNMDZrrk 5993 -VPTESTNMQZ 5994 -VPTESTNMQZrm 5995 -VPTESTNMQZrmb 5996 -VPTESTNMQZrmbk 5997 -VPTESTNMQZrmk 5998 -VPTESTNMQZrr 5999 -VPTESTNMQZrrk 6000 -VPTESTNMWZ 6001 -VPTESTNMWZrm 6002 -VPTESTNMWZrmk 6003 -VPTESTNMWZrr 6004 -VPTESTNMWZrrk 6005 -VPTESTYrm 6006 -VPTESTYrr 6007 -VPTESTrm 6008 -VPTESTrr 6009 -VPUNPCKHBWYrm 6010 -VPUNPCKHBWYrr 6011 -VPUNPCKHBWZ 6012 -VPUNPCKHBWZrm 6013 -VPUNPCKHBWZrmk 6014 -VPUNPCKHBWZrmkz 6015 -VPUNPCKHBWZrr 6016 -VPUNPCKHBWZrrk 6017 -VPUNPCKHBWZrrkz 6018 -VPUNPCKHBWrm 6019 -VPUNPCKHBWrr 6020 -VPUNPCKHDQYrm 6021 -VPUNPCKHDQYrr 6022 -VPUNPCKHDQZ 6023 -VPUNPCKHDQZrm 6024 -VPUNPCKHDQZrmb 6025 -VPUNPCKHDQZrmbk 6026 -VPUNPCKHDQZrmbkz 6027 -VPUNPCKHDQZrmk 6028 -VPUNPCKHDQZrmkz 6029 -VPUNPCKHDQZrr 6030 -VPUNPCKHDQZrrk 6031 -VPUNPCKHDQZrrkz 6032 -VPUNPCKHDQrm 6033 -VPUNPCKHDQrr 6034 -VPUNPCKHQDQYrm 6035 -VPUNPCKHQDQYrr 6036 -VPUNPCKHQDQZ 6037 -VPUNPCKHQDQZrm 6038 -VPUNPCKHQDQZrmb 6039 -VPUNPCKHQDQZrmbk 6040 -VPUNPCKHQDQZrmbkz 6041 -VPUNPCKHQDQZrmk 6042 -VPUNPCKHQDQZrmkz 6043 -VPUNPCKHQDQZrr 6044 -VPUNPCKHQDQZrrk 6045 -VPUNPCKHQDQZrrkz 6046 -VPUNPCKHQDQrm 6047 -VPUNPCKHQDQrr 6048 -VPUNPCKHWDYrm 6049 -VPUNPCKHWDYrr 6050 -VPUNPCKHWDZ 6051 -VPUNPCKHWDZrm 6052 -VPUNPCKHWDZrmk 6053 -VPUNPCKHWDZrmkz 6054 -VPUNPCKHWDZrr 6055 -VPUNPCKHWDZrrk 6056 -VPUNPCKHWDZrrkz 6057 -VPUNPCKHWDrm 6058 -VPUNPCKHWDrr 6059 -VPUNPCKLBWYrm 6060 -VPUNPCKLBWYrr 6061 -VPUNPCKLBWZ 6062 -VPUNPCKLBWZrm 6063 -VPUNPCKLBWZrmk 6064 -VPUNPCKLBWZrmkz 6065 -VPUNPCKLBWZrr 6066 -VPUNPCKLBWZrrk 6067 -VPUNPCKLBWZrrkz 6068 -VPUNPCKLBWrm 6069 -VPUNPCKLBWrr 6070 -VPUNPCKLDQYrm 6071 -VPUNPCKLDQYrr 6072 -VPUNPCKLDQZ 6073 -VPUNPCKLDQZrm 6074 -VPUNPCKLDQZrmb 6075 -VPUNPCKLDQZrmbk 6076 -VPUNPCKLDQZrmbkz 6077 -VPUNPCKLDQZrmk 6078 -VPUNPCKLDQZrmkz 6079 -VPUNPCKLDQZrr 6080 -VPUNPCKLDQZrrk 6081 -VPUNPCKLDQZrrkz 6082 -VPUNPCKLDQrm 6083 -VPUNPCKLDQrr 6084 -VPUNPCKLQDQYrm 6085 -VPUNPCKLQDQYrr 6086 -VPUNPCKLQDQZ 6087 -VPUNPCKLQDQZrm 6088 -VPUNPCKLQDQZrmb 6089 -VPUNPCKLQDQZrmbk 6090 -VPUNPCKLQDQZrmbkz 6091 -VPUNPCKLQDQZrmk 6092 -VPUNPCKLQDQZrmkz 6093 -VPUNPCKLQDQZrr 6094 -VPUNPCKLQDQZrrk 6095 -VPUNPCKLQDQZrrkz 6096 -VPUNPCKLQDQrm 6097 -VPUNPCKLQDQrr 6098 -VPUNPCKLWDYrm 6099 -VPUNPCKLWDYrr 6100 -VPUNPCKLWDZ 6101 -VPUNPCKLWDZrm 6102 -VPUNPCKLWDZrmk 6103 -VPUNPCKLWDZrmkz 6104 -VPUNPCKLWDZrr 6105 -VPUNPCKLWDZrrk 6106 -VPUNPCKLWDZrrkz 6107 -VPUNPCKLWDrm 6108 -VPUNPCKLWDrr 6109 -VPXORDZ 6110 -VPXORDZrm 6111 -VPXORDZrmb 6112 -VPXORDZrmbk 6113 -VPXORDZrmbkz 6114 -VPXORDZrmk 6115 -VPXORDZrmkz 6116 -VPXORDZrr 6117 -VPXORDZrrk 6118 -VPXORDZrrkz 6119 -VPXORQZ 6120 -VPXORQZrm 6121 -VPXORQZrmb 6122 -VPXORQZrmbk 6123 -VPXORQZrmbkz 6124 -VPXORQZrmk 6125 -VPXORQZrmkz 6126 -VPXORQZrr 6127 -VPXORQZrrk 6128 -VPXORQZrrkz 6129 -VPXORYrm 6130 -VPXORYrr 6131 -VPXORrm 6132 -VPXORrr 6133 -VRANGEPDZ 6134 -VRANGEPDZrmbi 6135 -VRANGEPDZrmbik 6136 -VRANGEPDZrmbikz 6137 -VRANGEPDZrmi 6138 -VRANGEPDZrmik 6139 -VRANGEPDZrmikz 6140 -VRANGEPDZrri 6141 -VRANGEPDZrrib 6142 -VRANGEPDZrribk 6143 -VRANGEPDZrribkz 6144 -VRANGEPDZrrik 6145 -VRANGEPDZrrikz 6146 -VRANGEPSZ 6147 -VRANGEPSZrmbi 6148 -VRANGEPSZrmbik 6149 -VRANGEPSZrmbikz 6150 -VRANGEPSZrmi 6151 -VRANGEPSZrmik 6152 -VRANGEPSZrmikz 6153 -VRANGEPSZrri 6154 -VRANGEPSZrrib 6155 -VRANGEPSZrribk 6156 -VRANGEPSZrribkz 6157 -VRANGEPSZrrik 6158 -VRANGEPSZrrikz 6159 -VRANGESDZrmi 6160 -VRANGESDZrmik 6161 -VRANGESDZrmikz 6162 -VRANGESDZrri 6163 -VRANGESDZrrib 6164 -VRANGESDZrribk 6165 -VRANGESDZrribkz 6166 -VRANGESDZrrik 6167 -VRANGESDZrrikz 6168 -VRANGESSZrmi 6169 -VRANGESSZrmik 6170 -VRANGESSZrmikz 6171 -VRANGESSZrri 6172 -VRANGESSZrrib 6173 -VRANGESSZrribk 6174 -VRANGESSZrribkz 6175 -VRANGESSZrrik 6176 -VRANGESSZrrikz 6177 -VRCP 6178 -VRCPBF 6179 -VRCPPHZ 6180 -VRCPPHZm 6181 -VRCPPHZmb 6182 -VRCPPHZmbk 6183 -VRCPPHZmbkz 6184 -VRCPPHZmk 6185 -VRCPPHZmkz 6186 -VRCPPHZr 6187 -VRCPPHZrk 6188 -VRCPPHZrkz 6189 -VRCPPSYm 6190 -VRCPPSYr 6191 -VRCPPSm 6192 -VRCPPSr 6193 -VRCPSHZrm 6194 -VRCPSHZrmk 6195 -VRCPSHZrmkz 6196 -VRCPSHZrr 6197 -VRCPSHZrrk 6198 -VRCPSHZrrkz 6199 -VRCPSSm 6200 -VRCPSSm_Int 6201 -VRCPSSr 6202 -VRCPSSr_Int 6203 -VREDUCEBF 6204 -VREDUCEPDZ 6205 -VREDUCEPDZrmbi 6206 -VREDUCEPDZrmbik 6207 -VREDUCEPDZrmbikz 6208 -VREDUCEPDZrmi 6209 -VREDUCEPDZrmik 6210 -VREDUCEPDZrmikz 6211 -VREDUCEPDZrri 6212 -VREDUCEPDZrrib 6213 -VREDUCEPDZrribk 6214 -VREDUCEPDZrribkz 6215 -VREDUCEPDZrrik 6216 -VREDUCEPDZrrikz 6217 -VREDUCEPHZ 6218 -VREDUCEPHZrmbi 6219 -VREDUCEPHZrmbik 6220 -VREDUCEPHZrmbikz 6221 -VREDUCEPHZrmi 6222 -VREDUCEPHZrmik 6223 -VREDUCEPHZrmikz 6224 -VREDUCEPHZrri 6225 -VREDUCEPHZrrib 6226 -VREDUCEPHZrribk 6227 -VREDUCEPHZrribkz 6228 -VREDUCEPHZrrik 6229 -VREDUCEPHZrrikz 6230 -VREDUCEPSZ 6231 -VREDUCEPSZrmbi 6232 -VREDUCEPSZrmbik 6233 -VREDUCEPSZrmbikz 6234 -VREDUCEPSZrmi 6235 -VREDUCEPSZrmik 6236 -VREDUCEPSZrmikz 6237 -VREDUCEPSZrri 6238 -VREDUCEPSZrrib 6239 -VREDUCEPSZrribk 6240 -VREDUCEPSZrribkz 6241 -VREDUCEPSZrrik 6242 -VREDUCEPSZrrikz 6243 -VREDUCESDZrmi 6244 -VREDUCESDZrmik 6245 -VREDUCESDZrmikz 6246 -VREDUCESDZrri 6247 -VREDUCESDZrrib 6248 -VREDUCESDZrribk 6249 -VREDUCESDZrribkz 6250 -VREDUCESDZrrik 6251 -VREDUCESDZrrikz 6252 -VREDUCESHZrmi 6253 -VREDUCESHZrmik 6254 -VREDUCESHZrmikz 6255 -VREDUCESHZrri 6256 -VREDUCESHZrrib 6257 -VREDUCESHZrribk 6258 -VREDUCESHZrribkz 6259 -VREDUCESHZrrik 6260 -VREDUCESHZrrikz 6261 -VREDUCESSZrmi 6262 -VREDUCESSZrmik 6263 -VREDUCESSZrmikz 6264 -VREDUCESSZrri 6265 -VREDUCESSZrrib 6266 -VREDUCESSZrribk 6267 -VREDUCESSZrribkz 6268 -VREDUCESSZrrik 6269 -VREDUCESSZrrikz 6270 -VRNDSCALEBF 6271 -VRNDSCALEPDZ 6272 -VRNDSCALEPDZrmbi 6273 -VRNDSCALEPDZrmbik 6274 -VRNDSCALEPDZrmbikz 6275 -VRNDSCALEPDZrmi 6276 -VRNDSCALEPDZrmik 6277 -VRNDSCALEPDZrmikz 6278 -VRNDSCALEPDZrri 6279 -VRNDSCALEPDZrrib 6280 -VRNDSCALEPDZrribk 6281 -VRNDSCALEPDZrribkz 6282 -VRNDSCALEPDZrrik 6283 -VRNDSCALEPDZrrikz 6284 -VRNDSCALEPHZ 6285 -VRNDSCALEPHZrmbi 6286 -VRNDSCALEPHZrmbik 6287 -VRNDSCALEPHZrmbikz 6288 -VRNDSCALEPHZrmi 6289 -VRNDSCALEPHZrmik 6290 -VRNDSCALEPHZrmikz 6291 -VRNDSCALEPHZrri 6292 -VRNDSCALEPHZrrib 6293 -VRNDSCALEPHZrribk 6294 -VRNDSCALEPHZrribkz 6295 -VRNDSCALEPHZrrik 6296 -VRNDSCALEPHZrrikz 6297 -VRNDSCALEPSZ 6298 -VRNDSCALEPSZrmbi 6299 -VRNDSCALEPSZrmbik 6300 -VRNDSCALEPSZrmbikz 6301 -VRNDSCALEPSZrmi 6302 -VRNDSCALEPSZrmik 6303 -VRNDSCALEPSZrmikz 6304 -VRNDSCALEPSZrri 6305 -VRNDSCALEPSZrrib 6306 -VRNDSCALEPSZrribk 6307 -VRNDSCALEPSZrribkz 6308 -VRNDSCALEPSZrrik 6309 -VRNDSCALEPSZrrikz 6310 -VRNDSCALESDZrmi 6311 -VRNDSCALESDZrmi_Int 6312 -VRNDSCALESDZrmik_Int 6313 -VRNDSCALESDZrmikz_Int 6314 -VRNDSCALESDZrri 6315 -VRNDSCALESDZrri_Int 6316 -VRNDSCALESDZrrib_Int 6317 -VRNDSCALESDZrribk_Int 6318 -VRNDSCALESDZrribkz_Int 6319 -VRNDSCALESDZrrik_Int 6320 -VRNDSCALESDZrrikz_Int 6321 -VRNDSCALESHZrmi 6322 -VRNDSCALESHZrmi_Int 6323 -VRNDSCALESHZrmik_Int 6324 -VRNDSCALESHZrmikz_Int 6325 -VRNDSCALESHZrri 6326 -VRNDSCALESHZrri_Int 6327 -VRNDSCALESHZrrib_Int 6328 -VRNDSCALESHZrribk_Int 6329 -VRNDSCALESHZrribkz_Int 6330 -VRNDSCALESHZrrik_Int 6331 -VRNDSCALESHZrrikz_Int 6332 -VRNDSCALESSZrmi 6333 -VRNDSCALESSZrmi_Int 6334 -VRNDSCALESSZrmik_Int 6335 -VRNDSCALESSZrmikz_Int 6336 -VRNDSCALESSZrri 6337 -VRNDSCALESSZrri_Int 6338 -VRNDSCALESSZrrib_Int 6339 -VRNDSCALESSZrribk_Int 6340 -VRNDSCALESSZrribkz_Int 6341 -VRNDSCALESSZrrik_Int 6342 -VRNDSCALESSZrrikz_Int 6343 -VROUNDPDYmi 6344 -VROUNDPDYri 6345 -VROUNDPDmi 6346 -VROUNDPDri 6347 -VROUNDPSYmi 6348 -VROUNDPSYri 6349 -VROUNDPSmi 6350 -VROUNDPSri 6351 -VROUNDSDmi 6352 -VROUNDSDmi_Int 6353 -VROUNDSDri 6354 -VROUNDSDri_Int 6355 -VROUNDSSmi 6356 -VROUNDSSmi_Int 6357 -VROUNDSSri 6358 -VROUNDSSri_Int 6359 -VRSQRT 6360 -VRSQRTBF 6361 -VRSQRTPHZ 6362 -VRSQRTPHZm 6363 -VRSQRTPHZmb 6364 -VRSQRTPHZmbk 6365 -VRSQRTPHZmbkz 6366 -VRSQRTPHZmk 6367 -VRSQRTPHZmkz 6368 -VRSQRTPHZr 6369 -VRSQRTPHZrk 6370 -VRSQRTPHZrkz 6371 -VRSQRTPSYm 6372 -VRSQRTPSYr 6373 -VRSQRTPSm 6374 -VRSQRTPSr 6375 -VRSQRTSHZrm 6376 -VRSQRTSHZrmk 6377 -VRSQRTSHZrmkz 6378 -VRSQRTSHZrr 6379 -VRSQRTSHZrrk 6380 -VRSQRTSHZrrkz 6381 -VRSQRTSSm 6382 -VRSQRTSSm_Int 6383 -VRSQRTSSr 6384 -VRSQRTSSr_Int 6385 -VSCALEFBF 6386 -VSCALEFPDZ 6387 -VSCALEFPDZrm 6388 -VSCALEFPDZrmb 6389 -VSCALEFPDZrmbk 6390 -VSCALEFPDZrmbkz 6391 -VSCALEFPDZrmk 6392 -VSCALEFPDZrmkz 6393 -VSCALEFPDZrr 6394 -VSCALEFPDZrrb 6395 -VSCALEFPDZrrbk 6396 -VSCALEFPDZrrbkz 6397 -VSCALEFPDZrrk 6398 -VSCALEFPDZrrkz 6399 -VSCALEFPHZ 6400 -VSCALEFPHZrm 6401 -VSCALEFPHZrmb 6402 -VSCALEFPHZrmbk 6403 -VSCALEFPHZrmbkz 6404 -VSCALEFPHZrmk 6405 -VSCALEFPHZrmkz 6406 -VSCALEFPHZrr 6407 -VSCALEFPHZrrb 6408 -VSCALEFPHZrrbk 6409 -VSCALEFPHZrrbkz 6410 -VSCALEFPHZrrk 6411 -VSCALEFPHZrrkz 6412 -VSCALEFPSZ 6413 -VSCALEFPSZrm 6414 -VSCALEFPSZrmb 6415 -VSCALEFPSZrmbk 6416 -VSCALEFPSZrmbkz 6417 -VSCALEFPSZrmk 6418 -VSCALEFPSZrmkz 6419 -VSCALEFPSZrr 6420 -VSCALEFPSZrrb 6421 -VSCALEFPSZrrbk 6422 -VSCALEFPSZrrbkz 6423 -VSCALEFPSZrrk 6424 -VSCALEFPSZrrkz 6425 -VSCALEFSDZrm 6426 -VSCALEFSDZrmk 6427 -VSCALEFSDZrmkz 6428 -VSCALEFSDZrr 6429 -VSCALEFSDZrrb_Int 6430 -VSCALEFSDZrrbk_Int 6431 -VSCALEFSDZrrbkz_Int 6432 -VSCALEFSDZrrk 6433 -VSCALEFSDZrrkz 6434 -VSCALEFSHZrm 6435 -VSCALEFSHZrmk 6436 -VSCALEFSHZrmkz 6437 -VSCALEFSHZrr 6438 -VSCALEFSHZrrb_Int 6439 -VSCALEFSHZrrbk_Int 6440 -VSCALEFSHZrrbkz_Int 6441 -VSCALEFSHZrrk 6442 -VSCALEFSHZrrkz 6443 -VSCALEFSSZrm 6444 -VSCALEFSSZrmk 6445 -VSCALEFSSZrmkz 6446 -VSCALEFSSZrr 6447 -VSCALEFSSZrrb_Int 6448 -VSCALEFSSZrrbk_Int 6449 -VSCALEFSSZrrbkz_Int 6450 -VSCALEFSSZrrk 6451 -VSCALEFSSZrrkz 6452 -VSCATTERDPDZ 6453 -VSCATTERDPDZmr 6454 -VSCATTERDPSZ 6455 -VSCATTERDPSZmr 6456 -VSCATTERPF 6457 -VSCATTERQPDZ 6458 -VSCATTERQPDZmr 6459 -VSCATTERQPSZ 6460 -VSCATTERQPSZmr 6461 -VSHA 6462 -VSHUFF 6463 -VSHUFI 6464 -VSHUFPDYrmi 6465 -VSHUFPDYrri 6466 -VSHUFPDZ 6467 -VSHUFPDZrmbi 6468 -VSHUFPDZrmbik 6469 -VSHUFPDZrmbikz 6470 -VSHUFPDZrmi 6471 -VSHUFPDZrmik 6472 -VSHUFPDZrmikz 6473 -VSHUFPDZrri 6474 -VSHUFPDZrrik 6475 -VSHUFPDZrrikz 6476 -VSHUFPDrmi 6477 -VSHUFPDrri 6478 -VSHUFPSYrmi 6479 -VSHUFPSYrri 6480 -VSHUFPSZ 6481 -VSHUFPSZrmbi 6482 -VSHUFPSZrmbik 6483 -VSHUFPSZrmbikz 6484 -VSHUFPSZrmi 6485 -VSHUFPSZrmik 6486 -VSHUFPSZrmikz 6487 -VSHUFPSZrri 6488 -VSHUFPSZrrik 6489 -VSHUFPSZrrikz 6490 -VSHUFPSrmi 6491 -VSHUFPSrri 6492 -VSM 6493 -VSQRTBF 6494 -VSQRTPDYm 6495 -VSQRTPDYr 6496 -VSQRTPDZ 6497 -VSQRTPDZm 6498 -VSQRTPDZmb 6499 -VSQRTPDZmbk 6500 -VSQRTPDZmbkz 6501 -VSQRTPDZmk 6502 -VSQRTPDZmkz 6503 -VSQRTPDZr 6504 -VSQRTPDZrb 6505 -VSQRTPDZrbk 6506 -VSQRTPDZrbkz 6507 -VSQRTPDZrk 6508 -VSQRTPDZrkz 6509 -VSQRTPDm 6510 -VSQRTPDr 6511 -VSQRTPHZ 6512 -VSQRTPHZm 6513 -VSQRTPHZmb 6514 -VSQRTPHZmbk 6515 -VSQRTPHZmbkz 6516 -VSQRTPHZmk 6517 -VSQRTPHZmkz 6518 -VSQRTPHZr 6519 -VSQRTPHZrb 6520 -VSQRTPHZrbk 6521 -VSQRTPHZrbkz 6522 -VSQRTPHZrk 6523 -VSQRTPHZrkz 6524 -VSQRTPSYm 6525 -VSQRTPSYr 6526 -VSQRTPSZ 6527 -VSQRTPSZm 6528 -VSQRTPSZmb 6529 -VSQRTPSZmbk 6530 -VSQRTPSZmbkz 6531 -VSQRTPSZmk 6532 -VSQRTPSZmkz 6533 -VSQRTPSZr 6534 -VSQRTPSZrb 6535 -VSQRTPSZrbk 6536 -VSQRTPSZrbkz 6537 -VSQRTPSZrk 6538 -VSQRTPSZrkz 6539 -VSQRTPSm 6540 -VSQRTPSr 6541 -VSQRTSDZm 6542 -VSQRTSDZm_Int 6543 -VSQRTSDZmk_Int 6544 -VSQRTSDZmkz_Int 6545 -VSQRTSDZr 6546 -VSQRTSDZr_Int 6547 -VSQRTSDZrb_Int 6548 -VSQRTSDZrbk_Int 6549 -VSQRTSDZrbkz_Int 6550 -VSQRTSDZrk_Int 6551 -VSQRTSDZrkz_Int 6552 -VSQRTSDm 6553 -VSQRTSDm_Int 6554 -VSQRTSDr 6555 -VSQRTSDr_Int 6556 -VSQRTSHZm 6557 -VSQRTSHZm_Int 6558 -VSQRTSHZmk_Int 6559 -VSQRTSHZmkz_Int 6560 -VSQRTSHZr 6561 -VSQRTSHZr_Int 6562 -VSQRTSHZrb_Int 6563 -VSQRTSHZrbk_Int 6564 -VSQRTSHZrbkz_Int 6565 -VSQRTSHZrk_Int 6566 -VSQRTSHZrkz_Int 6567 -VSQRTSSZm 6568 -VSQRTSSZm_Int 6569 -VSQRTSSZmk_Int 6570 -VSQRTSSZmkz_Int 6571 -VSQRTSSZr 6572 -VSQRTSSZr_Int 6573 -VSQRTSSZrb_Int 6574 -VSQRTSSZrbk_Int 6575 -VSQRTSSZrbkz_Int 6576 -VSQRTSSZrk_Int 6577 -VSQRTSSZrkz_Int 6578 -VSQRTSSm 6579 -VSQRTSSm_Int 6580 -VSQRTSSr 6581 -VSQRTSSr_Int 6582 -VSTMXCSR 6583 -VSUBBF 6584 -VSUBPDYrm 6585 -VSUBPDYrr 6586 -VSUBPDZ 6587 -VSUBPDZrm 6588 -VSUBPDZrmb 6589 -VSUBPDZrmbk 6590 -VSUBPDZrmbkz 6591 -VSUBPDZrmk 6592 -VSUBPDZrmkz 6593 -VSUBPDZrr 6594 -VSUBPDZrrb 6595 -VSUBPDZrrbk 6596 -VSUBPDZrrbkz 6597 -VSUBPDZrrk 6598 -VSUBPDZrrkz 6599 -VSUBPDrm 6600 -VSUBPDrr 6601 -VSUBPHZ 6602 -VSUBPHZrm 6603 -VSUBPHZrmb 6604 -VSUBPHZrmbk 6605 -VSUBPHZrmbkz 6606 -VSUBPHZrmk 6607 -VSUBPHZrmkz 6608 -VSUBPHZrr 6609 -VSUBPHZrrb 6610 -VSUBPHZrrbk 6611 -VSUBPHZrrbkz 6612 -VSUBPHZrrk 6613 -VSUBPHZrrkz 6614 -VSUBPSYrm 6615 -VSUBPSYrr 6616 -VSUBPSZ 6617 -VSUBPSZrm 6618 -VSUBPSZrmb 6619 -VSUBPSZrmbk 6620 -VSUBPSZrmbkz 6621 -VSUBPSZrmk 6622 -VSUBPSZrmkz 6623 -VSUBPSZrr 6624 -VSUBPSZrrb 6625 -VSUBPSZrrbk 6626 -VSUBPSZrrbkz 6627 -VSUBPSZrrk 6628 -VSUBPSZrrkz 6629 -VSUBPSrm 6630 -VSUBPSrr 6631 -VSUBSDZrm 6632 -VSUBSDZrm_Int 6633 -VSUBSDZrmk_Int 6634 -VSUBSDZrmkz_Int 6635 -VSUBSDZrr 6636 -VSUBSDZrr_Int 6637 -VSUBSDZrrb_Int 6638 -VSUBSDZrrbk_Int 6639 -VSUBSDZrrbkz_Int 6640 -VSUBSDZrrk_Int 6641 -VSUBSDZrrkz_Int 6642 -VSUBSDrm 6643 -VSUBSDrm_Int 6644 -VSUBSDrr 6645 -VSUBSDrr_Int 6646 -VSUBSHZrm 6647 -VSUBSHZrm_Int 6648 -VSUBSHZrmk_Int 6649 -VSUBSHZrmkz_Int 6650 -VSUBSHZrr 6651 -VSUBSHZrr_Int 6652 -VSUBSHZrrb_Int 6653 -VSUBSHZrrbk_Int 6654 -VSUBSHZrrbkz_Int 6655 -VSUBSHZrrk_Int 6656 -VSUBSHZrrkz_Int 6657 -VSUBSSZrm 6658 -VSUBSSZrm_Int 6659 -VSUBSSZrmk_Int 6660 -VSUBSSZrmkz_Int 6661 -VSUBSSZrr 6662 -VSUBSSZrr_Int 6663 -VSUBSSZrrb_Int 6664 -VSUBSSZrrbk_Int 6665 -VSUBSSZrrbkz_Int 6666 -VSUBSSZrrk_Int 6667 -VSUBSSZrrkz_Int 6668 -VSUBSSrm 6669 -VSUBSSrm_Int 6670 -VSUBSSrr 6671 -VSUBSSrr_Int 6672 -VTESTPDYrm 6673 -VTESTPDYrr 6674 -VTESTPDrm 6675 -VTESTPDrr 6676 -VTESTPSYrm 6677 -VTESTPSYrr 6678 -VTESTPSrm 6679 -VTESTPSrr 6680 -VUCOMISDZrm 6681 -VUCOMISDZrm_Int 6682 -VUCOMISDZrr 6683 -VUCOMISDZrr_Int 6684 -VUCOMISDZrrb 6685 -VUCOMISDrm 6686 -VUCOMISDrm_Int 6687 -VUCOMISDrr 6688 -VUCOMISDrr_Int 6689 -VUCOMISHZrm 6690 -VUCOMISHZrm_Int 6691 -VUCOMISHZrr 6692 -VUCOMISHZrr_Int 6693 -VUCOMISHZrrb 6694 -VUCOMISSZrm 6695 -VUCOMISSZrm_Int 6696 -VUCOMISSZrr 6697 -VUCOMISSZrr_Int 6698 -VUCOMISSZrrb 6699 -VUCOMISSrm 6700 -VUCOMISSrm_Int 6701 -VUCOMISSrr 6702 -VUCOMISSrr_Int 6703 -VUCOMXSDZrm 6704 -VUCOMXSDZrm_Int 6705 -VUCOMXSDZrr 6706 -VUCOMXSDZrr_Int 6707 -VUCOMXSDZrrb_Int 6708 -VUCOMXSHZrm 6709 -VUCOMXSHZrm_Int 6710 -VUCOMXSHZrr 6711 -VUCOMXSHZrr_Int 6712 -VUCOMXSHZrrb_Int 6713 -VUCOMXSSZrm 6714 -VUCOMXSSZrm_Int 6715 -VUCOMXSSZrr 6716 -VUCOMXSSZrr_Int 6717 -VUCOMXSSZrrb_Int 6718 -VUNPCKHPDYrm 6719 -VUNPCKHPDYrr 6720 -VUNPCKHPDZ 6721 -VUNPCKHPDZrm 6722 -VUNPCKHPDZrmb 6723 -VUNPCKHPDZrmbk 6724 -VUNPCKHPDZrmbkz 6725 -VUNPCKHPDZrmk 6726 -VUNPCKHPDZrmkz 6727 -VUNPCKHPDZrr 6728 -VUNPCKHPDZrrk 6729 -VUNPCKHPDZrrkz 6730 -VUNPCKHPDrm 6731 -VUNPCKHPDrr 6732 -VUNPCKHPSYrm 6733 -VUNPCKHPSYrr 6734 -VUNPCKHPSZ 6735 -VUNPCKHPSZrm 6736 -VUNPCKHPSZrmb 6737 -VUNPCKHPSZrmbk 6738 -VUNPCKHPSZrmbkz 6739 -VUNPCKHPSZrmk 6740 -VUNPCKHPSZrmkz 6741 -VUNPCKHPSZrr 6742 -VUNPCKHPSZrrk 6743 -VUNPCKHPSZrrkz 6744 -VUNPCKHPSrm 6745 -VUNPCKHPSrr 6746 -VUNPCKLPDYrm 6747 -VUNPCKLPDYrr 6748 -VUNPCKLPDZ 6749 -VUNPCKLPDZrm 6750 -VUNPCKLPDZrmb 6751 -VUNPCKLPDZrmbk 6752 -VUNPCKLPDZrmbkz 6753 -VUNPCKLPDZrmk 6754 -VUNPCKLPDZrmkz 6755 -VUNPCKLPDZrr 6756 -VUNPCKLPDZrrk 6757 -VUNPCKLPDZrrkz 6758 -VUNPCKLPDrm 6759 -VUNPCKLPDrr 6760 -VUNPCKLPSYrm 6761 -VUNPCKLPSYrr 6762 -VUNPCKLPSZ 6763 -VUNPCKLPSZrm 6764 -VUNPCKLPSZrmb 6765 -VUNPCKLPSZrmbk 6766 -VUNPCKLPSZrmbkz 6767 -VUNPCKLPSZrmk 6768 -VUNPCKLPSZrmkz 6769 -VUNPCKLPSZrr 6770 -VUNPCKLPSZrrk 6771 -VUNPCKLPSZrrkz 6772 -VUNPCKLPSrm 6773 -VUNPCKLPSrr 6774 -VXORPDYrm 6775 -VXORPDYrr 6776 -VXORPDZ 6777 -VXORPDZrm 6778 -VXORPDZrmb 6779 -VXORPDZrmbk 6780 -VXORPDZrmbkz 6781 -VXORPDZrmk 6782 -VXORPDZrmkz 6783 -VXORPDZrr 6784 -VXORPDZrrk 6785 -VXORPDZrrkz 6786 -VXORPDrm 6787 -VXORPDrr 6788 -VXORPSYrm 6789 -VXORPSYrr 6790 -VXORPSZ 6791 -VXORPSZrm 6792 -VXORPSZrmb 6793 -VXORPSZrmbk 6794 -VXORPSZrmbkz 6795 -VXORPSZrmk 6796 -VXORPSZrmkz 6797 -VXORPSZrr 6798 -VXORPSZrrk 6799 -VXORPSZrrkz 6800 -VXORPSrm 6801 -VXORPSrr 6802 -VZEROALL 6803 -VZEROUPPER 6804 -V_SET 6805 -V_SETALLONES 6806 -WAIT 6807 -WBINVD 6808 -WBNOINVD 6809 -WRFLAGS 6810 -WRFSBASE 6811 -WRGSBASE 6812 -WRMSR 6813 -WRMSRLIST 6814 -WRMSRNS 6815 -WRMSRNSir 6816 -WRMSRNSir_EVEX 6817 -WRPKRUr 6818 -WRSSD 6819 -WRSSD_EVEX 6820 -WRSSQ 6821 -WRSSQ_EVEX 6822 -WRUSSD 6823 -WRUSSD_EVEX 6824 -WRUSSQ 6825 -WRUSSQ_EVEX 6826 -XABORT 6827 -XABORT_DEF 6828 -XACQUIRE_PREFIX 6829 -XADD 6830 -XAM_F 6831 -XAM_Fp 6832 -XBEGIN 6833 -XCHG 6834 -XCH_F 6835 -XCRYPTCBC 6836 -XCRYPTCFB 6837 -XCRYPTCTR 6838 -XCRYPTECB 6839 -XCRYPTOFB 6840 -XEND 6841 -XGETBV 6842 -XLAT 6843 -XOR 6844 -XORPDrm 6845 -XORPDrr 6846 -XORPSrm 6847 -XORPSrr 6848 -XRELEASE_PREFIX 6849 -XRESLDTRK 6850 -XRSTOR 6851 -XRSTORS 6852 -XSAVE 6853 -XSAVEC 6854 -XSAVEOPT 6855 -XSAVES 6856 -XSETBV 6857 -XSHA 6858 -XSTORE 6859 -XSUSLDTRK 6860 -XTEST 6861 -Immediate 6862 -CImmediate 6863 -FPImmediate 6864 -MBB 6865 -FrameIndex 6866 -ConstantPoolIndex 6867 -TargetIndex 6868 -JumpTableIndex 6869 -ExternalSymbol 6870 -GlobalAddress 6871 -BlockAddress 6872 -RegisterMask 6873 -RegisterLiveOut 6874 -Metadata 6875 -MCSymbol 6876 -CFIIndex 6877 -IntrinsicID 6878 -Predicate 6879 -ShuffleMask 6880 -PhyReg_GR8 6881 -PhyReg_GRH8 6882 -PhyReg_GR8_NOREX2 6883 -PhyReg_GR8_NOREX 6884 -PhyReg_GR8_ABCD_H 6885 -PhyReg_GR8_ABCD_L 6886 -PhyReg_GRH16 6887 -PhyReg_GR16 6888 -PhyReg_GR16_NOREX2 6889 -PhyReg_GR16_NOREX 6890 -PhyReg_VK1 6891 -PhyReg_VK16 6892 -PhyReg_VK2 6893 -PhyReg_VK4 6894 -PhyReg_VK8 6895 -PhyReg_VK16WM 6896 -PhyReg_VK1WM 6897 -PhyReg_VK2WM 6898 -PhyReg_VK4WM 6899 -PhyReg_VK8WM 6900 -PhyReg_SEGMENT_REG 6901 -PhyReg_GR16_ABCD 6902 -PhyReg_FPCCR 6903 -PhyReg_FR16X 6904 -PhyReg_FR16 6905 -PhyReg_VK16PAIR 6906 -PhyReg_VK1PAIR 6907 -PhyReg_VK2PAIR 6908 -PhyReg_VK4PAIR 6909 -PhyReg_VK8PAIR 6910 -PhyReg_VK1PAIR_with_sub_mask_0_in_VK1WM 6911 -PhyReg_LOW32_ADDR_ACCESS_RBP 6912 -PhyReg_LOW32_ADDR_ACCESS 6913 -PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit 6914 -PhyReg_FR32X 6915 -PhyReg_GR32 6916 -PhyReg_GR32_NOSP 6917 -PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX2 6918 -PhyReg_DEBUG_REG 6919 -PhyReg_FR32 6920 -PhyReg_GR32_NOREX2 6921 -PhyReg_GR32_NOREX2_NOSP 6922 -PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX 6923 -PhyReg_GR32_NOREX 6924 -PhyReg_VK32 6925 -PhyReg_GR32_NOREX_NOSP 6926 -PhyReg_RFP32 6927 -PhyReg_VK32WM 6928 -PhyReg_GR32_ABCD 6929 -PhyReg_GR32_TC 6930 -PhyReg_GR32_ABCD_and_GR32_TC 6931 -PhyReg_GR32_AD 6932 -PhyReg_GR32_ArgRef 6933 -PhyReg_GR32_BPSP 6934 -PhyReg_GR32_BSI 6935 -PhyReg_GR32_CB 6936 -PhyReg_GR32_DC 6937 -PhyReg_GR32_DIBP 6938 -PhyReg_GR32_SIDI 6939 -PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_32bit 6940 -PhyReg_CCR 6941 -PhyReg_DFCCR 6942 -PhyReg_GR32_ABCD_and_GR32_BSI 6943 -PhyReg_GR32_AD_and_GR32_ArgRef 6944 -PhyReg_GR32_ArgRef_and_GR32_CB 6945 -PhyReg_GR32_BPSP_and_GR32_DIBP 6946 -PhyReg_GR32_BPSP_and_GR32_TC 6947 -PhyReg_GR32_BSI_and_GR32_SIDI 6948 -PhyReg_GR32_DIBP_and_GR32_SIDI 6949 -PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit_with_sub_32bit 6950 -PhyReg_LOW32_ADDR_ACCESS_with_sub_32bit 6951 -PhyReg_RFP64 6952 -PhyReg_GR64 6953 -PhyReg_FR64X 6954 -PhyReg_GR64_with_sub_8bit 6955 -PhyReg_GR64_NOSP 6956 -PhyReg_GR64_NOREX2 6957 -PhyReg_CONTROL_REG 6958 -PhyReg_FR64 6959 -PhyReg_GR64_with_sub_16bit_in_GR16_NOREX2 6960 -PhyReg_GR64_NOREX2_NOSP 6961 -PhyReg_GR64PLTSafe 6962 -PhyReg_GR64_TC 6963 -PhyReg_GR64_NOREX 6964 -PhyReg_GR64_TCW64 6965 -PhyReg_GR64_TC_with_sub_8bit 6966 -PhyReg_GR64_NOREX2_NOSP_and_GR64_TC 6967 -PhyReg_GR64_TCW64_with_sub_8bit 6968 -PhyReg_GR64_TC_and_GR64_TCW64 6969 -PhyReg_GR64_with_sub_16bit_in_GR16_NOREX 6970 -PhyReg_VK64 6971 -PhyReg_VR64 6972 -PhyReg_GR64PLTSafe_and_GR64_TC 6973 -PhyReg_GR64_NOREX2_NOSP_and_GR64_TCW64 6974 -PhyReg_GR64_NOREX_NOSP 6975 -PhyReg_GR64_NOREX_and_GR64_TC 6976 -PhyReg_GR64_TCW64_and_GR64_TC_with_sub_8bit 6977 -PhyReg_VK64WM 6978 -PhyReg_GR64_TC_and_GR64_NOREX2_NOSP_and_GR64_TCW64 6979 -PhyReg_GR64_TC_and_GR64_with_sub_16bit_in_GR16_NOREX 6980 -PhyReg_GR64PLTSafe_and_GR64_TCW64 6981 -PhyReg_GR64_NOREX_and_GR64PLTSafe_and_GR64_TC 6982 -PhyReg_GR64_NOREX_and_GR64_TCW64 6983 -PhyReg_GR64_ABCD 6984 -PhyReg_GR64_with_sub_32bit_in_GR32_TC 6985 -PhyReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_TC 6986 -PhyReg_GR64_AD 6987 -PhyReg_GR64_ArgRef 6988 -PhyReg_GR64_and_LOW32_ADDR_ACCESS_RBP 6989 -PhyReg_GR64_with_sub_32bit_in_GR32_ArgRef 6990 -PhyReg_GR64_with_sub_32bit_in_GR32_BPSP 6991 -PhyReg_GR64_with_sub_32bit_in_GR32_BSI 6992 -PhyReg_GR64_with_sub_32bit_in_GR32_CB 6993 -PhyReg_GR64_with_sub_32bit_in_GR32_DIBP 6994 -PhyReg_GR64_with_sub_32bit_in_GR32_SIDI 6995 -PhyReg_GR64_A 6996 -PhyReg_GR64_ArgRef_and_GR64_TC 6997 -PhyReg_GR64_and_LOW32_ADDR_ACCESS 6998 -PhyReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_BSI 6999 -PhyReg_GR64_with_sub_32bit_in_GR32_AD_and_GR32_ArgRef 7000 -PhyReg_GR64_with_sub_32bit_in_GR32_ArgRef_and_GR32_CB 7001 -PhyReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_DIBP 7002 -PhyReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_TC 7003 -PhyReg_GR64_with_sub_32bit_in_GR32_BSI_and_GR32_SIDI 7004 -PhyReg_GR64_with_sub_32bit_in_GR32_DIBP_and_GR32_SIDI 7005 -PhyReg_RST 7006 -PhyReg_RFP80 7007 -PhyReg_RFP80_7 7008 -PhyReg_VR128X 7009 -PhyReg_VR128 7010 -PhyReg_VR256X 7011 -PhyReg_VR256 7012 -PhyReg_VR512 7013 -PhyReg_VR512_0_15 7014 -PhyReg_TILE 7015 -VirtReg_GR8 7016 -VirtReg_GRH8 7017 -VirtReg_GR8_NOREX2 7018 -VirtReg_GR8_NOREX 7019 -VirtReg_GR8_ABCD_H 7020 -VirtReg_GR8_ABCD_L 7021 -VirtReg_GRH16 7022 -VirtReg_GR16 7023 -VirtReg_GR16_NOREX2 7024 -VirtReg_GR16_NOREX 7025 -VirtReg_VK1 7026 -VirtReg_VK16 7027 -VirtReg_VK2 7028 -VirtReg_VK4 7029 -VirtReg_VK8 7030 -VirtReg_VK16WM 7031 -VirtReg_VK1WM 7032 -VirtReg_VK2WM 7033 -VirtReg_VK4WM 7034 -VirtReg_VK8WM 7035 -VirtReg_SEGMENT_REG 7036 -VirtReg_GR16_ABCD 7037 -VirtReg_FPCCR 7038 -VirtReg_FR16X 7039 -VirtReg_FR16 7040 -VirtReg_VK16PAIR 7041 -VirtReg_VK1PAIR 7042 -VirtReg_VK2PAIR 7043 -VirtReg_VK4PAIR 7044 -VirtReg_VK8PAIR 7045 -VirtReg_VK1PAIR_with_sub_mask_0_in_VK1WM 7046 -VirtReg_LOW32_ADDR_ACCESS_RBP 7047 -VirtReg_LOW32_ADDR_ACCESS 7048 -VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit 7049 -VirtReg_FR32X 7050 -VirtReg_GR32 7051 -VirtReg_GR32_NOSP 7052 -VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX2 7053 -VirtReg_DEBUG_REG 7054 -VirtReg_FR32 7055 -VirtReg_GR32_NOREX2 7056 -VirtReg_GR32_NOREX2_NOSP 7057 -VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX 7058 -VirtReg_GR32_NOREX 7059 -VirtReg_VK32 7060 -VirtReg_GR32_NOREX_NOSP 7061 -VirtReg_RFP32 7062 -VirtReg_VK32WM 7063 -VirtReg_GR32_ABCD 7064 -VirtReg_GR32_TC 7065 -VirtReg_GR32_ABCD_and_GR32_TC 7066 -VirtReg_GR32_AD 7067 -VirtReg_GR32_ArgRef 7068 -VirtReg_GR32_BPSP 7069 -VirtReg_GR32_BSI 7070 -VirtReg_GR32_CB 7071 -VirtReg_GR32_DC 7072 -VirtReg_GR32_DIBP 7073 -VirtReg_GR32_SIDI 7074 -VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_32bit 7075 -VirtReg_CCR 7076 -VirtReg_DFCCR 7077 -VirtReg_GR32_ABCD_and_GR32_BSI 7078 -VirtReg_GR32_AD_and_GR32_ArgRef 7079 -VirtReg_GR32_ArgRef_and_GR32_CB 7080 -VirtReg_GR32_BPSP_and_GR32_DIBP 7081 -VirtReg_GR32_BPSP_and_GR32_TC 7082 -VirtReg_GR32_BSI_and_GR32_SIDI 7083 -VirtReg_GR32_DIBP_and_GR32_SIDI 7084 -VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit_with_sub_32bit 7085 -VirtReg_LOW32_ADDR_ACCESS_with_sub_32bit 7086 -VirtReg_RFP64 7087 -VirtReg_GR64 7088 -VirtReg_FR64X 7089 -VirtReg_GR64_with_sub_8bit 7090 -VirtReg_GR64_NOSP 7091 -VirtReg_GR64_NOREX2 7092 -VirtReg_CONTROL_REG 7093 -VirtReg_FR64 7094 -VirtReg_GR64_with_sub_16bit_in_GR16_NOREX2 7095 -VirtReg_GR64_NOREX2_NOSP 7096 -VirtReg_GR64PLTSafe 7097 -VirtReg_GR64_TC 7098 -VirtReg_GR64_NOREX 7099 -VirtReg_GR64_TCW64 7100 -VirtReg_GR64_TC_with_sub_8bit 7101 -VirtReg_GR64_NOREX2_NOSP_and_GR64_TC 7102 -VirtReg_GR64_TCW64_with_sub_8bit 7103 -VirtReg_GR64_TC_and_GR64_TCW64 7104 -VirtReg_GR64_with_sub_16bit_in_GR16_NOREX 7105 -VirtReg_VK64 7106 -VirtReg_VR64 7107 -VirtReg_GR64PLTSafe_and_GR64_TC 7108 -VirtReg_GR64_NOREX2_NOSP_and_GR64_TCW64 7109 -VirtReg_GR64_NOREX_NOSP 7110 -VirtReg_GR64_NOREX_and_GR64_TC 7111 -VirtReg_GR64_TCW64_and_GR64_TC_with_sub_8bit 7112 -VirtReg_VK64WM 7113 -VirtReg_GR64_TC_and_GR64_NOREX2_NOSP_and_GR64_TCW64 7114 -VirtReg_GR64_TC_and_GR64_with_sub_16bit_in_GR16_NOREX 7115 -VirtReg_GR64PLTSafe_and_GR64_TCW64 7116 -VirtReg_GR64_NOREX_and_GR64PLTSafe_and_GR64_TC 7117 -VirtReg_GR64_NOREX_and_GR64_TCW64 7118 -VirtReg_GR64_ABCD 7119 -VirtReg_GR64_with_sub_32bit_in_GR32_TC 7120 -VirtReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_TC 7121 -VirtReg_GR64_AD 7122 -VirtReg_GR64_ArgRef 7123 -VirtReg_GR64_and_LOW32_ADDR_ACCESS_RBP 7124 -VirtReg_GR64_with_sub_32bit_in_GR32_ArgRef 7125 -VirtReg_GR64_with_sub_32bit_in_GR32_BPSP 7126 -VirtReg_GR64_with_sub_32bit_in_GR32_BSI 7127 -VirtReg_GR64_with_sub_32bit_in_GR32_CB 7128 -VirtReg_GR64_with_sub_32bit_in_GR32_DIBP 7129 -VirtReg_GR64_with_sub_32bit_in_GR32_SIDI 7130 -VirtReg_GR64_A 7131 -VirtReg_GR64_ArgRef_and_GR64_TC 7132 -VirtReg_GR64_and_LOW32_ADDR_ACCESS 7133 -VirtReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_BSI 7134 -VirtReg_GR64_with_sub_32bit_in_GR32_AD_and_GR32_ArgRef 7135 -VirtReg_GR64_with_sub_32bit_in_GR32_ArgRef_and_GR32_CB 7136 -VirtReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_DIBP 7137 -VirtReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_TC 7138 -VirtReg_GR64_with_sub_32bit_in_GR32_BSI_and_GR32_SIDI 7139 -VirtReg_GR64_with_sub_32bit_in_GR32_DIBP_and_GR32_SIDI 7140 -VirtReg_RST 7141 -VirtReg_RFP80 7142 -VirtReg_RFP80_7 7143 -VirtReg_VR128X 7144 -VirtReg_VR128 7145 -VirtReg_VR256X 7146 -VirtReg_VR256 7147 -VirtReg_VR512 7148 -VirtReg_VR512_0_15 7149 -VirtReg_TILE 7150 +RELOC_NONE 1533 +REPNE_PREFIX 1534 +REP_MOVSB 1535 +REP_MOVSD 1536 +REP_MOVSQ 1537 +REP_MOVSW 1538 +REP_PREFIX 1539 +REP_STOSB 1540 +REP_STOSD 1541 +REP_STOSQ 1542 +REP_STOSW 1543 +RET 1544 +RETI 1545 +REX 1546 +RMPADJUST 1547 +RMPQUERY 1548 +RMPUPDATE 1549 +ROL 1550 +ROR 1551 +RORX 1552 +ROUNDPDmi 1553 +ROUNDPDri 1554 +ROUNDPSmi 1555 +ROUNDPSri 1556 +ROUNDSDmi 1557 +ROUNDSDmi_Int 1558 +ROUNDSDri 1559 +ROUNDSDri_Int 1560 +ROUNDSSmi 1561 +ROUNDSSmi_Int 1562 +ROUNDSSri 1563 +ROUNDSSri_Int 1564 +RSM 1565 +RSQRTPSm 1566 +RSQRTPSr 1567 +RSQRTSSm 1568 +RSQRTSSm_Int 1569 +RSQRTSSr 1570 +RSQRTSSr_Int 1571 +RSTORSSP 1572 +SAHF 1573 +SALC 1574 +SAR 1575 +SARX 1576 +SAVEPREVSSP 1577 +SBB 1578 +SCASB 1579 +SCASL 1580 +SCASQ 1581 +SCASW 1582 +SEAMCALL 1583 +SEAMOPS 1584 +SEAMRET 1585 +SEG_ALLOCA 1586 +SEH_BeginEpilogue 1587 +SEH_EndEpilogue 1588 +SEH_EndPrologue 1589 +SEH_PushFrame 1590 +SEH_PushReg 1591 +SEH_SaveReg 1592 +SEH_SaveXMM 1593 +SEH_SetFrame 1594 +SEH_StackAlign 1595 +SEH_StackAlloc 1596 +SEH_UnwindV 1597 +SEH_UnwindVersion 1598 +SENDUIPI 1599 +SERIALIZE 1600 +SETB_C 1601 +SETCCm 1602 +SETCCm_EVEX 1603 +SETCCr 1604 +SETCCr_EVEX 1605 +SETSSBSY 1606 +SETZUCCm 1607 +SETZUCCr 1608 +SFENCE 1609 +SGDT 1610 +SHA 1611 +SHL 1612 +SHLD 1613 +SHLDROT 1614 +SHLX 1615 +SHR 1616 +SHRD 1617 +SHRDROT 1618 +SHRX 1619 +SHUFPDrmi 1620 +SHUFPDrri 1621 +SHUFPSrmi 1622 +SHUFPSrri 1623 +SIDT 1624 +SKINIT 1625 +SLDT 1626 +SLWPCB 1627 +SMSW 1628 +SQRTPDm 1629 +SQRTPDr 1630 +SQRTPSm 1631 +SQRTPSr 1632 +SQRTSDm 1633 +SQRTSDm_Int 1634 +SQRTSDr 1635 +SQRTSDr_Int 1636 +SQRTSSm 1637 +SQRTSSm_Int 1638 +SQRTSSr 1639 +SQRTSSr_Int 1640 +SQRT_F 1641 +SQRT_Fp 1642 +SS_PREFIX 1643 +STAC 1644 +STACKALLOC_W_PROBING 1645 +STACKMAP 1646 +STATEPOINT 1647 +STC 1648 +STD 1649 +STGI 1650 +STI 1651 +STMXCSR 1652 +STOSB 1653 +STOSL 1654 +STOSQ 1655 +STOSW 1656 +STR 1657 +STRm 1658 +STTILECFG 1659 +STTILECFG_EVEX 1660 +STUI 1661 +ST_F 1662 +ST_FP 1663 +ST_FPrr 1664 +ST_Fp 1665 +ST_FpP 1666 +ST_Frr 1667 +SUB 1668 +SUBPDrm 1669 +SUBPDrr 1670 +SUBPSrm 1671 +SUBPSrr 1672 +SUBREG_TO_REG 1673 +SUBR_F 1674 +SUBR_FI 1675 +SUBR_FPrST 1676 +SUBR_FST 1677 +SUBR_Fp 1678 +SUBR_FpI 1679 +SUBR_FrST 1680 +SUBSDrm 1681 +SUBSDrm_Int 1682 +SUBSDrr 1683 +SUBSDrr_Int 1684 +SUBSSrm 1685 +SUBSSrm_Int 1686 +SUBSSrr 1687 +SUBSSrr_Int 1688 +SUB_F 1689 +SUB_FI 1690 +SUB_FPrST 1691 +SUB_FST 1692 +SUB_Fp 1693 +SUB_FpI 1694 +SUB_FrST 1695 +SWAPGS 1696 +SYSCALL 1697 +SYSENTER 1698 +SYSEXIT 1699 +SYSRET 1700 +T 1701 +TAILJMPd 1702 +TAILJMPd_CC 1703 +TAILJMPm 1704 +TAILJMPr 1705 +TCMMIMFP 1706 +TCMMRLFP 1707 +TCRETURN_HIPE 1708 +TCRETURN_WIN 1709 +TCRETURN_WINmi 1710 +TCRETURNdi 1711 +TCRETURNdicc 1712 +TCRETURNmi 1713 +TCRETURNri 1714 +TCVTROWD 1715 +TCVTROWPS 1716 +TDCALL 1717 +TDPBF 1718 +TDPBHF 1719 +TDPBSSD 1720 +TDPBSUD 1721 +TDPBUSD 1722 +TDPBUUD 1723 +TDPFP 1724 +TDPHBF 1725 +TDPHF 1726 +TEST 1727 +TESTUI 1728 +TILELOADD 1729 +TILELOADDRS 1730 +TILELOADDRST 1731 +TILELOADDRS_EVEX 1732 +TILELOADDT 1733 +TILELOADD_EVEX 1734 +TILEMOVROWrre 1735 +TILEMOVROWrri 1736 +TILERELEASE 1737 +TILESTORED 1738 +TILESTORED_EVEX 1739 +TILEZERO 1740 +TLBSYNC 1741 +TLSCall 1742 +TLS_addr 1743 +TLS_addrX 1744 +TLS_base_addr 1745 +TLS_base_addrX 1746 +TLS_desc 1747 +TMMULTF 1748 +TPAUSE 1749 +TRAP 1750 +TST_F 1751 +TST_Fp 1752 +TZCNT 1753 +TZMSK 1754 +UBSAN_UD 1755 +UCOMISDrm 1756 +UCOMISDrm_Int 1757 +UCOMISDrr 1758 +UCOMISDrr_Int 1759 +UCOMISSrm 1760 +UCOMISSrm_Int 1761 +UCOMISSrr 1762 +UCOMISSrr_Int 1763 +UCOM_FIPr 1764 +UCOM_FIr 1765 +UCOM_FPPr 1766 +UCOM_FPr 1767 +UCOM_FpIr 1768 +UCOM_Fpr 1769 +UCOM_Fr 1770 +UD 1771 +UIRET 1772 +UMONITOR 1773 +UMWAIT 1774 +UNPCKHPDrm 1775 +UNPCKHPDrr 1776 +UNPCKHPSrm 1777 +UNPCKHPSrr 1778 +UNPCKLPDrm 1779 +UNPCKLPDrr 1780 +UNPCKLPSrm 1781 +UNPCKLPSrr 1782 +URDMSRri 1783 +URDMSRri_EVEX 1784 +URDMSRrr 1785 +URDMSRrr_EVEX 1786 +UWRMSRir 1787 +UWRMSRir_EVEX 1788 +UWRMSRrr 1789 +UWRMSRrr_EVEX 1790 +V 1791 +VAARG 1792 +VAARG_X 1793 +VADDBF 1794 +VADDPDYrm 1795 +VADDPDYrr 1796 +VADDPDZ 1797 +VADDPDZrm 1798 +VADDPDZrmb 1799 +VADDPDZrmbk 1800 +VADDPDZrmbkz 1801 +VADDPDZrmk 1802 +VADDPDZrmkz 1803 +VADDPDZrr 1804 +VADDPDZrrb 1805 +VADDPDZrrbk 1806 +VADDPDZrrbkz 1807 +VADDPDZrrk 1808 +VADDPDZrrkz 1809 +VADDPDrm 1810 +VADDPDrr 1811 +VADDPHZ 1812 +VADDPHZrm 1813 +VADDPHZrmb 1814 +VADDPHZrmbk 1815 +VADDPHZrmbkz 1816 +VADDPHZrmk 1817 +VADDPHZrmkz 1818 +VADDPHZrr 1819 +VADDPHZrrb 1820 +VADDPHZrrbk 1821 +VADDPHZrrbkz 1822 +VADDPHZrrk 1823 +VADDPHZrrkz 1824 +VADDPSYrm 1825 +VADDPSYrr 1826 +VADDPSZ 1827 +VADDPSZrm 1828 +VADDPSZrmb 1829 +VADDPSZrmbk 1830 +VADDPSZrmbkz 1831 +VADDPSZrmk 1832 +VADDPSZrmkz 1833 +VADDPSZrr 1834 +VADDPSZrrb 1835 +VADDPSZrrbk 1836 +VADDPSZrrbkz 1837 +VADDPSZrrk 1838 +VADDPSZrrkz 1839 +VADDPSrm 1840 +VADDPSrr 1841 +VADDSDZrm 1842 +VADDSDZrm_Int 1843 +VADDSDZrmk_Int 1844 +VADDSDZrmkz_Int 1845 +VADDSDZrr 1846 +VADDSDZrr_Int 1847 +VADDSDZrrb_Int 1848 +VADDSDZrrbk_Int 1849 +VADDSDZrrbkz_Int 1850 +VADDSDZrrk_Int 1851 +VADDSDZrrkz_Int 1852 +VADDSDrm 1853 +VADDSDrm_Int 1854 +VADDSDrr 1855 +VADDSDrr_Int 1856 +VADDSHZrm 1857 +VADDSHZrm_Int 1858 +VADDSHZrmk_Int 1859 +VADDSHZrmkz_Int 1860 +VADDSHZrr 1861 +VADDSHZrr_Int 1862 +VADDSHZrrb_Int 1863 +VADDSHZrrbk_Int 1864 +VADDSHZrrbkz_Int 1865 +VADDSHZrrk_Int 1866 +VADDSHZrrkz_Int 1867 +VADDSSZrm 1868 +VADDSSZrm_Int 1869 +VADDSSZrmk_Int 1870 +VADDSSZrmkz_Int 1871 +VADDSSZrr 1872 +VADDSSZrr_Int 1873 +VADDSSZrrb_Int 1874 +VADDSSZrrbk_Int 1875 +VADDSSZrrbkz_Int 1876 +VADDSSZrrk_Int 1877 +VADDSSZrrkz_Int 1878 +VADDSSrm 1879 +VADDSSrm_Int 1880 +VADDSSrr 1881 +VADDSSrr_Int 1882 +VADDSUBPDYrm 1883 +VADDSUBPDYrr 1884 +VADDSUBPDrm 1885 +VADDSUBPDrr 1886 +VADDSUBPSYrm 1887 +VADDSUBPSYrr 1888 +VADDSUBPSrm 1889 +VADDSUBPSrr 1890 +VAESDECLASTYrm 1891 +VAESDECLASTYrr 1892 +VAESDECLASTZ 1893 +VAESDECLASTZrm 1894 +VAESDECLASTZrr 1895 +VAESDECLASTrm 1896 +VAESDECLASTrr 1897 +VAESDECYrm 1898 +VAESDECYrr 1899 +VAESDECZ 1900 +VAESDECZrm 1901 +VAESDECZrr 1902 +VAESDECrm 1903 +VAESDECrr 1904 +VAESENCLASTYrm 1905 +VAESENCLASTYrr 1906 +VAESENCLASTZ 1907 +VAESENCLASTZrm 1908 +VAESENCLASTZrr 1909 +VAESENCLASTrm 1910 +VAESENCLASTrr 1911 +VAESENCYrm 1912 +VAESENCYrr 1913 +VAESENCZ 1914 +VAESENCZrm 1915 +VAESENCZrr 1916 +VAESENCrm 1917 +VAESENCrr 1918 +VAESIMCrm 1919 +VAESIMCrr 1920 +VAESKEYGENASSISTrmi 1921 +VAESKEYGENASSISTrri 1922 +VALIGNDZ 1923 +VALIGNDZrmbi 1924 +VALIGNDZrmbik 1925 +VALIGNDZrmbikz 1926 +VALIGNDZrmi 1927 +VALIGNDZrmik 1928 +VALIGNDZrmikz 1929 +VALIGNDZrri 1930 +VALIGNDZrrik 1931 +VALIGNDZrrikz 1932 +VALIGNQZ 1933 +VALIGNQZrmbi 1934 +VALIGNQZrmbik 1935 +VALIGNQZrmbikz 1936 +VALIGNQZrmi 1937 +VALIGNQZrmik 1938 +VALIGNQZrmikz 1939 +VALIGNQZrri 1940 +VALIGNQZrrik 1941 +VALIGNQZrrikz 1942 +VANDNPDYrm 1943 +VANDNPDYrr 1944 +VANDNPDZ 1945 +VANDNPDZrm 1946 +VANDNPDZrmb 1947 +VANDNPDZrmbk 1948 +VANDNPDZrmbkz 1949 +VANDNPDZrmk 1950 +VANDNPDZrmkz 1951 +VANDNPDZrr 1952 +VANDNPDZrrk 1953 +VANDNPDZrrkz 1954 +VANDNPDrm 1955 +VANDNPDrr 1956 +VANDNPSYrm 1957 +VANDNPSYrr 1958 +VANDNPSZ 1959 +VANDNPSZrm 1960 +VANDNPSZrmb 1961 +VANDNPSZrmbk 1962 +VANDNPSZrmbkz 1963 +VANDNPSZrmk 1964 +VANDNPSZrmkz 1965 +VANDNPSZrr 1966 +VANDNPSZrrk 1967 +VANDNPSZrrkz 1968 +VANDNPSrm 1969 +VANDNPSrr 1970 +VANDPDYrm 1971 +VANDPDYrr 1972 +VANDPDZ 1973 +VANDPDZrm 1974 +VANDPDZrmb 1975 +VANDPDZrmbk 1976 +VANDPDZrmbkz 1977 +VANDPDZrmk 1978 +VANDPDZrmkz 1979 +VANDPDZrr 1980 +VANDPDZrrk 1981 +VANDPDZrrkz 1982 +VANDPDrm 1983 +VANDPDrr 1984 +VANDPSYrm 1985 +VANDPSYrr 1986 +VANDPSZ 1987 +VANDPSZrm 1988 +VANDPSZrmb 1989 +VANDPSZrmbk 1990 +VANDPSZrmbkz 1991 +VANDPSZrmk 1992 +VANDPSZrmkz 1993 +VANDPSZrr 1994 +VANDPSZrrk 1995 +VANDPSZrrkz 1996 +VANDPSrm 1997 +VANDPSrr 1998 +VASTART_SAVE_XMM_REGS 1999 +VBCSTNEBF 2000 +VBCSTNESH 2001 +VBLENDMPDZ 2002 +VBLENDMPDZrm 2003 +VBLENDMPDZrmb 2004 +VBLENDMPDZrmbk 2005 +VBLENDMPDZrmbkz 2006 +VBLENDMPDZrmk 2007 +VBLENDMPDZrmkz 2008 +VBLENDMPDZrr 2009 +VBLENDMPDZrrk 2010 +VBLENDMPDZrrkz 2011 +VBLENDMPSZ 2012 +VBLENDMPSZrm 2013 +VBLENDMPSZrmb 2014 +VBLENDMPSZrmbk 2015 +VBLENDMPSZrmbkz 2016 +VBLENDMPSZrmk 2017 +VBLENDMPSZrmkz 2018 +VBLENDMPSZrr 2019 +VBLENDMPSZrrk 2020 +VBLENDMPSZrrkz 2021 +VBLENDPDYrmi 2022 +VBLENDPDYrri 2023 +VBLENDPDrmi 2024 +VBLENDPDrri 2025 +VBLENDPSYrmi 2026 +VBLENDPSYrri 2027 +VBLENDPSrmi 2028 +VBLENDPSrri 2029 +VBLENDVPDYrmr 2030 +VBLENDVPDYrrr 2031 +VBLENDVPDrmr 2032 +VBLENDVPDrrr 2033 +VBLENDVPSYrmr 2034 +VBLENDVPSYrrr 2035 +VBLENDVPSrmr 2036 +VBLENDVPSrrr 2037 +VBROADCASTF 2038 +VBROADCASTI 2039 +VBROADCASTSDYrm 2040 +VBROADCASTSDYrr 2041 +VBROADCASTSDZ 2042 +VBROADCASTSDZrm 2043 +VBROADCASTSDZrmk 2044 +VBROADCASTSDZrmkz 2045 +VBROADCASTSDZrr 2046 +VBROADCASTSDZrrk 2047 +VBROADCASTSDZrrkz 2048 +VBROADCASTSSYrm 2049 +VBROADCASTSSYrr 2050 +VBROADCASTSSZ 2051 +VBROADCASTSSZrm 2052 +VBROADCASTSSZrmk 2053 +VBROADCASTSSZrmkz 2054 +VBROADCASTSSZrr 2055 +VBROADCASTSSZrrk 2056 +VBROADCASTSSZrrkz 2057 +VBROADCASTSSrm 2058 +VBROADCASTSSrr 2059 +VCMPBF 2060 +VCMPPDYrmi 2061 +VCMPPDYrri 2062 +VCMPPDZ 2063 +VCMPPDZrmbi 2064 +VCMPPDZrmbik 2065 +VCMPPDZrmi 2066 +VCMPPDZrmik 2067 +VCMPPDZrri 2068 +VCMPPDZrrib 2069 +VCMPPDZrribk 2070 +VCMPPDZrrik 2071 +VCMPPDrmi 2072 +VCMPPDrri 2073 +VCMPPHZ 2074 +VCMPPHZrmbi 2075 +VCMPPHZrmbik 2076 +VCMPPHZrmi 2077 +VCMPPHZrmik 2078 +VCMPPHZrri 2079 +VCMPPHZrrib 2080 +VCMPPHZrribk 2081 +VCMPPHZrrik 2082 +VCMPPSYrmi 2083 +VCMPPSYrri 2084 +VCMPPSZ 2085 +VCMPPSZrmbi 2086 +VCMPPSZrmbik 2087 +VCMPPSZrmi 2088 +VCMPPSZrmik 2089 +VCMPPSZrri 2090 +VCMPPSZrrib 2091 +VCMPPSZrribk 2092 +VCMPPSZrrik 2093 +VCMPPSrmi 2094 +VCMPPSrri 2095 +VCMPSDZrmi 2096 +VCMPSDZrmi_Int 2097 +VCMPSDZrmik_Int 2098 +VCMPSDZrri 2099 +VCMPSDZrri_Int 2100 +VCMPSDZrrib_Int 2101 +VCMPSDZrribk_Int 2102 +VCMPSDZrrik_Int 2103 +VCMPSDrmi 2104 +VCMPSDrmi_Int 2105 +VCMPSDrri 2106 +VCMPSDrri_Int 2107 +VCMPSHZrmi 2108 +VCMPSHZrmi_Int 2109 +VCMPSHZrmik_Int 2110 +VCMPSHZrri 2111 +VCMPSHZrri_Int 2112 +VCMPSHZrrib_Int 2113 +VCMPSHZrribk_Int 2114 +VCMPSHZrrik_Int 2115 +VCMPSSZrmi 2116 +VCMPSSZrmi_Int 2117 +VCMPSSZrmik_Int 2118 +VCMPSSZrri 2119 +VCMPSSZrri_Int 2120 +VCMPSSZrrib_Int 2121 +VCMPSSZrribk_Int 2122 +VCMPSSZrrik_Int 2123 +VCMPSSrmi 2124 +VCMPSSrmi_Int 2125 +VCMPSSrri 2126 +VCMPSSrri_Int 2127 +VCOMISBF 2128 +VCOMISDZrm 2129 +VCOMISDZrm_Int 2130 +VCOMISDZrr 2131 +VCOMISDZrr_Int 2132 +VCOMISDZrrb 2133 +VCOMISDrm 2134 +VCOMISDrm_Int 2135 +VCOMISDrr 2136 +VCOMISDrr_Int 2137 +VCOMISHZrm 2138 +VCOMISHZrm_Int 2139 +VCOMISHZrr 2140 +VCOMISHZrr_Int 2141 +VCOMISHZrrb 2142 +VCOMISSZrm 2143 +VCOMISSZrm_Int 2144 +VCOMISSZrr 2145 +VCOMISSZrr_Int 2146 +VCOMISSZrrb 2147 +VCOMISSrm 2148 +VCOMISSrm_Int 2149 +VCOMISSrr 2150 +VCOMISSrr_Int 2151 +VCOMPRESSPDZ 2152 +VCOMPRESSPDZmr 2153 +VCOMPRESSPDZmrk 2154 +VCOMPRESSPDZrr 2155 +VCOMPRESSPDZrrk 2156 +VCOMPRESSPDZrrkz 2157 +VCOMPRESSPSZ 2158 +VCOMPRESSPSZmr 2159 +VCOMPRESSPSZmrk 2160 +VCOMPRESSPSZrr 2161 +VCOMPRESSPSZrrk 2162 +VCOMPRESSPSZrrkz 2163 +VCOMXSDZrm_Int 2164 +VCOMXSDZrr_Int 2165 +VCOMXSDZrrb_Int 2166 +VCOMXSHZrm_Int 2167 +VCOMXSHZrr_Int 2168 +VCOMXSHZrrb_Int 2169 +VCOMXSSZrm_Int 2170 +VCOMXSSZrr_Int 2171 +VCOMXSSZrrb_Int 2172 +VCVT 2173 +VCVTBF 2174 +VCVTBIASPH 2175 +VCVTDQ 2176 +VCVTHF 2177 +VCVTNE 2178 +VCVTNEEBF 2179 +VCVTNEEPH 2180 +VCVTNEOBF 2181 +VCVTNEOPH 2182 +VCVTNEPS 2183 +VCVTPD 2184 +VCVTPH 2185 +VCVTPS 2186 +VCVTQQ 2187 +VCVTSD 2188 +VCVTSH 2189 +VCVTSI 2190 +VCVTSS 2191 +VCVTTBF 2192 +VCVTTPD 2193 +VCVTTPH 2194 +VCVTTPS 2195 +VCVTTSD 2196 +VCVTTSH 2197 +VCVTTSS 2198 +VCVTUDQ 2199 +VCVTUQQ 2200 +VCVTUSI 2201 +VCVTUW 2202 +VCVTW 2203 +VDBPSADBWZ 2204 +VDBPSADBWZrmi 2205 +VDBPSADBWZrmik 2206 +VDBPSADBWZrmikz 2207 +VDBPSADBWZrri 2208 +VDBPSADBWZrrik 2209 +VDBPSADBWZrrikz 2210 +VDIVBF 2211 +VDIVPDYrm 2212 +VDIVPDYrr 2213 +VDIVPDZ 2214 +VDIVPDZrm 2215 +VDIVPDZrmb 2216 +VDIVPDZrmbk 2217 +VDIVPDZrmbkz 2218 +VDIVPDZrmk 2219 +VDIVPDZrmkz 2220 +VDIVPDZrr 2221 +VDIVPDZrrb 2222 +VDIVPDZrrbk 2223 +VDIVPDZrrbkz 2224 +VDIVPDZrrk 2225 +VDIVPDZrrkz 2226 +VDIVPDrm 2227 +VDIVPDrr 2228 +VDIVPHZ 2229 +VDIVPHZrm 2230 +VDIVPHZrmb 2231 +VDIVPHZrmbk 2232 +VDIVPHZrmbkz 2233 +VDIVPHZrmk 2234 +VDIVPHZrmkz 2235 +VDIVPHZrr 2236 +VDIVPHZrrb 2237 +VDIVPHZrrbk 2238 +VDIVPHZrrbkz 2239 +VDIVPHZrrk 2240 +VDIVPHZrrkz 2241 +VDIVPSYrm 2242 +VDIVPSYrr 2243 +VDIVPSZ 2244 +VDIVPSZrm 2245 +VDIVPSZrmb 2246 +VDIVPSZrmbk 2247 +VDIVPSZrmbkz 2248 +VDIVPSZrmk 2249 +VDIVPSZrmkz 2250 +VDIVPSZrr 2251 +VDIVPSZrrb 2252 +VDIVPSZrrbk 2253 +VDIVPSZrrbkz 2254 +VDIVPSZrrk 2255 +VDIVPSZrrkz 2256 +VDIVPSrm 2257 +VDIVPSrr 2258 +VDIVSDZrm 2259 +VDIVSDZrm_Int 2260 +VDIVSDZrmk_Int 2261 +VDIVSDZrmkz_Int 2262 +VDIVSDZrr 2263 +VDIVSDZrr_Int 2264 +VDIVSDZrrb_Int 2265 +VDIVSDZrrbk_Int 2266 +VDIVSDZrrbkz_Int 2267 +VDIVSDZrrk_Int 2268 +VDIVSDZrrkz_Int 2269 +VDIVSDrm 2270 +VDIVSDrm_Int 2271 +VDIVSDrr 2272 +VDIVSDrr_Int 2273 +VDIVSHZrm 2274 +VDIVSHZrm_Int 2275 +VDIVSHZrmk_Int 2276 +VDIVSHZrmkz_Int 2277 +VDIVSHZrr 2278 +VDIVSHZrr_Int 2279 +VDIVSHZrrb_Int 2280 +VDIVSHZrrbk_Int 2281 +VDIVSHZrrbkz_Int 2282 +VDIVSHZrrk_Int 2283 +VDIVSHZrrkz_Int 2284 +VDIVSSZrm 2285 +VDIVSSZrm_Int 2286 +VDIVSSZrmk_Int 2287 +VDIVSSZrmkz_Int 2288 +VDIVSSZrr 2289 +VDIVSSZrr_Int 2290 +VDIVSSZrrb_Int 2291 +VDIVSSZrrbk_Int 2292 +VDIVSSZrrbkz_Int 2293 +VDIVSSZrrk_Int 2294 +VDIVSSZrrkz_Int 2295 +VDIVSSrm 2296 +VDIVSSrm_Int 2297 +VDIVSSrr 2298 +VDIVSSrr_Int 2299 +VDPBF 2300 +VDPPDrmi 2301 +VDPPDrri 2302 +VDPPHPSZ 2303 +VDPPHPSZm 2304 +VDPPHPSZmb 2305 +VDPPHPSZmbk 2306 +VDPPHPSZmbkz 2307 +VDPPHPSZmk 2308 +VDPPHPSZmkz 2309 +VDPPHPSZr 2310 +VDPPHPSZrk 2311 +VDPPHPSZrkz 2312 +VDPPSYrmi 2313 +VDPPSYrri 2314 +VDPPSrmi 2315 +VDPPSrri 2316 +VERRm 2317 +VERRr 2318 +VERWm 2319 +VERWr 2320 +VEXP 2321 +VEXPANDPDZ 2322 +VEXPANDPDZrm 2323 +VEXPANDPDZrmk 2324 +VEXPANDPDZrmkz 2325 +VEXPANDPDZrr 2326 +VEXPANDPDZrrk 2327 +VEXPANDPDZrrkz 2328 +VEXPANDPSZ 2329 +VEXPANDPSZrm 2330 +VEXPANDPSZrmk 2331 +VEXPANDPSZrmkz 2332 +VEXPANDPSZrr 2333 +VEXPANDPSZrrk 2334 +VEXPANDPSZrrkz 2335 +VEXTRACTF 2336 +VEXTRACTI 2337 +VEXTRACTPSZmri 2338 +VEXTRACTPSZrri 2339 +VEXTRACTPSmri 2340 +VEXTRACTPSrri 2341 +VFCMADDCPHZ 2342 +VFCMADDCPHZm 2343 +VFCMADDCPHZmb 2344 +VFCMADDCPHZmbk 2345 +VFCMADDCPHZmbkz 2346 +VFCMADDCPHZmk 2347 +VFCMADDCPHZmkz 2348 +VFCMADDCPHZr 2349 +VFCMADDCPHZrb 2350 +VFCMADDCPHZrbk 2351 +VFCMADDCPHZrbkz 2352 +VFCMADDCPHZrk 2353 +VFCMADDCPHZrkz 2354 +VFCMADDCSHZm 2355 +VFCMADDCSHZmk 2356 +VFCMADDCSHZmkz 2357 +VFCMADDCSHZr 2358 +VFCMADDCSHZrb 2359 +VFCMADDCSHZrbk 2360 +VFCMADDCSHZrbkz 2361 +VFCMADDCSHZrk 2362 +VFCMADDCSHZrkz 2363 +VFCMULCPHZ 2364 +VFCMULCPHZrm 2365 +VFCMULCPHZrmb 2366 +VFCMULCPHZrmbk 2367 +VFCMULCPHZrmbkz 2368 +VFCMULCPHZrmk 2369 +VFCMULCPHZrmkz 2370 +VFCMULCPHZrr 2371 +VFCMULCPHZrrb 2372 +VFCMULCPHZrrbk 2373 +VFCMULCPHZrrbkz 2374 +VFCMULCPHZrrk 2375 +VFCMULCPHZrrkz 2376 +VFCMULCSHZrm 2377 +VFCMULCSHZrmk 2378 +VFCMULCSHZrmkz 2379 +VFCMULCSHZrr 2380 +VFCMULCSHZrrb 2381 +VFCMULCSHZrrbk 2382 +VFCMULCSHZrrbkz 2383 +VFCMULCSHZrrk 2384 +VFCMULCSHZrrkz 2385 +VFIXUPIMMPDZ 2386 +VFIXUPIMMPDZrmbi 2387 +VFIXUPIMMPDZrmbik 2388 +VFIXUPIMMPDZrmbikz 2389 +VFIXUPIMMPDZrmi 2390 +VFIXUPIMMPDZrmik 2391 +VFIXUPIMMPDZrmikz 2392 +VFIXUPIMMPDZrri 2393 +VFIXUPIMMPDZrrib 2394 +VFIXUPIMMPDZrribk 2395 +VFIXUPIMMPDZrribkz 2396 +VFIXUPIMMPDZrrik 2397 +VFIXUPIMMPDZrrikz 2398 +VFIXUPIMMPSZ 2399 +VFIXUPIMMPSZrmbi 2400 +VFIXUPIMMPSZrmbik 2401 +VFIXUPIMMPSZrmbikz 2402 +VFIXUPIMMPSZrmi 2403 +VFIXUPIMMPSZrmik 2404 +VFIXUPIMMPSZrmikz 2405 +VFIXUPIMMPSZrri 2406 +VFIXUPIMMPSZrrib 2407 +VFIXUPIMMPSZrribk 2408 +VFIXUPIMMPSZrribkz 2409 +VFIXUPIMMPSZrrik 2410 +VFIXUPIMMPSZrrikz 2411 +VFIXUPIMMSDZrmi 2412 +VFIXUPIMMSDZrmik 2413 +VFIXUPIMMSDZrmikz 2414 +VFIXUPIMMSDZrri 2415 +VFIXUPIMMSDZrrib 2416 +VFIXUPIMMSDZrribk 2417 +VFIXUPIMMSDZrribkz 2418 +VFIXUPIMMSDZrrik 2419 +VFIXUPIMMSDZrrikz 2420 +VFIXUPIMMSSZrmi 2421 +VFIXUPIMMSSZrmik 2422 +VFIXUPIMMSSZrmikz 2423 +VFIXUPIMMSSZrri 2424 +VFIXUPIMMSSZrrib 2425 +VFIXUPIMMSSZrribk 2426 +VFIXUPIMMSSZrribkz 2427 +VFIXUPIMMSSZrrik 2428 +VFIXUPIMMSSZrrikz 2429 +VFMADD 2430 +VFMADDCPHZ 2431 +VFMADDCPHZm 2432 +VFMADDCPHZmb 2433 +VFMADDCPHZmbk 2434 +VFMADDCPHZmbkz 2435 +VFMADDCPHZmk 2436 +VFMADDCPHZmkz 2437 +VFMADDCPHZr 2438 +VFMADDCPHZrb 2439 +VFMADDCPHZrbk 2440 +VFMADDCPHZrbkz 2441 +VFMADDCPHZrk 2442 +VFMADDCPHZrkz 2443 +VFMADDCSHZm 2444 +VFMADDCSHZmk 2445 +VFMADDCSHZmkz 2446 +VFMADDCSHZr 2447 +VFMADDCSHZrb 2448 +VFMADDCSHZrbk 2449 +VFMADDCSHZrbkz 2450 +VFMADDCSHZrk 2451 +VFMADDCSHZrkz 2452 +VFMADDPD 2453 +VFMADDPS 2454 +VFMADDSD 2455 +VFMADDSS 2456 +VFMADDSUB 2457 +VFMADDSUBPD 2458 +VFMADDSUBPS 2459 +VFMSUB 2460 +VFMSUBADD 2461 +VFMSUBADDPD 2462 +VFMSUBADDPS 2463 +VFMSUBPD 2464 +VFMSUBPS 2465 +VFMSUBSD 2466 +VFMSUBSS 2467 +VFMULCPHZ 2468 +VFMULCPHZrm 2469 +VFMULCPHZrmb 2470 +VFMULCPHZrmbk 2471 +VFMULCPHZrmbkz 2472 +VFMULCPHZrmk 2473 +VFMULCPHZrmkz 2474 +VFMULCPHZrr 2475 +VFMULCPHZrrb 2476 +VFMULCPHZrrbk 2477 +VFMULCPHZrrbkz 2478 +VFMULCPHZrrk 2479 +VFMULCPHZrrkz 2480 +VFMULCSHZrm 2481 +VFMULCSHZrmk 2482 +VFMULCSHZrmkz 2483 +VFMULCSHZrr 2484 +VFMULCSHZrrb 2485 +VFMULCSHZrrbk 2486 +VFMULCSHZrrbkz 2487 +VFMULCSHZrrk 2488 +VFMULCSHZrrkz 2489 +VFNMADD 2490 +VFNMADDPD 2491 +VFNMADDPS 2492 +VFNMADDSD 2493 +VFNMADDSS 2494 +VFNMSUB 2495 +VFNMSUBPD 2496 +VFNMSUBPS 2497 +VFNMSUBSD 2498 +VFNMSUBSS 2499 +VFPCLASSBF 2500 +VFPCLASSPDZ 2501 +VFPCLASSPDZmbi 2502 +VFPCLASSPDZmbik 2503 +VFPCLASSPDZmi 2504 +VFPCLASSPDZmik 2505 +VFPCLASSPDZri 2506 +VFPCLASSPDZrik 2507 +VFPCLASSPHZ 2508 +VFPCLASSPHZmbi 2509 +VFPCLASSPHZmbik 2510 +VFPCLASSPHZmi 2511 +VFPCLASSPHZmik 2512 +VFPCLASSPHZri 2513 +VFPCLASSPHZrik 2514 +VFPCLASSPSZ 2515 +VFPCLASSPSZmbi 2516 +VFPCLASSPSZmbik 2517 +VFPCLASSPSZmi 2518 +VFPCLASSPSZmik 2519 +VFPCLASSPSZri 2520 +VFPCLASSPSZrik 2521 +VFPCLASSSDZmi 2522 +VFPCLASSSDZmik 2523 +VFPCLASSSDZri 2524 +VFPCLASSSDZrik 2525 +VFPCLASSSHZmi 2526 +VFPCLASSSHZmik 2527 +VFPCLASSSHZri 2528 +VFPCLASSSHZrik 2529 +VFPCLASSSSZmi 2530 +VFPCLASSSSZmik 2531 +VFPCLASSSSZri 2532 +VFPCLASSSSZrik 2533 +VFRCZPDYrm 2534 +VFRCZPDYrr 2535 +VFRCZPDrm 2536 +VFRCZPDrr 2537 +VFRCZPSYrm 2538 +VFRCZPSYrr 2539 +VFRCZPSrm 2540 +VFRCZPSrr 2541 +VFRCZSDrm 2542 +VFRCZSDrr 2543 +VFRCZSSrm 2544 +VFRCZSSrr 2545 +VGATHERDPDYrm 2546 +VGATHERDPDZ 2547 +VGATHERDPDZrm 2548 +VGATHERDPDrm 2549 +VGATHERDPSYrm 2550 +VGATHERDPSZ 2551 +VGATHERDPSZrm 2552 +VGATHERDPSrm 2553 +VGATHERPF 2554 +VGATHERQPDYrm 2555 +VGATHERQPDZ 2556 +VGATHERQPDZrm 2557 +VGATHERQPDrm 2558 +VGATHERQPSYrm 2559 +VGATHERQPSZ 2560 +VGATHERQPSZrm 2561 +VGATHERQPSrm 2562 +VGETEXPBF 2563 +VGETEXPPDZ 2564 +VGETEXPPDZm 2565 +VGETEXPPDZmb 2566 +VGETEXPPDZmbk 2567 +VGETEXPPDZmbkz 2568 +VGETEXPPDZmk 2569 +VGETEXPPDZmkz 2570 +VGETEXPPDZr 2571 +VGETEXPPDZrb 2572 +VGETEXPPDZrbk 2573 +VGETEXPPDZrbkz 2574 +VGETEXPPDZrk 2575 +VGETEXPPDZrkz 2576 +VGETEXPPHZ 2577 +VGETEXPPHZm 2578 +VGETEXPPHZmb 2579 +VGETEXPPHZmbk 2580 +VGETEXPPHZmbkz 2581 +VGETEXPPHZmk 2582 +VGETEXPPHZmkz 2583 +VGETEXPPHZr 2584 +VGETEXPPHZrb 2585 +VGETEXPPHZrbk 2586 +VGETEXPPHZrbkz 2587 +VGETEXPPHZrk 2588 +VGETEXPPHZrkz 2589 +VGETEXPPSZ 2590 +VGETEXPPSZm 2591 +VGETEXPPSZmb 2592 +VGETEXPPSZmbk 2593 +VGETEXPPSZmbkz 2594 +VGETEXPPSZmk 2595 +VGETEXPPSZmkz 2596 +VGETEXPPSZr 2597 +VGETEXPPSZrb 2598 +VGETEXPPSZrbk 2599 +VGETEXPPSZrbkz 2600 +VGETEXPPSZrk 2601 +VGETEXPPSZrkz 2602 +VGETEXPSDZm 2603 +VGETEXPSDZmk 2604 +VGETEXPSDZmkz 2605 +VGETEXPSDZr 2606 +VGETEXPSDZrb 2607 +VGETEXPSDZrbk 2608 +VGETEXPSDZrbkz 2609 +VGETEXPSDZrk 2610 +VGETEXPSDZrkz 2611 +VGETEXPSHZm 2612 +VGETEXPSHZmk 2613 +VGETEXPSHZmkz 2614 +VGETEXPSHZr 2615 +VGETEXPSHZrb 2616 +VGETEXPSHZrbk 2617 +VGETEXPSHZrbkz 2618 +VGETEXPSHZrk 2619 +VGETEXPSHZrkz 2620 +VGETEXPSSZm 2621 +VGETEXPSSZmk 2622 +VGETEXPSSZmkz 2623 +VGETEXPSSZr 2624 +VGETEXPSSZrb 2625 +VGETEXPSSZrbk 2626 +VGETEXPSSZrbkz 2627 +VGETEXPSSZrk 2628 +VGETEXPSSZrkz 2629 +VGETMANTBF 2630 +VGETMANTPDZ 2631 +VGETMANTPDZrmbi 2632 +VGETMANTPDZrmbik 2633 +VGETMANTPDZrmbikz 2634 +VGETMANTPDZrmi 2635 +VGETMANTPDZrmik 2636 +VGETMANTPDZrmikz 2637 +VGETMANTPDZrri 2638 +VGETMANTPDZrrib 2639 +VGETMANTPDZrribk 2640 +VGETMANTPDZrribkz 2641 +VGETMANTPDZrrik 2642 +VGETMANTPDZrrikz 2643 +VGETMANTPHZ 2644 +VGETMANTPHZrmbi 2645 +VGETMANTPHZrmbik 2646 +VGETMANTPHZrmbikz 2647 +VGETMANTPHZrmi 2648 +VGETMANTPHZrmik 2649 +VGETMANTPHZrmikz 2650 +VGETMANTPHZrri 2651 +VGETMANTPHZrrib 2652 +VGETMANTPHZrribk 2653 +VGETMANTPHZrribkz 2654 +VGETMANTPHZrrik 2655 +VGETMANTPHZrrikz 2656 +VGETMANTPSZ 2657 +VGETMANTPSZrmbi 2658 +VGETMANTPSZrmbik 2659 +VGETMANTPSZrmbikz 2660 +VGETMANTPSZrmi 2661 +VGETMANTPSZrmik 2662 +VGETMANTPSZrmikz 2663 +VGETMANTPSZrri 2664 +VGETMANTPSZrrib 2665 +VGETMANTPSZrribk 2666 +VGETMANTPSZrribkz 2667 +VGETMANTPSZrrik 2668 +VGETMANTPSZrrikz 2669 +VGETMANTSDZrmi 2670 +VGETMANTSDZrmik 2671 +VGETMANTSDZrmikz 2672 +VGETMANTSDZrri 2673 +VGETMANTSDZrrib 2674 +VGETMANTSDZrribk 2675 +VGETMANTSDZrribkz 2676 +VGETMANTSDZrrik 2677 +VGETMANTSDZrrikz 2678 +VGETMANTSHZrmi 2679 +VGETMANTSHZrmik 2680 +VGETMANTSHZrmikz 2681 +VGETMANTSHZrri 2682 +VGETMANTSHZrrib 2683 +VGETMANTSHZrribk 2684 +VGETMANTSHZrribkz 2685 +VGETMANTSHZrrik 2686 +VGETMANTSHZrrikz 2687 +VGETMANTSSZrmi 2688 +VGETMANTSSZrmik 2689 +VGETMANTSSZrmikz 2690 +VGETMANTSSZrri 2691 +VGETMANTSSZrrib 2692 +VGETMANTSSZrribk 2693 +VGETMANTSSZrribkz 2694 +VGETMANTSSZrrik 2695 +VGETMANTSSZrrikz 2696 +VGF 2697 +VHADDPDYrm 2698 +VHADDPDYrr 2699 +VHADDPDrm 2700 +VHADDPDrr 2701 +VHADDPSYrm 2702 +VHADDPSYrr 2703 +VHADDPSrm 2704 +VHADDPSrr 2705 +VHSUBPDYrm 2706 +VHSUBPDYrr 2707 +VHSUBPDrm 2708 +VHSUBPDrr 2709 +VHSUBPSYrm 2710 +VHSUBPSYrr 2711 +VHSUBPSrm 2712 +VHSUBPSrr 2713 +VINSERTF 2714 +VINSERTI 2715 +VINSERTPSZrmi 2716 +VINSERTPSZrri 2717 +VINSERTPSrmi 2718 +VINSERTPSrri 2719 +VLDDQUYrm 2720 +VLDDQUrm 2721 +VLDMXCSR 2722 +VMASKMOVDQU 2723 +VMASKMOVPDYmr 2724 +VMASKMOVPDYrm 2725 +VMASKMOVPDmr 2726 +VMASKMOVPDrm 2727 +VMASKMOVPSYmr 2728 +VMASKMOVPSYrm 2729 +VMASKMOVPSmr 2730 +VMASKMOVPSrm 2731 +VMAXBF 2732 +VMAXCPDYrm 2733 +VMAXCPDYrr 2734 +VMAXCPDZ 2735 +VMAXCPDZrm 2736 +VMAXCPDZrmb 2737 +VMAXCPDZrmbk 2738 +VMAXCPDZrmbkz 2739 +VMAXCPDZrmk 2740 +VMAXCPDZrmkz 2741 +VMAXCPDZrr 2742 +VMAXCPDZrrk 2743 +VMAXCPDZrrkz 2744 +VMAXCPDrm 2745 +VMAXCPDrr 2746 +VMAXCPHZ 2747 +VMAXCPHZrm 2748 +VMAXCPHZrmb 2749 +VMAXCPHZrmbk 2750 +VMAXCPHZrmbkz 2751 +VMAXCPHZrmk 2752 +VMAXCPHZrmkz 2753 +VMAXCPHZrr 2754 +VMAXCPHZrrk 2755 +VMAXCPHZrrkz 2756 +VMAXCPSYrm 2757 +VMAXCPSYrr 2758 +VMAXCPSZ 2759 +VMAXCPSZrm 2760 +VMAXCPSZrmb 2761 +VMAXCPSZrmbk 2762 +VMAXCPSZrmbkz 2763 +VMAXCPSZrmk 2764 +VMAXCPSZrmkz 2765 +VMAXCPSZrr 2766 +VMAXCPSZrrk 2767 +VMAXCPSZrrkz 2768 +VMAXCPSrm 2769 +VMAXCPSrr 2770 +VMAXCSDZrm 2771 +VMAXCSDZrr 2772 +VMAXCSDrm 2773 +VMAXCSDrr 2774 +VMAXCSHZrm 2775 +VMAXCSHZrr 2776 +VMAXCSSZrm 2777 +VMAXCSSZrr 2778 +VMAXCSSrm 2779 +VMAXCSSrr 2780 +VMAXPDYrm 2781 +VMAXPDYrr 2782 +VMAXPDZ 2783 +VMAXPDZrm 2784 +VMAXPDZrmb 2785 +VMAXPDZrmbk 2786 +VMAXPDZrmbkz 2787 +VMAXPDZrmk 2788 +VMAXPDZrmkz 2789 +VMAXPDZrr 2790 +VMAXPDZrrb 2791 +VMAXPDZrrbk 2792 +VMAXPDZrrbkz 2793 +VMAXPDZrrk 2794 +VMAXPDZrrkz 2795 +VMAXPDrm 2796 +VMAXPDrr 2797 +VMAXPHZ 2798 +VMAXPHZrm 2799 +VMAXPHZrmb 2800 +VMAXPHZrmbk 2801 +VMAXPHZrmbkz 2802 +VMAXPHZrmk 2803 +VMAXPHZrmkz 2804 +VMAXPHZrr 2805 +VMAXPHZrrb 2806 +VMAXPHZrrbk 2807 +VMAXPHZrrbkz 2808 +VMAXPHZrrk 2809 +VMAXPHZrrkz 2810 +VMAXPSYrm 2811 +VMAXPSYrr 2812 +VMAXPSZ 2813 +VMAXPSZrm 2814 +VMAXPSZrmb 2815 +VMAXPSZrmbk 2816 +VMAXPSZrmbkz 2817 +VMAXPSZrmk 2818 +VMAXPSZrmkz 2819 +VMAXPSZrr 2820 +VMAXPSZrrb 2821 +VMAXPSZrrbk 2822 +VMAXPSZrrbkz 2823 +VMAXPSZrrk 2824 +VMAXPSZrrkz 2825 +VMAXPSrm 2826 +VMAXPSrr 2827 +VMAXSDZrm 2828 +VMAXSDZrm_Int 2829 +VMAXSDZrmk_Int 2830 +VMAXSDZrmkz_Int 2831 +VMAXSDZrr 2832 +VMAXSDZrr_Int 2833 +VMAXSDZrrb_Int 2834 +VMAXSDZrrbk_Int 2835 +VMAXSDZrrbkz_Int 2836 +VMAXSDZrrk_Int 2837 +VMAXSDZrrkz_Int 2838 +VMAXSDrm 2839 +VMAXSDrm_Int 2840 +VMAXSDrr 2841 +VMAXSDrr_Int 2842 +VMAXSHZrm 2843 +VMAXSHZrm_Int 2844 +VMAXSHZrmk_Int 2845 +VMAXSHZrmkz_Int 2846 +VMAXSHZrr 2847 +VMAXSHZrr_Int 2848 +VMAXSHZrrb_Int 2849 +VMAXSHZrrbk_Int 2850 +VMAXSHZrrbkz_Int 2851 +VMAXSHZrrk_Int 2852 +VMAXSHZrrkz_Int 2853 +VMAXSSZrm 2854 +VMAXSSZrm_Int 2855 +VMAXSSZrmk_Int 2856 +VMAXSSZrmkz_Int 2857 +VMAXSSZrr 2858 +VMAXSSZrr_Int 2859 +VMAXSSZrrb_Int 2860 +VMAXSSZrrbk_Int 2861 +VMAXSSZrrbkz_Int 2862 +VMAXSSZrrk_Int 2863 +VMAXSSZrrkz_Int 2864 +VMAXSSrm 2865 +VMAXSSrm_Int 2866 +VMAXSSrr 2867 +VMAXSSrr_Int 2868 +VMCALL 2869 +VMCLEARm 2870 +VMFUNC 2871 +VMINBF 2872 +VMINCPDYrm 2873 +VMINCPDYrr 2874 +VMINCPDZ 2875 +VMINCPDZrm 2876 +VMINCPDZrmb 2877 +VMINCPDZrmbk 2878 +VMINCPDZrmbkz 2879 +VMINCPDZrmk 2880 +VMINCPDZrmkz 2881 +VMINCPDZrr 2882 +VMINCPDZrrk 2883 +VMINCPDZrrkz 2884 +VMINCPDrm 2885 +VMINCPDrr 2886 +VMINCPHZ 2887 +VMINCPHZrm 2888 +VMINCPHZrmb 2889 +VMINCPHZrmbk 2890 +VMINCPHZrmbkz 2891 +VMINCPHZrmk 2892 +VMINCPHZrmkz 2893 +VMINCPHZrr 2894 +VMINCPHZrrk 2895 +VMINCPHZrrkz 2896 +VMINCPSYrm 2897 +VMINCPSYrr 2898 +VMINCPSZ 2899 +VMINCPSZrm 2900 +VMINCPSZrmb 2901 +VMINCPSZrmbk 2902 +VMINCPSZrmbkz 2903 +VMINCPSZrmk 2904 +VMINCPSZrmkz 2905 +VMINCPSZrr 2906 +VMINCPSZrrk 2907 +VMINCPSZrrkz 2908 +VMINCPSrm 2909 +VMINCPSrr 2910 +VMINCSDZrm 2911 +VMINCSDZrr 2912 +VMINCSDrm 2913 +VMINCSDrr 2914 +VMINCSHZrm 2915 +VMINCSHZrr 2916 +VMINCSSZrm 2917 +VMINCSSZrr 2918 +VMINCSSrm 2919 +VMINCSSrr 2920 +VMINMAXBF 2921 +VMINMAXPDZ 2922 +VMINMAXPDZrmbi 2923 +VMINMAXPDZrmbik 2924 +VMINMAXPDZrmbikz 2925 +VMINMAXPDZrmi 2926 +VMINMAXPDZrmik 2927 +VMINMAXPDZrmikz 2928 +VMINMAXPDZrri 2929 +VMINMAXPDZrrib 2930 +VMINMAXPDZrribk 2931 +VMINMAXPDZrribkz 2932 +VMINMAXPDZrrik 2933 +VMINMAXPDZrrikz 2934 +VMINMAXPHZ 2935 +VMINMAXPHZrmbi 2936 +VMINMAXPHZrmbik 2937 +VMINMAXPHZrmbikz 2938 +VMINMAXPHZrmi 2939 +VMINMAXPHZrmik 2940 +VMINMAXPHZrmikz 2941 +VMINMAXPHZrri 2942 +VMINMAXPHZrrib 2943 +VMINMAXPHZrribk 2944 +VMINMAXPHZrribkz 2945 +VMINMAXPHZrrik 2946 +VMINMAXPHZrrikz 2947 +VMINMAXPSZ 2948 +VMINMAXPSZrmbi 2949 +VMINMAXPSZrmbik 2950 +VMINMAXPSZrmbikz 2951 +VMINMAXPSZrmi 2952 +VMINMAXPSZrmik 2953 +VMINMAXPSZrmikz 2954 +VMINMAXPSZrri 2955 +VMINMAXPSZrrib 2956 +VMINMAXPSZrribk 2957 +VMINMAXPSZrribkz 2958 +VMINMAXPSZrrik 2959 +VMINMAXPSZrrikz 2960 +VMINMAXSDrmi 2961 +VMINMAXSDrmi_Int 2962 +VMINMAXSDrmik_Int 2963 +VMINMAXSDrmikz_Int 2964 +VMINMAXSDrri 2965 +VMINMAXSDrri_Int 2966 +VMINMAXSDrrib_Int 2967 +VMINMAXSDrribk_Int 2968 +VMINMAXSDrribkz_Int 2969 +VMINMAXSDrrik_Int 2970 +VMINMAXSDrrikz_Int 2971 +VMINMAXSHrmi 2972 +VMINMAXSHrmi_Int 2973 +VMINMAXSHrmik_Int 2974 +VMINMAXSHrmikz_Int 2975 +VMINMAXSHrri 2976 +VMINMAXSHrri_Int 2977 +VMINMAXSHrrib_Int 2978 +VMINMAXSHrribk_Int 2979 +VMINMAXSHrribkz_Int 2980 +VMINMAXSHrrik_Int 2981 +VMINMAXSHrrikz_Int 2982 +VMINMAXSSrmi 2983 +VMINMAXSSrmi_Int 2984 +VMINMAXSSrmik_Int 2985 +VMINMAXSSrmikz_Int 2986 +VMINMAXSSrri 2987 +VMINMAXSSrri_Int 2988 +VMINMAXSSrrib_Int 2989 +VMINMAXSSrribk_Int 2990 +VMINMAXSSrribkz_Int 2991 +VMINMAXSSrrik_Int 2992 +VMINMAXSSrrikz_Int 2993 +VMINPDYrm 2994 +VMINPDYrr 2995 +VMINPDZ 2996 +VMINPDZrm 2997 +VMINPDZrmb 2998 +VMINPDZrmbk 2999 +VMINPDZrmbkz 3000 +VMINPDZrmk 3001 +VMINPDZrmkz 3002 +VMINPDZrr 3003 +VMINPDZrrb 3004 +VMINPDZrrbk 3005 +VMINPDZrrbkz 3006 +VMINPDZrrk 3007 +VMINPDZrrkz 3008 +VMINPDrm 3009 +VMINPDrr 3010 +VMINPHZ 3011 +VMINPHZrm 3012 +VMINPHZrmb 3013 +VMINPHZrmbk 3014 +VMINPHZrmbkz 3015 +VMINPHZrmk 3016 +VMINPHZrmkz 3017 +VMINPHZrr 3018 +VMINPHZrrb 3019 +VMINPHZrrbk 3020 +VMINPHZrrbkz 3021 +VMINPHZrrk 3022 +VMINPHZrrkz 3023 +VMINPSYrm 3024 +VMINPSYrr 3025 +VMINPSZ 3026 +VMINPSZrm 3027 +VMINPSZrmb 3028 +VMINPSZrmbk 3029 +VMINPSZrmbkz 3030 +VMINPSZrmk 3031 +VMINPSZrmkz 3032 +VMINPSZrr 3033 +VMINPSZrrb 3034 +VMINPSZrrbk 3035 +VMINPSZrrbkz 3036 +VMINPSZrrk 3037 +VMINPSZrrkz 3038 +VMINPSrm 3039 +VMINPSrr 3040 +VMINSDZrm 3041 +VMINSDZrm_Int 3042 +VMINSDZrmk_Int 3043 +VMINSDZrmkz_Int 3044 +VMINSDZrr 3045 +VMINSDZrr_Int 3046 +VMINSDZrrb_Int 3047 +VMINSDZrrbk_Int 3048 +VMINSDZrrbkz_Int 3049 +VMINSDZrrk_Int 3050 +VMINSDZrrkz_Int 3051 +VMINSDrm 3052 +VMINSDrm_Int 3053 +VMINSDrr 3054 +VMINSDrr_Int 3055 +VMINSHZrm 3056 +VMINSHZrm_Int 3057 +VMINSHZrmk_Int 3058 +VMINSHZrmkz_Int 3059 +VMINSHZrr 3060 +VMINSHZrr_Int 3061 +VMINSHZrrb_Int 3062 +VMINSHZrrbk_Int 3063 +VMINSHZrrbkz_Int 3064 +VMINSHZrrk_Int 3065 +VMINSHZrrkz_Int 3066 +VMINSSZrm 3067 +VMINSSZrm_Int 3068 +VMINSSZrmk_Int 3069 +VMINSSZrmkz_Int 3070 +VMINSSZrr 3071 +VMINSSZrr_Int 3072 +VMINSSZrrb_Int 3073 +VMINSSZrrbk_Int 3074 +VMINSSZrrbkz_Int 3075 +VMINSSZrrk_Int 3076 +VMINSSZrrkz_Int 3077 +VMINSSrm 3078 +VMINSSrm_Int 3079 +VMINSSrr 3080 +VMINSSrr_Int 3081 +VMLAUNCH 3082 +VMLOAD 3083 +VMMCALL 3084 +VMOV 3085 +VMOVAPDYmr 3086 +VMOVAPDYrm 3087 +VMOVAPDYrr 3088 +VMOVAPDYrr_REV 3089 +VMOVAPDZ 3090 +VMOVAPDZmr 3091 +VMOVAPDZmrk 3092 +VMOVAPDZrm 3093 +VMOVAPDZrmk 3094 +VMOVAPDZrmkz 3095 +VMOVAPDZrr 3096 +VMOVAPDZrr_REV 3097 +VMOVAPDZrrk 3098 +VMOVAPDZrrk_REV 3099 +VMOVAPDZrrkz 3100 +VMOVAPDZrrkz_REV 3101 +VMOVAPDmr 3102 +VMOVAPDrm 3103 +VMOVAPDrr 3104 +VMOVAPDrr_REV 3105 +VMOVAPSYmr 3106 +VMOVAPSYrm 3107 +VMOVAPSYrr 3108 +VMOVAPSYrr_REV 3109 +VMOVAPSZ 3110 +VMOVAPSZmr 3111 +VMOVAPSZmrk 3112 +VMOVAPSZrm 3113 +VMOVAPSZrmk 3114 +VMOVAPSZrmkz 3115 +VMOVAPSZrr 3116 +VMOVAPSZrr_REV 3117 +VMOVAPSZrrk 3118 +VMOVAPSZrrk_REV 3119 +VMOVAPSZrrkz 3120 +VMOVAPSZrrkz_REV 3121 +VMOVAPSmr 3122 +VMOVAPSrm 3123 +VMOVAPSrr 3124 +VMOVAPSrr_REV 3125 +VMOVDDUPYrm 3126 +VMOVDDUPYrr 3127 +VMOVDDUPZ 3128 +VMOVDDUPZrm 3129 +VMOVDDUPZrmk 3130 +VMOVDDUPZrmkz 3131 +VMOVDDUPZrr 3132 +VMOVDDUPZrrk 3133 +VMOVDDUPZrrkz 3134 +VMOVDDUPrm 3135 +VMOVDDUPrr 3136 +VMOVDI 3137 +VMOVDQA 3138 +VMOVDQAYmr 3139 +VMOVDQAYrm 3140 +VMOVDQAYrr 3141 +VMOVDQAYrr_REV 3142 +VMOVDQAmr 3143 +VMOVDQArm 3144 +VMOVDQArr 3145 +VMOVDQArr_REV 3146 +VMOVDQU 3147 +VMOVDQUYmr 3148 +VMOVDQUYrm 3149 +VMOVDQUYrr 3150 +VMOVDQUYrr_REV 3151 +VMOVDQUmr 3152 +VMOVDQUrm 3153 +VMOVDQUrr 3154 +VMOVDQUrr_REV 3155 +VMOVHLPSZrr 3156 +VMOVHLPSrr 3157 +VMOVHPDZ 3158 +VMOVHPDmr 3159 +VMOVHPDrm 3160 +VMOVHPSZ 3161 +VMOVHPSmr 3162 +VMOVHPSrm 3163 +VMOVLHPSZrr 3164 +VMOVLHPSrr 3165 +VMOVLPDZ 3166 +VMOVLPDmr 3167 +VMOVLPDrm 3168 +VMOVLPSZ 3169 +VMOVLPSmr 3170 +VMOVLPSrm 3171 +VMOVMSKPDYrr 3172 +VMOVMSKPDrr 3173 +VMOVMSKPSYrr 3174 +VMOVMSKPSrr 3175 +VMOVNTDQAYrm 3176 +VMOVNTDQAZ 3177 +VMOVNTDQAZrm 3178 +VMOVNTDQArm 3179 +VMOVNTDQYmr 3180 +VMOVNTDQZ 3181 +VMOVNTDQZmr 3182 +VMOVNTDQmr 3183 +VMOVNTPDYmr 3184 +VMOVNTPDZ 3185 +VMOVNTPDZmr 3186 +VMOVNTPDmr 3187 +VMOVNTPSYmr 3188 +VMOVNTPSZ 3189 +VMOVNTPSZmr 3190 +VMOVNTPSmr 3191 +VMOVPDI 3192 +VMOVPQI 3193 +VMOVPQIto 3194 +VMOVQI 3195 +VMOVRSBZ 3196 +VMOVRSBZm 3197 +VMOVRSBZmk 3198 +VMOVRSBZmkz 3199 +VMOVRSDZ 3200 +VMOVRSDZm 3201 +VMOVRSDZmk 3202 +VMOVRSDZmkz 3203 +VMOVRSQZ 3204 +VMOVRSQZm 3205 +VMOVRSQZmk 3206 +VMOVRSQZmkz 3207 +VMOVRSWZ 3208 +VMOVRSWZm 3209 +VMOVRSWZmk 3210 +VMOVRSWZmkz 3211 +VMOVSDZmr 3212 +VMOVSDZmrk 3213 +VMOVSDZrm 3214 +VMOVSDZrm_alt 3215 +VMOVSDZrmk 3216 +VMOVSDZrmkz 3217 +VMOVSDZrr 3218 +VMOVSDZrr_REV 3219 +VMOVSDZrrk 3220 +VMOVSDZrrk_REV 3221 +VMOVSDZrrkz 3222 +VMOVSDZrrkz_REV 3223 +VMOVSDmr 3224 +VMOVSDrm 3225 +VMOVSDrm_alt 3226 +VMOVSDrr 3227 +VMOVSDrr_REV 3228 +VMOVSDto 3229 +VMOVSH 3230 +VMOVSHDUPYrm 3231 +VMOVSHDUPYrr 3232 +VMOVSHDUPZ 3233 +VMOVSHDUPZrm 3234 +VMOVSHDUPZrmk 3235 +VMOVSHDUPZrmkz 3236 +VMOVSHDUPZrr 3237 +VMOVSHDUPZrrk 3238 +VMOVSHDUPZrrkz 3239 +VMOVSHDUPrm 3240 +VMOVSHDUPrr 3241 +VMOVSHZmr 3242 +VMOVSHZmrk 3243 +VMOVSHZrm 3244 +VMOVSHZrm_alt 3245 +VMOVSHZrmk 3246 +VMOVSHZrmkz 3247 +VMOVSHZrr 3248 +VMOVSHZrr_REV 3249 +VMOVSHZrrk 3250 +VMOVSHZrrk_REV 3251 +VMOVSHZrrkz 3252 +VMOVSHZrrkz_REV 3253 +VMOVSHtoW 3254 +VMOVSLDUPYrm 3255 +VMOVSLDUPYrr 3256 +VMOVSLDUPZ 3257 +VMOVSLDUPZrm 3258 +VMOVSLDUPZrmk 3259 +VMOVSLDUPZrmkz 3260 +VMOVSLDUPZrr 3261 +VMOVSLDUPZrrk 3262 +VMOVSLDUPZrrkz 3263 +VMOVSLDUPrm 3264 +VMOVSLDUPrr 3265 +VMOVSS 3266 +VMOVSSZmr 3267 +VMOVSSZmrk 3268 +VMOVSSZrm 3269 +VMOVSSZrm_alt 3270 +VMOVSSZrmk 3271 +VMOVSSZrmkz 3272 +VMOVSSZrr 3273 +VMOVSSZrr_REV 3274 +VMOVSSZrrk 3275 +VMOVSSZrrk_REV 3276 +VMOVSSZrrkz 3277 +VMOVSSZrrkz_REV 3278 +VMOVSSmr 3279 +VMOVSSrm 3280 +VMOVSSrm_alt 3281 +VMOVSSrr 3282 +VMOVSSrr_REV 3283 +VMOVUPDYmr 3284 +VMOVUPDYrm 3285 +VMOVUPDYrr 3286 +VMOVUPDYrr_REV 3287 +VMOVUPDZ 3288 +VMOVUPDZmr 3289 +VMOVUPDZmrk 3290 +VMOVUPDZrm 3291 +VMOVUPDZrmk 3292 +VMOVUPDZrmkz 3293 +VMOVUPDZrr 3294 +VMOVUPDZrr_REV 3295 +VMOVUPDZrrk 3296 +VMOVUPDZrrk_REV 3297 +VMOVUPDZrrkz 3298 +VMOVUPDZrrkz_REV 3299 +VMOVUPDmr 3300 +VMOVUPDrm 3301 +VMOVUPDrr 3302 +VMOVUPDrr_REV 3303 +VMOVUPSYmr 3304 +VMOVUPSYrm 3305 +VMOVUPSYrr 3306 +VMOVUPSYrr_REV 3307 +VMOVUPSZ 3308 +VMOVUPSZmr 3309 +VMOVUPSZmrk 3310 +VMOVUPSZrm 3311 +VMOVUPSZrmk 3312 +VMOVUPSZrmkz 3313 +VMOVUPSZrr 3314 +VMOVUPSZrr_REV 3315 +VMOVUPSZrrk 3316 +VMOVUPSZrrk_REV 3317 +VMOVUPSZrrkz 3318 +VMOVUPSZrrkz_REV 3319 +VMOVUPSmr 3320 +VMOVUPSrm 3321 +VMOVUPSrr 3322 +VMOVUPSrr_REV 3323 +VMOVW 3324 +VMOVWmr 3325 +VMOVWrm 3326 +VMOVZPDILo 3327 +VMOVZPQILo 3328 +VMOVZPWILo 3329 +VMPSADBWYrmi 3330 +VMPSADBWYrri 3331 +VMPSADBWZ 3332 +VMPSADBWZrmi 3333 +VMPSADBWZrmik 3334 +VMPSADBWZrmikz 3335 +VMPSADBWZrri 3336 +VMPSADBWZrrik 3337 +VMPSADBWZrrikz 3338 +VMPSADBWrmi 3339 +VMPSADBWrri 3340 +VMPTRLDm 3341 +VMPTRSTm 3342 +VMREAD 3343 +VMRESUME 3344 +VMRUN 3345 +VMSAVE 3346 +VMULBF 3347 +VMULPDYrm 3348 +VMULPDYrr 3349 +VMULPDZ 3350 +VMULPDZrm 3351 +VMULPDZrmb 3352 +VMULPDZrmbk 3353 +VMULPDZrmbkz 3354 +VMULPDZrmk 3355 +VMULPDZrmkz 3356 +VMULPDZrr 3357 +VMULPDZrrb 3358 +VMULPDZrrbk 3359 +VMULPDZrrbkz 3360 +VMULPDZrrk 3361 +VMULPDZrrkz 3362 +VMULPDrm 3363 +VMULPDrr 3364 +VMULPHZ 3365 +VMULPHZrm 3366 +VMULPHZrmb 3367 +VMULPHZrmbk 3368 +VMULPHZrmbkz 3369 +VMULPHZrmk 3370 +VMULPHZrmkz 3371 +VMULPHZrr 3372 +VMULPHZrrb 3373 +VMULPHZrrbk 3374 +VMULPHZrrbkz 3375 +VMULPHZrrk 3376 +VMULPHZrrkz 3377 +VMULPSYrm 3378 +VMULPSYrr 3379 +VMULPSZ 3380 +VMULPSZrm 3381 +VMULPSZrmb 3382 +VMULPSZrmbk 3383 +VMULPSZrmbkz 3384 +VMULPSZrmk 3385 +VMULPSZrmkz 3386 +VMULPSZrr 3387 +VMULPSZrrb 3388 +VMULPSZrrbk 3389 +VMULPSZrrbkz 3390 +VMULPSZrrk 3391 +VMULPSZrrkz 3392 +VMULPSrm 3393 +VMULPSrr 3394 +VMULSDZrm 3395 +VMULSDZrm_Int 3396 +VMULSDZrmk_Int 3397 +VMULSDZrmkz_Int 3398 +VMULSDZrr 3399 +VMULSDZrr_Int 3400 +VMULSDZrrb_Int 3401 +VMULSDZrrbk_Int 3402 +VMULSDZrrbkz_Int 3403 +VMULSDZrrk_Int 3404 +VMULSDZrrkz_Int 3405 +VMULSDrm 3406 +VMULSDrm_Int 3407 +VMULSDrr 3408 +VMULSDrr_Int 3409 +VMULSHZrm 3410 +VMULSHZrm_Int 3411 +VMULSHZrmk_Int 3412 +VMULSHZrmkz_Int 3413 +VMULSHZrr 3414 +VMULSHZrr_Int 3415 +VMULSHZrrb_Int 3416 +VMULSHZrrbk_Int 3417 +VMULSHZrrbkz_Int 3418 +VMULSHZrrk_Int 3419 +VMULSHZrrkz_Int 3420 +VMULSSZrm 3421 +VMULSSZrm_Int 3422 +VMULSSZrmk_Int 3423 +VMULSSZrmkz_Int 3424 +VMULSSZrr 3425 +VMULSSZrr_Int 3426 +VMULSSZrrb_Int 3427 +VMULSSZrrbk_Int 3428 +VMULSSZrrbkz_Int 3429 +VMULSSZrrk_Int 3430 +VMULSSZrrkz_Int 3431 +VMULSSrm 3432 +VMULSSrm_Int 3433 +VMULSSrr 3434 +VMULSSrr_Int 3435 +VMWRITE 3436 +VMXOFF 3437 +VMXON 3438 +VORPDYrm 3439 +VORPDYrr 3440 +VORPDZ 3441 +VORPDZrm 3442 +VORPDZrmb 3443 +VORPDZrmbk 3444 +VORPDZrmbkz 3445 +VORPDZrmk 3446 +VORPDZrmkz 3447 +VORPDZrr 3448 +VORPDZrrk 3449 +VORPDZrrkz 3450 +VORPDrm 3451 +VORPDrr 3452 +VORPSYrm 3453 +VORPSYrr 3454 +VORPSZ 3455 +VORPSZrm 3456 +VORPSZrmb 3457 +VORPSZrmbk 3458 +VORPSZrmbkz 3459 +VORPSZrmk 3460 +VORPSZrmkz 3461 +VORPSZrr 3462 +VORPSZrrk 3463 +VORPSZrrkz 3464 +VORPSrm 3465 +VORPSrr 3466 +VP 3467 +VPABSBYrm 3468 +VPABSBYrr 3469 +VPABSBZ 3470 +VPABSBZrm 3471 +VPABSBZrmk 3472 +VPABSBZrmkz 3473 +VPABSBZrr 3474 +VPABSBZrrk 3475 +VPABSBZrrkz 3476 +VPABSBrm 3477 +VPABSBrr 3478 +VPABSDYrm 3479 +VPABSDYrr 3480 +VPABSDZ 3481 +VPABSDZrm 3482 +VPABSDZrmb 3483 +VPABSDZrmbk 3484 +VPABSDZrmbkz 3485 +VPABSDZrmk 3486 +VPABSDZrmkz 3487 +VPABSDZrr 3488 +VPABSDZrrk 3489 +VPABSDZrrkz 3490 +VPABSDrm 3491 +VPABSDrr 3492 +VPABSQZ 3493 +VPABSQZrm 3494 +VPABSQZrmb 3495 +VPABSQZrmbk 3496 +VPABSQZrmbkz 3497 +VPABSQZrmk 3498 +VPABSQZrmkz 3499 +VPABSQZrr 3500 +VPABSQZrrk 3501 +VPABSQZrrkz 3502 +VPABSWYrm 3503 +VPABSWYrr 3504 +VPABSWZ 3505 +VPABSWZrm 3506 +VPABSWZrmk 3507 +VPABSWZrmkz 3508 +VPABSWZrr 3509 +VPABSWZrrk 3510 +VPABSWZrrkz 3511 +VPABSWrm 3512 +VPABSWrr 3513 +VPACKSSDWYrm 3514 +VPACKSSDWYrr 3515 +VPACKSSDWZ 3516 +VPACKSSDWZrm 3517 +VPACKSSDWZrmb 3518 +VPACKSSDWZrmbk 3519 +VPACKSSDWZrmbkz 3520 +VPACKSSDWZrmk 3521 +VPACKSSDWZrmkz 3522 +VPACKSSDWZrr 3523 +VPACKSSDWZrrk 3524 +VPACKSSDWZrrkz 3525 +VPACKSSDWrm 3526 +VPACKSSDWrr 3527 +VPACKSSWBYrm 3528 +VPACKSSWBYrr 3529 +VPACKSSWBZ 3530 +VPACKSSWBZrm 3531 +VPACKSSWBZrmk 3532 +VPACKSSWBZrmkz 3533 +VPACKSSWBZrr 3534 +VPACKSSWBZrrk 3535 +VPACKSSWBZrrkz 3536 +VPACKSSWBrm 3537 +VPACKSSWBrr 3538 +VPACKUSDWYrm 3539 +VPACKUSDWYrr 3540 +VPACKUSDWZ 3541 +VPACKUSDWZrm 3542 +VPACKUSDWZrmb 3543 +VPACKUSDWZrmbk 3544 +VPACKUSDWZrmbkz 3545 +VPACKUSDWZrmk 3546 +VPACKUSDWZrmkz 3547 +VPACKUSDWZrr 3548 +VPACKUSDWZrrk 3549 +VPACKUSDWZrrkz 3550 +VPACKUSDWrm 3551 +VPACKUSDWrr 3552 +VPACKUSWBYrm 3553 +VPACKUSWBYrr 3554 +VPACKUSWBZ 3555 +VPACKUSWBZrm 3556 +VPACKUSWBZrmk 3557 +VPACKUSWBZrmkz 3558 +VPACKUSWBZrr 3559 +VPACKUSWBZrrk 3560 +VPACKUSWBZrrkz 3561 +VPACKUSWBrm 3562 +VPACKUSWBrr 3563 +VPADDBYrm 3564 +VPADDBYrr 3565 +VPADDBZ 3566 +VPADDBZrm 3567 +VPADDBZrmk 3568 +VPADDBZrmkz 3569 +VPADDBZrr 3570 +VPADDBZrrk 3571 +VPADDBZrrkz 3572 +VPADDBrm 3573 +VPADDBrr 3574 +VPADDDYrm 3575 +VPADDDYrr 3576 +VPADDDZ 3577 +VPADDDZrm 3578 +VPADDDZrmb 3579 +VPADDDZrmbk 3580 +VPADDDZrmbkz 3581 +VPADDDZrmk 3582 +VPADDDZrmkz 3583 +VPADDDZrr 3584 +VPADDDZrrk 3585 +VPADDDZrrkz 3586 +VPADDDrm 3587 +VPADDDrr 3588 +VPADDQYrm 3589 +VPADDQYrr 3590 +VPADDQZ 3591 +VPADDQZrm 3592 +VPADDQZrmb 3593 +VPADDQZrmbk 3594 +VPADDQZrmbkz 3595 +VPADDQZrmk 3596 +VPADDQZrmkz 3597 +VPADDQZrr 3598 +VPADDQZrrk 3599 +VPADDQZrrkz 3600 +VPADDQrm 3601 +VPADDQrr 3602 +VPADDSBYrm 3603 +VPADDSBYrr 3604 +VPADDSBZ 3605 +VPADDSBZrm 3606 +VPADDSBZrmk 3607 +VPADDSBZrmkz 3608 +VPADDSBZrr 3609 +VPADDSBZrrk 3610 +VPADDSBZrrkz 3611 +VPADDSBrm 3612 +VPADDSBrr 3613 +VPADDSWYrm 3614 +VPADDSWYrr 3615 +VPADDSWZ 3616 +VPADDSWZrm 3617 +VPADDSWZrmk 3618 +VPADDSWZrmkz 3619 +VPADDSWZrr 3620 +VPADDSWZrrk 3621 +VPADDSWZrrkz 3622 +VPADDSWrm 3623 +VPADDSWrr 3624 +VPADDUSBYrm 3625 +VPADDUSBYrr 3626 +VPADDUSBZ 3627 +VPADDUSBZrm 3628 +VPADDUSBZrmk 3629 +VPADDUSBZrmkz 3630 +VPADDUSBZrr 3631 +VPADDUSBZrrk 3632 +VPADDUSBZrrkz 3633 +VPADDUSBrm 3634 +VPADDUSBrr 3635 +VPADDUSWYrm 3636 +VPADDUSWYrr 3637 +VPADDUSWZ 3638 +VPADDUSWZrm 3639 +VPADDUSWZrmk 3640 +VPADDUSWZrmkz 3641 +VPADDUSWZrr 3642 +VPADDUSWZrrk 3643 +VPADDUSWZrrkz 3644 +VPADDUSWrm 3645 +VPADDUSWrr 3646 +VPADDWYrm 3647 +VPADDWYrr 3648 +VPADDWZ 3649 +VPADDWZrm 3650 +VPADDWZrmk 3651 +VPADDWZrmkz 3652 +VPADDWZrr 3653 +VPADDWZrrk 3654 +VPADDWZrrkz 3655 +VPADDWrm 3656 +VPADDWrr 3657 +VPALIGNRYrmi 3658 +VPALIGNRYrri 3659 +VPALIGNRZ 3660 +VPALIGNRZrmi 3661 +VPALIGNRZrmik 3662 +VPALIGNRZrmikz 3663 +VPALIGNRZrri 3664 +VPALIGNRZrrik 3665 +VPALIGNRZrrikz 3666 +VPALIGNRrmi 3667 +VPALIGNRrri 3668 +VPANDDZ 3669 +VPANDDZrm 3670 +VPANDDZrmb 3671 +VPANDDZrmbk 3672 +VPANDDZrmbkz 3673 +VPANDDZrmk 3674 +VPANDDZrmkz 3675 +VPANDDZrr 3676 +VPANDDZrrk 3677 +VPANDDZrrkz 3678 +VPANDNDZ 3679 +VPANDNDZrm 3680 +VPANDNDZrmb 3681 +VPANDNDZrmbk 3682 +VPANDNDZrmbkz 3683 +VPANDNDZrmk 3684 +VPANDNDZrmkz 3685 +VPANDNDZrr 3686 +VPANDNDZrrk 3687 +VPANDNDZrrkz 3688 +VPANDNQZ 3689 +VPANDNQZrm 3690 +VPANDNQZrmb 3691 +VPANDNQZrmbk 3692 +VPANDNQZrmbkz 3693 +VPANDNQZrmk 3694 +VPANDNQZrmkz 3695 +VPANDNQZrr 3696 +VPANDNQZrrk 3697 +VPANDNQZrrkz 3698 +VPANDNYrm 3699 +VPANDNYrr 3700 +VPANDNrm 3701 +VPANDNrr 3702 +VPANDQZ 3703 +VPANDQZrm 3704 +VPANDQZrmb 3705 +VPANDQZrmbk 3706 +VPANDQZrmbkz 3707 +VPANDQZrmk 3708 +VPANDQZrmkz 3709 +VPANDQZrr 3710 +VPANDQZrrk 3711 +VPANDQZrrkz 3712 +VPANDYrm 3713 +VPANDYrr 3714 +VPANDrm 3715 +VPANDrr 3716 +VPAVGBYrm 3717 +VPAVGBYrr 3718 +VPAVGBZ 3719 +VPAVGBZrm 3720 +VPAVGBZrmk 3721 +VPAVGBZrmkz 3722 +VPAVGBZrr 3723 +VPAVGBZrrk 3724 +VPAVGBZrrkz 3725 +VPAVGBrm 3726 +VPAVGBrr 3727 +VPAVGWYrm 3728 +VPAVGWYrr 3729 +VPAVGWZ 3730 +VPAVGWZrm 3731 +VPAVGWZrmk 3732 +VPAVGWZrmkz 3733 +VPAVGWZrr 3734 +VPAVGWZrrk 3735 +VPAVGWZrrkz 3736 +VPAVGWrm 3737 +VPAVGWrr 3738 +VPBLENDDYrmi 3739 +VPBLENDDYrri 3740 +VPBLENDDrmi 3741 +VPBLENDDrri 3742 +VPBLENDMBZ 3743 +VPBLENDMBZrm 3744 +VPBLENDMBZrmk 3745 +VPBLENDMBZrmkz 3746 +VPBLENDMBZrr 3747 +VPBLENDMBZrrk 3748 +VPBLENDMBZrrkz 3749 +VPBLENDMDZ 3750 +VPBLENDMDZrm 3751 +VPBLENDMDZrmb 3752 +VPBLENDMDZrmbk 3753 +VPBLENDMDZrmbkz 3754 +VPBLENDMDZrmk 3755 +VPBLENDMDZrmkz 3756 +VPBLENDMDZrr 3757 +VPBLENDMDZrrk 3758 +VPBLENDMDZrrkz 3759 +VPBLENDMQZ 3760 +VPBLENDMQZrm 3761 +VPBLENDMQZrmb 3762 +VPBLENDMQZrmbk 3763 +VPBLENDMQZrmbkz 3764 +VPBLENDMQZrmk 3765 +VPBLENDMQZrmkz 3766 +VPBLENDMQZrr 3767 +VPBLENDMQZrrk 3768 +VPBLENDMQZrrkz 3769 +VPBLENDMWZ 3770 +VPBLENDMWZrm 3771 +VPBLENDMWZrmk 3772 +VPBLENDMWZrmkz 3773 +VPBLENDMWZrr 3774 +VPBLENDMWZrrk 3775 +VPBLENDMWZrrkz 3776 +VPBLENDVBYrmr 3777 +VPBLENDVBYrrr 3778 +VPBLENDVBrmr 3779 +VPBLENDVBrrr 3780 +VPBLENDWYrmi 3781 +VPBLENDWYrri 3782 +VPBLENDWrmi 3783 +VPBLENDWrri 3784 +VPBROADCASTBYrm 3785 +VPBROADCASTBYrr 3786 +VPBROADCASTBZ 3787 +VPBROADCASTBZrm 3788 +VPBROADCASTBZrmk 3789 +VPBROADCASTBZrmkz 3790 +VPBROADCASTBZrr 3791 +VPBROADCASTBZrrk 3792 +VPBROADCASTBZrrkz 3793 +VPBROADCASTBrZ 3794 +VPBROADCASTBrZrr 3795 +VPBROADCASTBrZrrk 3796 +VPBROADCASTBrZrrkz 3797 +VPBROADCASTBrm 3798 +VPBROADCASTBrr 3799 +VPBROADCASTDYrm 3800 +VPBROADCASTDYrr 3801 +VPBROADCASTDZ 3802 +VPBROADCASTDZrm 3803 +VPBROADCASTDZrmk 3804 +VPBROADCASTDZrmkz 3805 +VPBROADCASTDZrr 3806 +VPBROADCASTDZrrk 3807 +VPBROADCASTDZrrkz 3808 +VPBROADCASTDrZ 3809 +VPBROADCASTDrZrr 3810 +VPBROADCASTDrZrrk 3811 +VPBROADCASTDrZrrkz 3812 +VPBROADCASTDrm 3813 +VPBROADCASTDrr 3814 +VPBROADCASTMB 3815 +VPBROADCASTMW 3816 +VPBROADCASTQYrm 3817 +VPBROADCASTQYrr 3818 +VPBROADCASTQZ 3819 +VPBROADCASTQZrm 3820 +VPBROADCASTQZrmk 3821 +VPBROADCASTQZrmkz 3822 +VPBROADCASTQZrr 3823 +VPBROADCASTQZrrk 3824 +VPBROADCASTQZrrkz 3825 +VPBROADCASTQrZ 3826 +VPBROADCASTQrZrr 3827 +VPBROADCASTQrZrrk 3828 +VPBROADCASTQrZrrkz 3829 +VPBROADCASTQrm 3830 +VPBROADCASTQrr 3831 +VPBROADCASTWYrm 3832 +VPBROADCASTWYrr 3833 +VPBROADCASTWZ 3834 +VPBROADCASTWZrm 3835 +VPBROADCASTWZrmk 3836 +VPBROADCASTWZrmkz 3837 +VPBROADCASTWZrr 3838 +VPBROADCASTWZrrk 3839 +VPBROADCASTWZrrkz 3840 +VPBROADCASTWrZ 3841 +VPBROADCASTWrZrr 3842 +VPBROADCASTWrZrrk 3843 +VPBROADCASTWrZrrkz 3844 +VPBROADCASTWrm 3845 +VPBROADCASTWrr 3846 +VPCLMULQDQYrmi 3847 +VPCLMULQDQYrri 3848 +VPCLMULQDQZ 3849 +VPCLMULQDQZrmi 3850 +VPCLMULQDQZrri 3851 +VPCLMULQDQrmi 3852 +VPCLMULQDQrri 3853 +VPCMOVYrmr 3854 +VPCMOVYrrm 3855 +VPCMOVYrrr 3856 +VPCMOVYrrr_REV 3857 +VPCMOVrmr 3858 +VPCMOVrrm 3859 +VPCMOVrrr 3860 +VPCMOVrrr_REV 3861 +VPCMPBZ 3862 +VPCMPBZrmi 3863 +VPCMPBZrmik 3864 +VPCMPBZrri 3865 +VPCMPBZrrik 3866 +VPCMPDZ 3867 +VPCMPDZrmbi 3868 +VPCMPDZrmbik 3869 +VPCMPDZrmi 3870 +VPCMPDZrmik 3871 +VPCMPDZrri 3872 +VPCMPDZrrik 3873 +VPCMPEQBYrm 3874 +VPCMPEQBYrr 3875 +VPCMPEQBZ 3876 +VPCMPEQBZrm 3877 +VPCMPEQBZrmk 3878 +VPCMPEQBZrr 3879 +VPCMPEQBZrrk 3880 +VPCMPEQBrm 3881 +VPCMPEQBrr 3882 +VPCMPEQDYrm 3883 +VPCMPEQDYrr 3884 +VPCMPEQDZ 3885 +VPCMPEQDZrm 3886 +VPCMPEQDZrmb 3887 +VPCMPEQDZrmbk 3888 +VPCMPEQDZrmk 3889 +VPCMPEQDZrr 3890 +VPCMPEQDZrrk 3891 +VPCMPEQDrm 3892 +VPCMPEQDrr 3893 +VPCMPEQQYrm 3894 +VPCMPEQQYrr 3895 +VPCMPEQQZ 3896 +VPCMPEQQZrm 3897 +VPCMPEQQZrmb 3898 +VPCMPEQQZrmbk 3899 +VPCMPEQQZrmk 3900 +VPCMPEQQZrr 3901 +VPCMPEQQZrrk 3902 +VPCMPEQQrm 3903 +VPCMPEQQrr 3904 +VPCMPEQWYrm 3905 +VPCMPEQWYrr 3906 +VPCMPEQWZ 3907 +VPCMPEQWZrm 3908 +VPCMPEQWZrmk 3909 +VPCMPEQWZrr 3910 +VPCMPEQWZrrk 3911 +VPCMPEQWrm 3912 +VPCMPEQWrr 3913 +VPCMPESTRIrmi 3914 +VPCMPESTRIrri 3915 +VPCMPESTRMrmi 3916 +VPCMPESTRMrri 3917 +VPCMPGTBYrm 3918 +VPCMPGTBYrr 3919 +VPCMPGTBZ 3920 +VPCMPGTBZrm 3921 +VPCMPGTBZrmk 3922 +VPCMPGTBZrr 3923 +VPCMPGTBZrrk 3924 +VPCMPGTBrm 3925 +VPCMPGTBrr 3926 +VPCMPGTDYrm 3927 +VPCMPGTDYrr 3928 +VPCMPGTDZ 3929 +VPCMPGTDZrm 3930 +VPCMPGTDZrmb 3931 +VPCMPGTDZrmbk 3932 +VPCMPGTDZrmk 3933 +VPCMPGTDZrr 3934 +VPCMPGTDZrrk 3935 +VPCMPGTDrm 3936 +VPCMPGTDrr 3937 +VPCMPGTQYrm 3938 +VPCMPGTQYrr 3939 +VPCMPGTQZ 3940 +VPCMPGTQZrm 3941 +VPCMPGTQZrmb 3942 +VPCMPGTQZrmbk 3943 +VPCMPGTQZrmk 3944 +VPCMPGTQZrr 3945 +VPCMPGTQZrrk 3946 +VPCMPGTQrm 3947 +VPCMPGTQrr 3948 +VPCMPGTWYrm 3949 +VPCMPGTWYrr 3950 +VPCMPGTWZ 3951 +VPCMPGTWZrm 3952 +VPCMPGTWZrmk 3953 +VPCMPGTWZrr 3954 +VPCMPGTWZrrk 3955 +VPCMPGTWrm 3956 +VPCMPGTWrr 3957 +VPCMPISTRIrmi 3958 +VPCMPISTRIrri 3959 +VPCMPISTRMrmi 3960 +VPCMPISTRMrri 3961 +VPCMPQZ 3962 +VPCMPQZrmbi 3963 +VPCMPQZrmbik 3964 +VPCMPQZrmi 3965 +VPCMPQZrmik 3966 +VPCMPQZrri 3967 +VPCMPQZrrik 3968 +VPCMPUBZ 3969 +VPCMPUBZrmi 3970 +VPCMPUBZrmik 3971 +VPCMPUBZrri 3972 +VPCMPUBZrrik 3973 +VPCMPUDZ 3974 +VPCMPUDZrmbi 3975 +VPCMPUDZrmbik 3976 +VPCMPUDZrmi 3977 +VPCMPUDZrmik 3978 +VPCMPUDZrri 3979 +VPCMPUDZrrik 3980 +VPCMPUQZ 3981 +VPCMPUQZrmbi 3982 +VPCMPUQZrmbik 3983 +VPCMPUQZrmi 3984 +VPCMPUQZrmik 3985 +VPCMPUQZrri 3986 +VPCMPUQZrrik 3987 +VPCMPUWZ 3988 +VPCMPUWZrmi 3989 +VPCMPUWZrmik 3990 +VPCMPUWZrri 3991 +VPCMPUWZrrik 3992 +VPCMPWZ 3993 +VPCMPWZrmi 3994 +VPCMPWZrmik 3995 +VPCMPWZrri 3996 +VPCMPWZrrik 3997 +VPCOMBmi 3998 +VPCOMBri 3999 +VPCOMDmi 4000 +VPCOMDri 4001 +VPCOMPRESSBZ 4002 +VPCOMPRESSBZmr 4003 +VPCOMPRESSBZmrk 4004 +VPCOMPRESSBZrr 4005 +VPCOMPRESSBZrrk 4006 +VPCOMPRESSBZrrkz 4007 +VPCOMPRESSDZ 4008 +VPCOMPRESSDZmr 4009 +VPCOMPRESSDZmrk 4010 +VPCOMPRESSDZrr 4011 +VPCOMPRESSDZrrk 4012 +VPCOMPRESSDZrrkz 4013 +VPCOMPRESSQZ 4014 +VPCOMPRESSQZmr 4015 +VPCOMPRESSQZmrk 4016 +VPCOMPRESSQZrr 4017 +VPCOMPRESSQZrrk 4018 +VPCOMPRESSQZrrkz 4019 +VPCOMPRESSWZ 4020 +VPCOMPRESSWZmr 4021 +VPCOMPRESSWZmrk 4022 +VPCOMPRESSWZrr 4023 +VPCOMPRESSWZrrk 4024 +VPCOMPRESSWZrrkz 4025 +VPCOMQmi 4026 +VPCOMQri 4027 +VPCOMUBmi 4028 +VPCOMUBri 4029 +VPCOMUDmi 4030 +VPCOMUDri 4031 +VPCOMUQmi 4032 +VPCOMUQri 4033 +VPCOMUWmi 4034 +VPCOMUWri 4035 +VPCOMWmi 4036 +VPCOMWri 4037 +VPCONFLICTDZ 4038 +VPCONFLICTDZrm 4039 +VPCONFLICTDZrmb 4040 +VPCONFLICTDZrmbk 4041 +VPCONFLICTDZrmbkz 4042 +VPCONFLICTDZrmk 4043 +VPCONFLICTDZrmkz 4044 +VPCONFLICTDZrr 4045 +VPCONFLICTDZrrk 4046 +VPCONFLICTDZrrkz 4047 +VPCONFLICTQZ 4048 +VPCONFLICTQZrm 4049 +VPCONFLICTQZrmb 4050 +VPCONFLICTQZrmbk 4051 +VPCONFLICTQZrmbkz 4052 +VPCONFLICTQZrmk 4053 +VPCONFLICTQZrmkz 4054 +VPCONFLICTQZrr 4055 +VPCONFLICTQZrrk 4056 +VPCONFLICTQZrrkz 4057 +VPDPBSSDSYrm 4058 +VPDPBSSDSYrr 4059 +VPDPBSSDSZ 4060 +VPDPBSSDSZrm 4061 +VPDPBSSDSZrmb 4062 +VPDPBSSDSZrmbk 4063 +VPDPBSSDSZrmbkz 4064 +VPDPBSSDSZrmk 4065 +VPDPBSSDSZrmkz 4066 +VPDPBSSDSZrr 4067 +VPDPBSSDSZrrk 4068 +VPDPBSSDSZrrkz 4069 +VPDPBSSDSrm 4070 +VPDPBSSDSrr 4071 +VPDPBSSDYrm 4072 +VPDPBSSDYrr 4073 +VPDPBSSDZ 4074 +VPDPBSSDZrm 4075 +VPDPBSSDZrmb 4076 +VPDPBSSDZrmbk 4077 +VPDPBSSDZrmbkz 4078 +VPDPBSSDZrmk 4079 +VPDPBSSDZrmkz 4080 +VPDPBSSDZrr 4081 +VPDPBSSDZrrk 4082 +VPDPBSSDZrrkz 4083 +VPDPBSSDrm 4084 +VPDPBSSDrr 4085 +VPDPBSUDSYrm 4086 +VPDPBSUDSYrr 4087 +VPDPBSUDSZ 4088 +VPDPBSUDSZrm 4089 +VPDPBSUDSZrmb 4090 +VPDPBSUDSZrmbk 4091 +VPDPBSUDSZrmbkz 4092 +VPDPBSUDSZrmk 4093 +VPDPBSUDSZrmkz 4094 +VPDPBSUDSZrr 4095 +VPDPBSUDSZrrk 4096 +VPDPBSUDSZrrkz 4097 +VPDPBSUDSrm 4098 +VPDPBSUDSrr 4099 +VPDPBSUDYrm 4100 +VPDPBSUDYrr 4101 +VPDPBSUDZ 4102 +VPDPBSUDZrm 4103 +VPDPBSUDZrmb 4104 +VPDPBSUDZrmbk 4105 +VPDPBSUDZrmbkz 4106 +VPDPBSUDZrmk 4107 +VPDPBSUDZrmkz 4108 +VPDPBSUDZrr 4109 +VPDPBSUDZrrk 4110 +VPDPBSUDZrrkz 4111 +VPDPBSUDrm 4112 +VPDPBSUDrr 4113 +VPDPBUSDSYrm 4114 +VPDPBUSDSYrr 4115 +VPDPBUSDSZ 4116 +VPDPBUSDSZrm 4117 +VPDPBUSDSZrmb 4118 +VPDPBUSDSZrmbk 4119 +VPDPBUSDSZrmbkz 4120 +VPDPBUSDSZrmk 4121 +VPDPBUSDSZrmkz 4122 +VPDPBUSDSZrr 4123 +VPDPBUSDSZrrk 4124 +VPDPBUSDSZrrkz 4125 +VPDPBUSDSrm 4126 +VPDPBUSDSrr 4127 +VPDPBUSDYrm 4128 +VPDPBUSDYrr 4129 +VPDPBUSDZ 4130 +VPDPBUSDZrm 4131 +VPDPBUSDZrmb 4132 +VPDPBUSDZrmbk 4133 +VPDPBUSDZrmbkz 4134 +VPDPBUSDZrmk 4135 +VPDPBUSDZrmkz 4136 +VPDPBUSDZrr 4137 +VPDPBUSDZrrk 4138 +VPDPBUSDZrrkz 4139 +VPDPBUSDrm 4140 +VPDPBUSDrr 4141 +VPDPBUUDSYrm 4142 +VPDPBUUDSYrr 4143 +VPDPBUUDSZ 4144 +VPDPBUUDSZrm 4145 +VPDPBUUDSZrmb 4146 +VPDPBUUDSZrmbk 4147 +VPDPBUUDSZrmbkz 4148 +VPDPBUUDSZrmk 4149 +VPDPBUUDSZrmkz 4150 +VPDPBUUDSZrr 4151 +VPDPBUUDSZrrk 4152 +VPDPBUUDSZrrkz 4153 +VPDPBUUDSrm 4154 +VPDPBUUDSrr 4155 +VPDPBUUDYrm 4156 +VPDPBUUDYrr 4157 +VPDPBUUDZ 4158 +VPDPBUUDZrm 4159 +VPDPBUUDZrmb 4160 +VPDPBUUDZrmbk 4161 +VPDPBUUDZrmbkz 4162 +VPDPBUUDZrmk 4163 +VPDPBUUDZrmkz 4164 +VPDPBUUDZrr 4165 +VPDPBUUDZrrk 4166 +VPDPBUUDZrrkz 4167 +VPDPBUUDrm 4168 +VPDPBUUDrr 4169 +VPDPWSSDSYrm 4170 +VPDPWSSDSYrr 4171 +VPDPWSSDSZ 4172 +VPDPWSSDSZrm 4173 +VPDPWSSDSZrmb 4174 +VPDPWSSDSZrmbk 4175 +VPDPWSSDSZrmbkz 4176 +VPDPWSSDSZrmk 4177 +VPDPWSSDSZrmkz 4178 +VPDPWSSDSZrr 4179 +VPDPWSSDSZrrk 4180 +VPDPWSSDSZrrkz 4181 +VPDPWSSDSrm 4182 +VPDPWSSDSrr 4183 +VPDPWSSDYrm 4184 +VPDPWSSDYrr 4185 +VPDPWSSDZ 4186 +VPDPWSSDZrm 4187 +VPDPWSSDZrmb 4188 +VPDPWSSDZrmbk 4189 +VPDPWSSDZrmbkz 4190 +VPDPWSSDZrmk 4191 +VPDPWSSDZrmkz 4192 +VPDPWSSDZrr 4193 +VPDPWSSDZrrk 4194 +VPDPWSSDZrrkz 4195 +VPDPWSSDrm 4196 +VPDPWSSDrr 4197 +VPDPWSUDSYrm 4198 +VPDPWSUDSYrr 4199 +VPDPWSUDSZ 4200 +VPDPWSUDSZrm 4201 +VPDPWSUDSZrmb 4202 +VPDPWSUDSZrmbk 4203 +VPDPWSUDSZrmbkz 4204 +VPDPWSUDSZrmk 4205 +VPDPWSUDSZrmkz 4206 +VPDPWSUDSZrr 4207 +VPDPWSUDSZrrk 4208 +VPDPWSUDSZrrkz 4209 +VPDPWSUDSrm 4210 +VPDPWSUDSrr 4211 +VPDPWSUDYrm 4212 +VPDPWSUDYrr 4213 +VPDPWSUDZ 4214 +VPDPWSUDZrm 4215 +VPDPWSUDZrmb 4216 +VPDPWSUDZrmbk 4217 +VPDPWSUDZrmbkz 4218 +VPDPWSUDZrmk 4219 +VPDPWSUDZrmkz 4220 +VPDPWSUDZrr 4221 +VPDPWSUDZrrk 4222 +VPDPWSUDZrrkz 4223 +VPDPWSUDrm 4224 +VPDPWSUDrr 4225 +VPDPWUSDSYrm 4226 +VPDPWUSDSYrr 4227 +VPDPWUSDSZ 4228 +VPDPWUSDSZrm 4229 +VPDPWUSDSZrmb 4230 +VPDPWUSDSZrmbk 4231 +VPDPWUSDSZrmbkz 4232 +VPDPWUSDSZrmk 4233 +VPDPWUSDSZrmkz 4234 +VPDPWUSDSZrr 4235 +VPDPWUSDSZrrk 4236 +VPDPWUSDSZrrkz 4237 +VPDPWUSDSrm 4238 +VPDPWUSDSrr 4239 +VPDPWUSDYrm 4240 +VPDPWUSDYrr 4241 +VPDPWUSDZ 4242 +VPDPWUSDZrm 4243 +VPDPWUSDZrmb 4244 +VPDPWUSDZrmbk 4245 +VPDPWUSDZrmbkz 4246 +VPDPWUSDZrmk 4247 +VPDPWUSDZrmkz 4248 +VPDPWUSDZrr 4249 +VPDPWUSDZrrk 4250 +VPDPWUSDZrrkz 4251 +VPDPWUSDrm 4252 +VPDPWUSDrr 4253 +VPDPWUUDSYrm 4254 +VPDPWUUDSYrr 4255 +VPDPWUUDSZ 4256 +VPDPWUUDSZrm 4257 +VPDPWUUDSZrmb 4258 +VPDPWUUDSZrmbk 4259 +VPDPWUUDSZrmbkz 4260 +VPDPWUUDSZrmk 4261 +VPDPWUUDSZrmkz 4262 +VPDPWUUDSZrr 4263 +VPDPWUUDSZrrk 4264 +VPDPWUUDSZrrkz 4265 +VPDPWUUDSrm 4266 +VPDPWUUDSrr 4267 +VPDPWUUDYrm 4268 +VPDPWUUDYrr 4269 +VPDPWUUDZ 4270 +VPDPWUUDZrm 4271 +VPDPWUUDZrmb 4272 +VPDPWUUDZrmbk 4273 +VPDPWUUDZrmbkz 4274 +VPDPWUUDZrmk 4275 +VPDPWUUDZrmkz 4276 +VPDPWUUDZrr 4277 +VPDPWUUDZrrk 4278 +VPDPWUUDZrrkz 4279 +VPDPWUUDrm 4280 +VPDPWUUDrr 4281 +VPERM 4282 +VPERMBZ 4283 +VPERMBZrm 4284 +VPERMBZrmk 4285 +VPERMBZrmkz 4286 +VPERMBZrr 4287 +VPERMBZrrk 4288 +VPERMBZrrkz 4289 +VPERMDYrm 4290 +VPERMDYrr 4291 +VPERMDZ 4292 +VPERMDZrm 4293 +VPERMDZrmb 4294 +VPERMDZrmbk 4295 +VPERMDZrmbkz 4296 +VPERMDZrmk 4297 +VPERMDZrmkz 4298 +VPERMDZrr 4299 +VPERMDZrrk 4300 +VPERMDZrrkz 4301 +VPERMI 4302 +VPERMIL 4303 +VPERMILPDYmi 4304 +VPERMILPDYri 4305 +VPERMILPDYrm 4306 +VPERMILPDYrr 4307 +VPERMILPDZ 4308 +VPERMILPDZmbi 4309 +VPERMILPDZmbik 4310 +VPERMILPDZmbikz 4311 +VPERMILPDZmi 4312 +VPERMILPDZmik 4313 +VPERMILPDZmikz 4314 +VPERMILPDZri 4315 +VPERMILPDZrik 4316 +VPERMILPDZrikz 4317 +VPERMILPDZrm 4318 +VPERMILPDZrmb 4319 +VPERMILPDZrmbk 4320 +VPERMILPDZrmbkz 4321 +VPERMILPDZrmk 4322 +VPERMILPDZrmkz 4323 +VPERMILPDZrr 4324 +VPERMILPDZrrk 4325 +VPERMILPDZrrkz 4326 +VPERMILPDmi 4327 +VPERMILPDri 4328 +VPERMILPDrm 4329 +VPERMILPDrr 4330 +VPERMILPSYmi 4331 +VPERMILPSYri 4332 +VPERMILPSYrm 4333 +VPERMILPSYrr 4334 +VPERMILPSZ 4335 +VPERMILPSZmbi 4336 +VPERMILPSZmbik 4337 +VPERMILPSZmbikz 4338 +VPERMILPSZmi 4339 +VPERMILPSZmik 4340 +VPERMILPSZmikz 4341 +VPERMILPSZri 4342 +VPERMILPSZrik 4343 +VPERMILPSZrikz 4344 +VPERMILPSZrm 4345 +VPERMILPSZrmb 4346 +VPERMILPSZrmbk 4347 +VPERMILPSZrmbkz 4348 +VPERMILPSZrmk 4349 +VPERMILPSZrmkz 4350 +VPERMILPSZrr 4351 +VPERMILPSZrrk 4352 +VPERMILPSZrrkz 4353 +VPERMILPSmi 4354 +VPERMILPSri 4355 +VPERMILPSrm 4356 +VPERMILPSrr 4357 +VPERMPDYmi 4358 +VPERMPDYri 4359 +VPERMPDZ 4360 +VPERMPDZmbi 4361 +VPERMPDZmbik 4362 +VPERMPDZmbikz 4363 +VPERMPDZmi 4364 +VPERMPDZmik 4365 +VPERMPDZmikz 4366 +VPERMPDZri 4367 +VPERMPDZrik 4368 +VPERMPDZrikz 4369 +VPERMPDZrm 4370 +VPERMPDZrmb 4371 +VPERMPDZrmbk 4372 +VPERMPDZrmbkz 4373 +VPERMPDZrmk 4374 +VPERMPDZrmkz 4375 +VPERMPDZrr 4376 +VPERMPDZrrk 4377 +VPERMPDZrrkz 4378 +VPERMPSYrm 4379 +VPERMPSYrr 4380 +VPERMPSZ 4381 +VPERMPSZrm 4382 +VPERMPSZrmb 4383 +VPERMPSZrmbk 4384 +VPERMPSZrmbkz 4385 +VPERMPSZrmk 4386 +VPERMPSZrmkz 4387 +VPERMPSZrr 4388 +VPERMPSZrrk 4389 +VPERMPSZrrkz 4390 +VPERMQYmi 4391 +VPERMQYri 4392 +VPERMQZ 4393 +VPERMQZmbi 4394 +VPERMQZmbik 4395 +VPERMQZmbikz 4396 +VPERMQZmi 4397 +VPERMQZmik 4398 +VPERMQZmikz 4399 +VPERMQZri 4400 +VPERMQZrik 4401 +VPERMQZrikz 4402 +VPERMQZrm 4403 +VPERMQZrmb 4404 +VPERMQZrmbk 4405 +VPERMQZrmbkz 4406 +VPERMQZrmk 4407 +VPERMQZrmkz 4408 +VPERMQZrr 4409 +VPERMQZrrk 4410 +VPERMQZrrkz 4411 +VPERMT 4412 +VPERMWZ 4413 +VPERMWZrm 4414 +VPERMWZrmk 4415 +VPERMWZrmkz 4416 +VPERMWZrr 4417 +VPERMWZrrk 4418 +VPERMWZrrkz 4419 +VPEXPANDBZ 4420 +VPEXPANDBZrm 4421 +VPEXPANDBZrmk 4422 +VPEXPANDBZrmkz 4423 +VPEXPANDBZrr 4424 +VPEXPANDBZrrk 4425 +VPEXPANDBZrrkz 4426 +VPEXPANDDZ 4427 +VPEXPANDDZrm 4428 +VPEXPANDDZrmk 4429 +VPEXPANDDZrmkz 4430 +VPEXPANDDZrr 4431 +VPEXPANDDZrrk 4432 +VPEXPANDDZrrkz 4433 +VPEXPANDQZ 4434 +VPEXPANDQZrm 4435 +VPEXPANDQZrmk 4436 +VPEXPANDQZrmkz 4437 +VPEXPANDQZrr 4438 +VPEXPANDQZrrk 4439 +VPEXPANDQZrrkz 4440 +VPEXPANDWZ 4441 +VPEXPANDWZrm 4442 +VPEXPANDWZrmk 4443 +VPEXPANDWZrmkz 4444 +VPEXPANDWZrr 4445 +VPEXPANDWZrrk 4446 +VPEXPANDWZrrkz 4447 +VPEXTRBZmri 4448 +VPEXTRBZrri 4449 +VPEXTRBmri 4450 +VPEXTRBrri 4451 +VPEXTRDZmri 4452 +VPEXTRDZrri 4453 +VPEXTRDmri 4454 +VPEXTRDrri 4455 +VPEXTRQZmri 4456 +VPEXTRQZrri 4457 +VPEXTRQmri 4458 +VPEXTRQrri 4459 +VPEXTRWZmri 4460 +VPEXTRWZrri 4461 +VPEXTRWZrri_REV 4462 +VPEXTRWmri 4463 +VPEXTRWrri 4464 +VPEXTRWrri_REV 4465 +VPGATHERDDYrm 4466 +VPGATHERDDZ 4467 +VPGATHERDDZrm 4468 +VPGATHERDDrm 4469 +VPGATHERDQYrm 4470 +VPGATHERDQZ 4471 +VPGATHERDQZrm 4472 +VPGATHERDQrm 4473 +VPGATHERQDYrm 4474 +VPGATHERQDZ 4475 +VPGATHERQDZrm 4476 +VPGATHERQDrm 4477 +VPGATHERQQYrm 4478 +VPGATHERQQZ 4479 +VPGATHERQQZrm 4480 +VPGATHERQQrm 4481 +VPHADDBDrm 4482 +VPHADDBDrr 4483 +VPHADDBQrm 4484 +VPHADDBQrr 4485 +VPHADDBWrm 4486 +VPHADDBWrr 4487 +VPHADDDQrm 4488 +VPHADDDQrr 4489 +VPHADDDYrm 4490 +VPHADDDYrr 4491 +VPHADDDrm 4492 +VPHADDDrr 4493 +VPHADDSWYrm 4494 +VPHADDSWYrr 4495 +VPHADDSWrm 4496 +VPHADDSWrr 4497 +VPHADDUBDrm 4498 +VPHADDUBDrr 4499 +VPHADDUBQrm 4500 +VPHADDUBQrr 4501 +VPHADDUBWrm 4502 +VPHADDUBWrr 4503 +VPHADDUDQrm 4504 +VPHADDUDQrr 4505 +VPHADDUWDrm 4506 +VPHADDUWDrr 4507 +VPHADDUWQrm 4508 +VPHADDUWQrr 4509 +VPHADDWDrm 4510 +VPHADDWDrr 4511 +VPHADDWQrm 4512 +VPHADDWQrr 4513 +VPHADDWYrm 4514 +VPHADDWYrr 4515 +VPHADDWrm 4516 +VPHADDWrr 4517 +VPHMINPOSUWrm 4518 +VPHMINPOSUWrr 4519 +VPHSUBBWrm 4520 +VPHSUBBWrr 4521 +VPHSUBDQrm 4522 +VPHSUBDQrr 4523 +VPHSUBDYrm 4524 +VPHSUBDYrr 4525 +VPHSUBDrm 4526 +VPHSUBDrr 4527 +VPHSUBSWYrm 4528 +VPHSUBSWYrr 4529 +VPHSUBSWrm 4530 +VPHSUBSWrr 4531 +VPHSUBWDrm 4532 +VPHSUBWDrr 4533 +VPHSUBWYrm 4534 +VPHSUBWYrr 4535 +VPHSUBWrm 4536 +VPHSUBWrr 4537 +VPINSRBZrmi 4538 +VPINSRBZrri 4539 +VPINSRBrmi 4540 +VPINSRBrri 4541 +VPINSRDZrmi 4542 +VPINSRDZrri 4543 +VPINSRDrmi 4544 +VPINSRDrri 4545 +VPINSRQZrmi 4546 +VPINSRQZrri 4547 +VPINSRQrmi 4548 +VPINSRQrri 4549 +VPINSRWZrmi 4550 +VPINSRWZrri 4551 +VPINSRWrmi 4552 +VPINSRWrri 4553 +VPLZCNTDZ 4554 +VPLZCNTDZrm 4555 +VPLZCNTDZrmb 4556 +VPLZCNTDZrmbk 4557 +VPLZCNTDZrmbkz 4558 +VPLZCNTDZrmk 4559 +VPLZCNTDZrmkz 4560 +VPLZCNTDZrr 4561 +VPLZCNTDZrrk 4562 +VPLZCNTDZrrkz 4563 +VPLZCNTQZ 4564 +VPLZCNTQZrm 4565 +VPLZCNTQZrmb 4566 +VPLZCNTQZrmbk 4567 +VPLZCNTQZrmbkz 4568 +VPLZCNTQZrmk 4569 +VPLZCNTQZrmkz 4570 +VPLZCNTQZrr 4571 +VPLZCNTQZrrk 4572 +VPLZCNTQZrrkz 4573 +VPMACSDDrm 4574 +VPMACSDDrr 4575 +VPMACSDQHrm 4576 +VPMACSDQHrr 4577 +VPMACSDQLrm 4578 +VPMACSDQLrr 4579 +VPMACSSDDrm 4580 +VPMACSSDDrr 4581 +VPMACSSDQHrm 4582 +VPMACSSDQHrr 4583 +VPMACSSDQLrm 4584 +VPMACSSDQLrr 4585 +VPMACSSWDrm 4586 +VPMACSSWDrr 4587 +VPMACSSWWrm 4588 +VPMACSSWWrr 4589 +VPMACSWDrm 4590 +VPMACSWDrr 4591 +VPMACSWWrm 4592 +VPMACSWWrr 4593 +VPMADCSSWDrm 4594 +VPMADCSSWDrr 4595 +VPMADCSWDrm 4596 +VPMADCSWDrr 4597 +VPMADD 4598 +VPMADDUBSWYrm 4599 +VPMADDUBSWYrr 4600 +VPMADDUBSWZ 4601 +VPMADDUBSWZrm 4602 +VPMADDUBSWZrmk 4603 +VPMADDUBSWZrmkz 4604 +VPMADDUBSWZrr 4605 +VPMADDUBSWZrrk 4606 +VPMADDUBSWZrrkz 4607 +VPMADDUBSWrm 4608 +VPMADDUBSWrr 4609 +VPMADDWDYrm 4610 +VPMADDWDYrr 4611 +VPMADDWDZ 4612 +VPMADDWDZrm 4613 +VPMADDWDZrmk 4614 +VPMADDWDZrmkz 4615 +VPMADDWDZrr 4616 +VPMADDWDZrrk 4617 +VPMADDWDZrrkz 4618 +VPMADDWDrm 4619 +VPMADDWDrr 4620 +VPMASKMOVDYmr 4621 +VPMASKMOVDYrm 4622 +VPMASKMOVDmr 4623 +VPMASKMOVDrm 4624 +VPMASKMOVQYmr 4625 +VPMASKMOVQYrm 4626 +VPMASKMOVQmr 4627 +VPMASKMOVQrm 4628 +VPMAXSBYrm 4629 +VPMAXSBYrr 4630 +VPMAXSBZ 4631 +VPMAXSBZrm 4632 +VPMAXSBZrmk 4633 +VPMAXSBZrmkz 4634 +VPMAXSBZrr 4635 +VPMAXSBZrrk 4636 +VPMAXSBZrrkz 4637 +VPMAXSBrm 4638 +VPMAXSBrr 4639 +VPMAXSDYrm 4640 +VPMAXSDYrr 4641 +VPMAXSDZ 4642 +VPMAXSDZrm 4643 +VPMAXSDZrmb 4644 +VPMAXSDZrmbk 4645 +VPMAXSDZrmbkz 4646 +VPMAXSDZrmk 4647 +VPMAXSDZrmkz 4648 +VPMAXSDZrr 4649 +VPMAXSDZrrk 4650 +VPMAXSDZrrkz 4651 +VPMAXSDrm 4652 +VPMAXSDrr 4653 +VPMAXSQZ 4654 +VPMAXSQZrm 4655 +VPMAXSQZrmb 4656 +VPMAXSQZrmbk 4657 +VPMAXSQZrmbkz 4658 +VPMAXSQZrmk 4659 +VPMAXSQZrmkz 4660 +VPMAXSQZrr 4661 +VPMAXSQZrrk 4662 +VPMAXSQZrrkz 4663 +VPMAXSWYrm 4664 +VPMAXSWYrr 4665 +VPMAXSWZ 4666 +VPMAXSWZrm 4667 +VPMAXSWZrmk 4668 +VPMAXSWZrmkz 4669 +VPMAXSWZrr 4670 +VPMAXSWZrrk 4671 +VPMAXSWZrrkz 4672 +VPMAXSWrm 4673 +VPMAXSWrr 4674 +VPMAXUBYrm 4675 +VPMAXUBYrr 4676 +VPMAXUBZ 4677 +VPMAXUBZrm 4678 +VPMAXUBZrmk 4679 +VPMAXUBZrmkz 4680 +VPMAXUBZrr 4681 +VPMAXUBZrrk 4682 +VPMAXUBZrrkz 4683 +VPMAXUBrm 4684 +VPMAXUBrr 4685 +VPMAXUDYrm 4686 +VPMAXUDYrr 4687 +VPMAXUDZ 4688 +VPMAXUDZrm 4689 +VPMAXUDZrmb 4690 +VPMAXUDZrmbk 4691 +VPMAXUDZrmbkz 4692 +VPMAXUDZrmk 4693 +VPMAXUDZrmkz 4694 +VPMAXUDZrr 4695 +VPMAXUDZrrk 4696 +VPMAXUDZrrkz 4697 +VPMAXUDrm 4698 +VPMAXUDrr 4699 +VPMAXUQZ 4700 +VPMAXUQZrm 4701 +VPMAXUQZrmb 4702 +VPMAXUQZrmbk 4703 +VPMAXUQZrmbkz 4704 +VPMAXUQZrmk 4705 +VPMAXUQZrmkz 4706 +VPMAXUQZrr 4707 +VPMAXUQZrrk 4708 +VPMAXUQZrrkz 4709 +VPMAXUWYrm 4710 +VPMAXUWYrr 4711 +VPMAXUWZ 4712 +VPMAXUWZrm 4713 +VPMAXUWZrmk 4714 +VPMAXUWZrmkz 4715 +VPMAXUWZrr 4716 +VPMAXUWZrrk 4717 +VPMAXUWZrrkz 4718 +VPMAXUWrm 4719 +VPMAXUWrr 4720 +VPMINSBYrm 4721 +VPMINSBYrr 4722 +VPMINSBZ 4723 +VPMINSBZrm 4724 +VPMINSBZrmk 4725 +VPMINSBZrmkz 4726 +VPMINSBZrr 4727 +VPMINSBZrrk 4728 +VPMINSBZrrkz 4729 +VPMINSBrm 4730 +VPMINSBrr 4731 +VPMINSDYrm 4732 +VPMINSDYrr 4733 +VPMINSDZ 4734 +VPMINSDZrm 4735 +VPMINSDZrmb 4736 +VPMINSDZrmbk 4737 +VPMINSDZrmbkz 4738 +VPMINSDZrmk 4739 +VPMINSDZrmkz 4740 +VPMINSDZrr 4741 +VPMINSDZrrk 4742 +VPMINSDZrrkz 4743 +VPMINSDrm 4744 +VPMINSDrr 4745 +VPMINSQZ 4746 +VPMINSQZrm 4747 +VPMINSQZrmb 4748 +VPMINSQZrmbk 4749 +VPMINSQZrmbkz 4750 +VPMINSQZrmk 4751 +VPMINSQZrmkz 4752 +VPMINSQZrr 4753 +VPMINSQZrrk 4754 +VPMINSQZrrkz 4755 +VPMINSWYrm 4756 +VPMINSWYrr 4757 +VPMINSWZ 4758 +VPMINSWZrm 4759 +VPMINSWZrmk 4760 +VPMINSWZrmkz 4761 +VPMINSWZrr 4762 +VPMINSWZrrk 4763 +VPMINSWZrrkz 4764 +VPMINSWrm 4765 +VPMINSWrr 4766 +VPMINUBYrm 4767 +VPMINUBYrr 4768 +VPMINUBZ 4769 +VPMINUBZrm 4770 +VPMINUBZrmk 4771 +VPMINUBZrmkz 4772 +VPMINUBZrr 4773 +VPMINUBZrrk 4774 +VPMINUBZrrkz 4775 +VPMINUBrm 4776 +VPMINUBrr 4777 +VPMINUDYrm 4778 +VPMINUDYrr 4779 +VPMINUDZ 4780 +VPMINUDZrm 4781 +VPMINUDZrmb 4782 +VPMINUDZrmbk 4783 +VPMINUDZrmbkz 4784 +VPMINUDZrmk 4785 +VPMINUDZrmkz 4786 +VPMINUDZrr 4787 +VPMINUDZrrk 4788 +VPMINUDZrrkz 4789 +VPMINUDrm 4790 +VPMINUDrr 4791 +VPMINUQZ 4792 +VPMINUQZrm 4793 +VPMINUQZrmb 4794 +VPMINUQZrmbk 4795 +VPMINUQZrmbkz 4796 +VPMINUQZrmk 4797 +VPMINUQZrmkz 4798 +VPMINUQZrr 4799 +VPMINUQZrrk 4800 +VPMINUQZrrkz 4801 +VPMINUWYrm 4802 +VPMINUWYrr 4803 +VPMINUWZ 4804 +VPMINUWZrm 4805 +VPMINUWZrmk 4806 +VPMINUWZrmkz 4807 +VPMINUWZrr 4808 +VPMINUWZrrk 4809 +VPMINUWZrrkz 4810 +VPMINUWrm 4811 +VPMINUWrr 4812 +VPMOVB 4813 +VPMOVD 4814 +VPMOVDBZ 4815 +VPMOVDBZmr 4816 +VPMOVDBZmrk 4817 +VPMOVDBZrr 4818 +VPMOVDBZrrk 4819 +VPMOVDBZrrkz 4820 +VPMOVDWZ 4821 +VPMOVDWZmr 4822 +VPMOVDWZmrk 4823 +VPMOVDWZrr 4824 +VPMOVDWZrrk 4825 +VPMOVDWZrrkz 4826 +VPMOVM 4827 +VPMOVMSKBYrr 4828 +VPMOVMSKBrr 4829 +VPMOVQ 4830 +VPMOVQBZ 4831 +VPMOVQBZmr 4832 +VPMOVQBZmrk 4833 +VPMOVQBZrr 4834 +VPMOVQBZrrk 4835 +VPMOVQBZrrkz 4836 +VPMOVQDZ 4837 +VPMOVQDZmr 4838 +VPMOVQDZmrk 4839 +VPMOVQDZrr 4840 +VPMOVQDZrrk 4841 +VPMOVQDZrrkz 4842 +VPMOVQWZ 4843 +VPMOVQWZmr 4844 +VPMOVQWZmrk 4845 +VPMOVQWZrr 4846 +VPMOVQWZrrk 4847 +VPMOVQWZrrkz 4848 +VPMOVSDBZ 4849 +VPMOVSDBZmr 4850 +VPMOVSDBZmrk 4851 +VPMOVSDBZrr 4852 +VPMOVSDBZrrk 4853 +VPMOVSDBZrrkz 4854 +VPMOVSDWZ 4855 +VPMOVSDWZmr 4856 +VPMOVSDWZmrk 4857 +VPMOVSDWZrr 4858 +VPMOVSDWZrrk 4859 +VPMOVSDWZrrkz 4860 +VPMOVSQBZ 4861 +VPMOVSQBZmr 4862 +VPMOVSQBZmrk 4863 +VPMOVSQBZrr 4864 +VPMOVSQBZrrk 4865 +VPMOVSQBZrrkz 4866 +VPMOVSQDZ 4867 +VPMOVSQDZmr 4868 +VPMOVSQDZmrk 4869 +VPMOVSQDZrr 4870 +VPMOVSQDZrrk 4871 +VPMOVSQDZrrkz 4872 +VPMOVSQWZ 4873 +VPMOVSQWZmr 4874 +VPMOVSQWZmrk 4875 +VPMOVSQWZrr 4876 +VPMOVSQWZrrk 4877 +VPMOVSQWZrrkz 4878 +VPMOVSWBZ 4879 +VPMOVSWBZmr 4880 +VPMOVSWBZmrk 4881 +VPMOVSWBZrr 4882 +VPMOVSWBZrrk 4883 +VPMOVSWBZrrkz 4884 +VPMOVSXBDYrm 4885 +VPMOVSXBDYrr 4886 +VPMOVSXBDZ 4887 +VPMOVSXBDZrm 4888 +VPMOVSXBDZrmk 4889 +VPMOVSXBDZrmkz 4890 +VPMOVSXBDZrr 4891 +VPMOVSXBDZrrk 4892 +VPMOVSXBDZrrkz 4893 +VPMOVSXBDrm 4894 +VPMOVSXBDrr 4895 +VPMOVSXBQYrm 4896 +VPMOVSXBQYrr 4897 +VPMOVSXBQZ 4898 +VPMOVSXBQZrm 4899 +VPMOVSXBQZrmk 4900 +VPMOVSXBQZrmkz 4901 +VPMOVSXBQZrr 4902 +VPMOVSXBQZrrk 4903 +VPMOVSXBQZrrkz 4904 +VPMOVSXBQrm 4905 +VPMOVSXBQrr 4906 +VPMOVSXBWYrm 4907 +VPMOVSXBWYrr 4908 +VPMOVSXBWZ 4909 +VPMOVSXBWZrm 4910 +VPMOVSXBWZrmk 4911 +VPMOVSXBWZrmkz 4912 +VPMOVSXBWZrr 4913 +VPMOVSXBWZrrk 4914 +VPMOVSXBWZrrkz 4915 +VPMOVSXBWrm 4916 +VPMOVSXBWrr 4917 +VPMOVSXDQYrm 4918 +VPMOVSXDQYrr 4919 +VPMOVSXDQZ 4920 +VPMOVSXDQZrm 4921 +VPMOVSXDQZrmk 4922 +VPMOVSXDQZrmkz 4923 +VPMOVSXDQZrr 4924 +VPMOVSXDQZrrk 4925 +VPMOVSXDQZrrkz 4926 +VPMOVSXDQrm 4927 +VPMOVSXDQrr 4928 +VPMOVSXWDYrm 4929 +VPMOVSXWDYrr 4930 +VPMOVSXWDZ 4931 +VPMOVSXWDZrm 4932 +VPMOVSXWDZrmk 4933 +VPMOVSXWDZrmkz 4934 +VPMOVSXWDZrr 4935 +VPMOVSXWDZrrk 4936 +VPMOVSXWDZrrkz 4937 +VPMOVSXWDrm 4938 +VPMOVSXWDrr 4939 +VPMOVSXWQYrm 4940 +VPMOVSXWQYrr 4941 +VPMOVSXWQZ 4942 +VPMOVSXWQZrm 4943 +VPMOVSXWQZrmk 4944 +VPMOVSXWQZrmkz 4945 +VPMOVSXWQZrr 4946 +VPMOVSXWQZrrk 4947 +VPMOVSXWQZrrkz 4948 +VPMOVSXWQrm 4949 +VPMOVSXWQrr 4950 +VPMOVUSDBZ 4951 +VPMOVUSDBZmr 4952 +VPMOVUSDBZmrk 4953 +VPMOVUSDBZrr 4954 +VPMOVUSDBZrrk 4955 +VPMOVUSDBZrrkz 4956 +VPMOVUSDWZ 4957 +VPMOVUSDWZmr 4958 +VPMOVUSDWZmrk 4959 +VPMOVUSDWZrr 4960 +VPMOVUSDWZrrk 4961 +VPMOVUSDWZrrkz 4962 +VPMOVUSQBZ 4963 +VPMOVUSQBZmr 4964 +VPMOVUSQBZmrk 4965 +VPMOVUSQBZrr 4966 +VPMOVUSQBZrrk 4967 +VPMOVUSQBZrrkz 4968 +VPMOVUSQDZ 4969 +VPMOVUSQDZmr 4970 +VPMOVUSQDZmrk 4971 +VPMOVUSQDZrr 4972 +VPMOVUSQDZrrk 4973 +VPMOVUSQDZrrkz 4974 +VPMOVUSQWZ 4975 +VPMOVUSQWZmr 4976 +VPMOVUSQWZmrk 4977 +VPMOVUSQWZrr 4978 +VPMOVUSQWZrrk 4979 +VPMOVUSQWZrrkz 4980 +VPMOVUSWBZ 4981 +VPMOVUSWBZmr 4982 +VPMOVUSWBZmrk 4983 +VPMOVUSWBZrr 4984 +VPMOVUSWBZrrk 4985 +VPMOVUSWBZrrkz 4986 +VPMOVW 4987 +VPMOVWBZ 4988 +VPMOVWBZmr 4989 +VPMOVWBZmrk 4990 +VPMOVWBZrr 4991 +VPMOVWBZrrk 4992 +VPMOVWBZrrkz 4993 +VPMOVZXBDYrm 4994 +VPMOVZXBDYrr 4995 +VPMOVZXBDZ 4996 +VPMOVZXBDZrm 4997 +VPMOVZXBDZrmk 4998 +VPMOVZXBDZrmkz 4999 +VPMOVZXBDZrr 5000 +VPMOVZXBDZrrk 5001 +VPMOVZXBDZrrkz 5002 +VPMOVZXBDrm 5003 +VPMOVZXBDrr 5004 +VPMOVZXBQYrm 5005 +VPMOVZXBQYrr 5006 +VPMOVZXBQZ 5007 +VPMOVZXBQZrm 5008 +VPMOVZXBQZrmk 5009 +VPMOVZXBQZrmkz 5010 +VPMOVZXBQZrr 5011 +VPMOVZXBQZrrk 5012 +VPMOVZXBQZrrkz 5013 +VPMOVZXBQrm 5014 +VPMOVZXBQrr 5015 +VPMOVZXBWYrm 5016 +VPMOVZXBWYrr 5017 +VPMOVZXBWZ 5018 +VPMOVZXBWZrm 5019 +VPMOVZXBWZrmk 5020 +VPMOVZXBWZrmkz 5021 +VPMOVZXBWZrr 5022 +VPMOVZXBWZrrk 5023 +VPMOVZXBWZrrkz 5024 +VPMOVZXBWrm 5025 +VPMOVZXBWrr 5026 +VPMOVZXDQYrm 5027 +VPMOVZXDQYrr 5028 +VPMOVZXDQZ 5029 +VPMOVZXDQZrm 5030 +VPMOVZXDQZrmk 5031 +VPMOVZXDQZrmkz 5032 +VPMOVZXDQZrr 5033 +VPMOVZXDQZrrk 5034 +VPMOVZXDQZrrkz 5035 +VPMOVZXDQrm 5036 +VPMOVZXDQrr 5037 +VPMOVZXWDYrm 5038 +VPMOVZXWDYrr 5039 +VPMOVZXWDZ 5040 +VPMOVZXWDZrm 5041 +VPMOVZXWDZrmk 5042 +VPMOVZXWDZrmkz 5043 +VPMOVZXWDZrr 5044 +VPMOVZXWDZrrk 5045 +VPMOVZXWDZrrkz 5046 +VPMOVZXWDrm 5047 +VPMOVZXWDrr 5048 +VPMOVZXWQYrm 5049 +VPMOVZXWQYrr 5050 +VPMOVZXWQZ 5051 +VPMOVZXWQZrm 5052 +VPMOVZXWQZrmk 5053 +VPMOVZXWQZrmkz 5054 +VPMOVZXWQZrr 5055 +VPMOVZXWQZrrk 5056 +VPMOVZXWQZrrkz 5057 +VPMOVZXWQrm 5058 +VPMOVZXWQrr 5059 +VPMULDQYrm 5060 +VPMULDQYrr 5061 +VPMULDQZ 5062 +VPMULDQZrm 5063 +VPMULDQZrmb 5064 +VPMULDQZrmbk 5065 +VPMULDQZrmbkz 5066 +VPMULDQZrmk 5067 +VPMULDQZrmkz 5068 +VPMULDQZrr 5069 +VPMULDQZrrk 5070 +VPMULDQZrrkz 5071 +VPMULDQrm 5072 +VPMULDQrr 5073 +VPMULHRSWYrm 5074 +VPMULHRSWYrr 5075 +VPMULHRSWZ 5076 +VPMULHRSWZrm 5077 +VPMULHRSWZrmk 5078 +VPMULHRSWZrmkz 5079 +VPMULHRSWZrr 5080 +VPMULHRSWZrrk 5081 +VPMULHRSWZrrkz 5082 +VPMULHRSWrm 5083 +VPMULHRSWrr 5084 +VPMULHUWYrm 5085 +VPMULHUWYrr 5086 +VPMULHUWZ 5087 +VPMULHUWZrm 5088 +VPMULHUWZrmk 5089 +VPMULHUWZrmkz 5090 +VPMULHUWZrr 5091 +VPMULHUWZrrk 5092 +VPMULHUWZrrkz 5093 +VPMULHUWrm 5094 +VPMULHUWrr 5095 +VPMULHWYrm 5096 +VPMULHWYrr 5097 +VPMULHWZ 5098 +VPMULHWZrm 5099 +VPMULHWZrmk 5100 +VPMULHWZrmkz 5101 +VPMULHWZrr 5102 +VPMULHWZrrk 5103 +VPMULHWZrrkz 5104 +VPMULHWrm 5105 +VPMULHWrr 5106 +VPMULLDYrm 5107 +VPMULLDYrr 5108 +VPMULLDZ 5109 +VPMULLDZrm 5110 +VPMULLDZrmb 5111 +VPMULLDZrmbk 5112 +VPMULLDZrmbkz 5113 +VPMULLDZrmk 5114 +VPMULLDZrmkz 5115 +VPMULLDZrr 5116 +VPMULLDZrrk 5117 +VPMULLDZrrkz 5118 +VPMULLDrm 5119 +VPMULLDrr 5120 +VPMULLQZ 5121 +VPMULLQZrm 5122 +VPMULLQZrmb 5123 +VPMULLQZrmbk 5124 +VPMULLQZrmbkz 5125 +VPMULLQZrmk 5126 +VPMULLQZrmkz 5127 +VPMULLQZrr 5128 +VPMULLQZrrk 5129 +VPMULLQZrrkz 5130 +VPMULLWYrm 5131 +VPMULLWYrr 5132 +VPMULLWZ 5133 +VPMULLWZrm 5134 +VPMULLWZrmk 5135 +VPMULLWZrmkz 5136 +VPMULLWZrr 5137 +VPMULLWZrrk 5138 +VPMULLWZrrkz 5139 +VPMULLWrm 5140 +VPMULLWrr 5141 +VPMULTISHIFTQBZ 5142 +VPMULTISHIFTQBZrm 5143 +VPMULTISHIFTQBZrmb 5144 +VPMULTISHIFTQBZrmbk 5145 +VPMULTISHIFTQBZrmbkz 5146 +VPMULTISHIFTQBZrmk 5147 +VPMULTISHIFTQBZrmkz 5148 +VPMULTISHIFTQBZrr 5149 +VPMULTISHIFTQBZrrk 5150 +VPMULTISHIFTQBZrrkz 5151 +VPMULUDQYrm 5152 +VPMULUDQYrr 5153 +VPMULUDQZ 5154 +VPMULUDQZrm 5155 +VPMULUDQZrmb 5156 +VPMULUDQZrmbk 5157 +VPMULUDQZrmbkz 5158 +VPMULUDQZrmk 5159 +VPMULUDQZrmkz 5160 +VPMULUDQZrr 5161 +VPMULUDQZrrk 5162 +VPMULUDQZrrkz 5163 +VPMULUDQrm 5164 +VPMULUDQrr 5165 +VPOPCNTBZ 5166 +VPOPCNTBZrm 5167 +VPOPCNTBZrmk 5168 +VPOPCNTBZrmkz 5169 +VPOPCNTBZrr 5170 +VPOPCNTBZrrk 5171 +VPOPCNTBZrrkz 5172 +VPOPCNTDZ 5173 +VPOPCNTDZrm 5174 +VPOPCNTDZrmb 5175 +VPOPCNTDZrmbk 5176 +VPOPCNTDZrmbkz 5177 +VPOPCNTDZrmk 5178 +VPOPCNTDZrmkz 5179 +VPOPCNTDZrr 5180 +VPOPCNTDZrrk 5181 +VPOPCNTDZrrkz 5182 +VPOPCNTQZ 5183 +VPOPCNTQZrm 5184 +VPOPCNTQZrmb 5185 +VPOPCNTQZrmbk 5186 +VPOPCNTQZrmbkz 5187 +VPOPCNTQZrmk 5188 +VPOPCNTQZrmkz 5189 +VPOPCNTQZrr 5190 +VPOPCNTQZrrk 5191 +VPOPCNTQZrrkz 5192 +VPOPCNTWZ 5193 +VPOPCNTWZrm 5194 +VPOPCNTWZrmk 5195 +VPOPCNTWZrmkz 5196 +VPOPCNTWZrr 5197 +VPOPCNTWZrrk 5198 +VPOPCNTWZrrkz 5199 +VPORDZ 5200 +VPORDZrm 5201 +VPORDZrmb 5202 +VPORDZrmbk 5203 +VPORDZrmbkz 5204 +VPORDZrmk 5205 +VPORDZrmkz 5206 +VPORDZrr 5207 +VPORDZrrk 5208 +VPORDZrrkz 5209 +VPORQZ 5210 +VPORQZrm 5211 +VPORQZrmb 5212 +VPORQZrmbk 5213 +VPORQZrmbkz 5214 +VPORQZrmk 5215 +VPORQZrmkz 5216 +VPORQZrr 5217 +VPORQZrrk 5218 +VPORQZrrkz 5219 +VPORYrm 5220 +VPORYrr 5221 +VPORrm 5222 +VPORrr 5223 +VPPERMrmr 5224 +VPPERMrrm 5225 +VPPERMrrr 5226 +VPPERMrrr_REV 5227 +VPROLDZ 5228 +VPROLDZmbi 5229 +VPROLDZmbik 5230 +VPROLDZmbikz 5231 +VPROLDZmi 5232 +VPROLDZmik 5233 +VPROLDZmikz 5234 +VPROLDZri 5235 +VPROLDZrik 5236 +VPROLDZrikz 5237 +VPROLQZ 5238 +VPROLQZmbi 5239 +VPROLQZmbik 5240 +VPROLQZmbikz 5241 +VPROLQZmi 5242 +VPROLQZmik 5243 +VPROLQZmikz 5244 +VPROLQZri 5245 +VPROLQZrik 5246 +VPROLQZrikz 5247 +VPROLVDZ 5248 +VPROLVDZrm 5249 +VPROLVDZrmb 5250 +VPROLVDZrmbk 5251 +VPROLVDZrmbkz 5252 +VPROLVDZrmk 5253 +VPROLVDZrmkz 5254 +VPROLVDZrr 5255 +VPROLVDZrrk 5256 +VPROLVDZrrkz 5257 +VPROLVQZ 5258 +VPROLVQZrm 5259 +VPROLVQZrmb 5260 +VPROLVQZrmbk 5261 +VPROLVQZrmbkz 5262 +VPROLVQZrmk 5263 +VPROLVQZrmkz 5264 +VPROLVQZrr 5265 +VPROLVQZrrk 5266 +VPROLVQZrrkz 5267 +VPRORDZ 5268 +VPRORDZmbi 5269 +VPRORDZmbik 5270 +VPRORDZmbikz 5271 +VPRORDZmi 5272 +VPRORDZmik 5273 +VPRORDZmikz 5274 +VPRORDZri 5275 +VPRORDZrik 5276 +VPRORDZrikz 5277 +VPRORQZ 5278 +VPRORQZmbi 5279 +VPRORQZmbik 5280 +VPRORQZmbikz 5281 +VPRORQZmi 5282 +VPRORQZmik 5283 +VPRORQZmikz 5284 +VPRORQZri 5285 +VPRORQZrik 5286 +VPRORQZrikz 5287 +VPRORVDZ 5288 +VPRORVDZrm 5289 +VPRORVDZrmb 5290 +VPRORVDZrmbk 5291 +VPRORVDZrmbkz 5292 +VPRORVDZrmk 5293 +VPRORVDZrmkz 5294 +VPRORVDZrr 5295 +VPRORVDZrrk 5296 +VPRORVDZrrkz 5297 +VPRORVQZ 5298 +VPRORVQZrm 5299 +VPRORVQZrmb 5300 +VPRORVQZrmbk 5301 +VPRORVQZrmbkz 5302 +VPRORVQZrmk 5303 +VPRORVQZrmkz 5304 +VPRORVQZrr 5305 +VPRORVQZrrk 5306 +VPRORVQZrrkz 5307 +VPROTBmi 5308 +VPROTBmr 5309 +VPROTBri 5310 +VPROTBrm 5311 +VPROTBrr 5312 +VPROTBrr_REV 5313 +VPROTDmi 5314 +VPROTDmr 5315 +VPROTDri 5316 +VPROTDrm 5317 +VPROTDrr 5318 +VPROTDrr_REV 5319 +VPROTQmi 5320 +VPROTQmr 5321 +VPROTQri 5322 +VPROTQrm 5323 +VPROTQrr 5324 +VPROTQrr_REV 5325 +VPROTWmi 5326 +VPROTWmr 5327 +VPROTWri 5328 +VPROTWrm 5329 +VPROTWrr 5330 +VPROTWrr_REV 5331 +VPSADBWYrm 5332 +VPSADBWYrr 5333 +VPSADBWZ 5334 +VPSADBWZrm 5335 +VPSADBWZrr 5336 +VPSADBWrm 5337 +VPSADBWrr 5338 +VPSCATTERDDZ 5339 +VPSCATTERDDZmr 5340 +VPSCATTERDQZ 5341 +VPSCATTERDQZmr 5342 +VPSCATTERQDZ 5343 +VPSCATTERQDZmr 5344 +VPSCATTERQQZ 5345 +VPSCATTERQQZmr 5346 +VPSHABmr 5347 +VPSHABrm 5348 +VPSHABrr 5349 +VPSHABrr_REV 5350 +VPSHADmr 5351 +VPSHADrm 5352 +VPSHADrr 5353 +VPSHADrr_REV 5354 +VPSHAQmr 5355 +VPSHAQrm 5356 +VPSHAQrr 5357 +VPSHAQrr_REV 5358 +VPSHAWmr 5359 +VPSHAWrm 5360 +VPSHAWrr 5361 +VPSHAWrr_REV 5362 +VPSHLBmr 5363 +VPSHLBrm 5364 +VPSHLBrr 5365 +VPSHLBrr_REV 5366 +VPSHLDDZ 5367 +VPSHLDDZrmbi 5368 +VPSHLDDZrmbik 5369 +VPSHLDDZrmbikz 5370 +VPSHLDDZrmi 5371 +VPSHLDDZrmik 5372 +VPSHLDDZrmikz 5373 +VPSHLDDZrri 5374 +VPSHLDDZrrik 5375 +VPSHLDDZrrikz 5376 +VPSHLDQZ 5377 +VPSHLDQZrmbi 5378 +VPSHLDQZrmbik 5379 +VPSHLDQZrmbikz 5380 +VPSHLDQZrmi 5381 +VPSHLDQZrmik 5382 +VPSHLDQZrmikz 5383 +VPSHLDQZrri 5384 +VPSHLDQZrrik 5385 +VPSHLDQZrrikz 5386 +VPSHLDVDZ 5387 +VPSHLDVDZm 5388 +VPSHLDVDZmb 5389 +VPSHLDVDZmbk 5390 +VPSHLDVDZmbkz 5391 +VPSHLDVDZmk 5392 +VPSHLDVDZmkz 5393 +VPSHLDVDZr 5394 +VPSHLDVDZrk 5395 +VPSHLDVDZrkz 5396 +VPSHLDVQZ 5397 +VPSHLDVQZm 5398 +VPSHLDVQZmb 5399 +VPSHLDVQZmbk 5400 +VPSHLDVQZmbkz 5401 +VPSHLDVQZmk 5402 +VPSHLDVQZmkz 5403 +VPSHLDVQZr 5404 +VPSHLDVQZrk 5405 +VPSHLDVQZrkz 5406 +VPSHLDVWZ 5407 +VPSHLDVWZm 5408 +VPSHLDVWZmk 5409 +VPSHLDVWZmkz 5410 +VPSHLDVWZr 5411 +VPSHLDVWZrk 5412 +VPSHLDVWZrkz 5413 +VPSHLDWZ 5414 +VPSHLDWZrmi 5415 +VPSHLDWZrmik 5416 +VPSHLDWZrmikz 5417 +VPSHLDWZrri 5418 +VPSHLDWZrrik 5419 +VPSHLDWZrrikz 5420 +VPSHLDmr 5421 +VPSHLDrm 5422 +VPSHLDrr 5423 +VPSHLDrr_REV 5424 +VPSHLQmr 5425 +VPSHLQrm 5426 +VPSHLQrr 5427 +VPSHLQrr_REV 5428 +VPSHLWmr 5429 +VPSHLWrm 5430 +VPSHLWrr 5431 +VPSHLWrr_REV 5432 +VPSHRDDZ 5433 +VPSHRDDZrmbi 5434 +VPSHRDDZrmbik 5435 +VPSHRDDZrmbikz 5436 +VPSHRDDZrmi 5437 +VPSHRDDZrmik 5438 +VPSHRDDZrmikz 5439 +VPSHRDDZrri 5440 +VPSHRDDZrrik 5441 +VPSHRDDZrrikz 5442 +VPSHRDQZ 5443 +VPSHRDQZrmbi 5444 +VPSHRDQZrmbik 5445 +VPSHRDQZrmbikz 5446 +VPSHRDQZrmi 5447 +VPSHRDQZrmik 5448 +VPSHRDQZrmikz 5449 +VPSHRDQZrri 5450 +VPSHRDQZrrik 5451 +VPSHRDQZrrikz 5452 +VPSHRDVDZ 5453 +VPSHRDVDZm 5454 +VPSHRDVDZmb 5455 +VPSHRDVDZmbk 5456 +VPSHRDVDZmbkz 5457 +VPSHRDVDZmk 5458 +VPSHRDVDZmkz 5459 +VPSHRDVDZr 5460 +VPSHRDVDZrk 5461 +VPSHRDVDZrkz 5462 +VPSHRDVQZ 5463 +VPSHRDVQZm 5464 +VPSHRDVQZmb 5465 +VPSHRDVQZmbk 5466 +VPSHRDVQZmbkz 5467 +VPSHRDVQZmk 5468 +VPSHRDVQZmkz 5469 +VPSHRDVQZr 5470 +VPSHRDVQZrk 5471 +VPSHRDVQZrkz 5472 +VPSHRDVWZ 5473 +VPSHRDVWZm 5474 +VPSHRDVWZmk 5475 +VPSHRDVWZmkz 5476 +VPSHRDVWZr 5477 +VPSHRDVWZrk 5478 +VPSHRDVWZrkz 5479 +VPSHRDWZ 5480 +VPSHRDWZrmi 5481 +VPSHRDWZrmik 5482 +VPSHRDWZrmikz 5483 +VPSHRDWZrri 5484 +VPSHRDWZrrik 5485 +VPSHRDWZrrikz 5486 +VPSHUFBITQMBZ 5487 +VPSHUFBITQMBZrm 5488 +VPSHUFBITQMBZrmk 5489 +VPSHUFBITQMBZrr 5490 +VPSHUFBITQMBZrrk 5491 +VPSHUFBYrm 5492 +VPSHUFBYrr 5493 +VPSHUFBZ 5494 +VPSHUFBZrm 5495 +VPSHUFBZrmk 5496 +VPSHUFBZrmkz 5497 +VPSHUFBZrr 5498 +VPSHUFBZrrk 5499 +VPSHUFBZrrkz 5500 +VPSHUFBrm 5501 +VPSHUFBrr 5502 +VPSHUFDYmi 5503 +VPSHUFDYri 5504 +VPSHUFDZ 5505 +VPSHUFDZmbi 5506 +VPSHUFDZmbik 5507 +VPSHUFDZmbikz 5508 +VPSHUFDZmi 5509 +VPSHUFDZmik 5510 +VPSHUFDZmikz 5511 +VPSHUFDZri 5512 +VPSHUFDZrik 5513 +VPSHUFDZrikz 5514 +VPSHUFDmi 5515 +VPSHUFDri 5516 +VPSHUFHWYmi 5517 +VPSHUFHWYri 5518 +VPSHUFHWZ 5519 +VPSHUFHWZmi 5520 +VPSHUFHWZmik 5521 +VPSHUFHWZmikz 5522 +VPSHUFHWZri 5523 +VPSHUFHWZrik 5524 +VPSHUFHWZrikz 5525 +VPSHUFHWmi 5526 +VPSHUFHWri 5527 +VPSHUFLWYmi 5528 +VPSHUFLWYri 5529 +VPSHUFLWZ 5530 +VPSHUFLWZmi 5531 +VPSHUFLWZmik 5532 +VPSHUFLWZmikz 5533 +VPSHUFLWZri 5534 +VPSHUFLWZrik 5535 +VPSHUFLWZrikz 5536 +VPSHUFLWmi 5537 +VPSHUFLWri 5538 +VPSIGNBYrm 5539 +VPSIGNBYrr 5540 +VPSIGNBrm 5541 +VPSIGNBrr 5542 +VPSIGNDYrm 5543 +VPSIGNDYrr 5544 +VPSIGNDrm 5545 +VPSIGNDrr 5546 +VPSIGNWYrm 5547 +VPSIGNWYrr 5548 +VPSIGNWrm 5549 +VPSIGNWrr 5550 +VPSLLDQYri 5551 +VPSLLDQZ 5552 +VPSLLDQZmi 5553 +VPSLLDQZri 5554 +VPSLLDQri 5555 +VPSLLDYri 5556 +VPSLLDYrm 5557 +VPSLLDYrr 5558 +VPSLLDZ 5559 +VPSLLDZmbi 5560 +VPSLLDZmbik 5561 +VPSLLDZmbikz 5562 +VPSLLDZmi 5563 +VPSLLDZmik 5564 +VPSLLDZmikz 5565 +VPSLLDZri 5566 +VPSLLDZrik 5567 +VPSLLDZrikz 5568 +VPSLLDZrm 5569 +VPSLLDZrmk 5570 +VPSLLDZrmkz 5571 +VPSLLDZrr 5572 +VPSLLDZrrk 5573 +VPSLLDZrrkz 5574 +VPSLLDri 5575 +VPSLLDrm 5576 +VPSLLDrr 5577 +VPSLLQYri 5578 +VPSLLQYrm 5579 +VPSLLQYrr 5580 +VPSLLQZ 5581 +VPSLLQZmbi 5582 +VPSLLQZmbik 5583 +VPSLLQZmbikz 5584 +VPSLLQZmi 5585 +VPSLLQZmik 5586 +VPSLLQZmikz 5587 +VPSLLQZri 5588 +VPSLLQZrik 5589 +VPSLLQZrikz 5590 +VPSLLQZrm 5591 +VPSLLQZrmk 5592 +VPSLLQZrmkz 5593 +VPSLLQZrr 5594 +VPSLLQZrrk 5595 +VPSLLQZrrkz 5596 +VPSLLQri 5597 +VPSLLQrm 5598 +VPSLLQrr 5599 +VPSLLVDYrm 5600 +VPSLLVDYrr 5601 +VPSLLVDZ 5602 +VPSLLVDZrm 5603 +VPSLLVDZrmb 5604 +VPSLLVDZrmbk 5605 +VPSLLVDZrmbkz 5606 +VPSLLVDZrmk 5607 +VPSLLVDZrmkz 5608 +VPSLLVDZrr 5609 +VPSLLVDZrrk 5610 +VPSLLVDZrrkz 5611 +VPSLLVDrm 5612 +VPSLLVDrr 5613 +VPSLLVQYrm 5614 +VPSLLVQYrr 5615 +VPSLLVQZ 5616 +VPSLLVQZrm 5617 +VPSLLVQZrmb 5618 +VPSLLVQZrmbk 5619 +VPSLLVQZrmbkz 5620 +VPSLLVQZrmk 5621 +VPSLLVQZrmkz 5622 +VPSLLVQZrr 5623 +VPSLLVQZrrk 5624 +VPSLLVQZrrkz 5625 +VPSLLVQrm 5626 +VPSLLVQrr 5627 +VPSLLVWZ 5628 +VPSLLVWZrm 5629 +VPSLLVWZrmk 5630 +VPSLLVWZrmkz 5631 +VPSLLVWZrr 5632 +VPSLLVWZrrk 5633 +VPSLLVWZrrkz 5634 +VPSLLWYri 5635 +VPSLLWYrm 5636 +VPSLLWYrr 5637 +VPSLLWZ 5638 +VPSLLWZmi 5639 +VPSLLWZmik 5640 +VPSLLWZmikz 5641 +VPSLLWZri 5642 +VPSLLWZrik 5643 +VPSLLWZrikz 5644 +VPSLLWZrm 5645 +VPSLLWZrmk 5646 +VPSLLWZrmkz 5647 +VPSLLWZrr 5648 +VPSLLWZrrk 5649 +VPSLLWZrrkz 5650 +VPSLLWri 5651 +VPSLLWrm 5652 +VPSLLWrr 5653 +VPSRADYri 5654 +VPSRADYrm 5655 +VPSRADYrr 5656 +VPSRADZ 5657 +VPSRADZmbi 5658 +VPSRADZmbik 5659 +VPSRADZmbikz 5660 +VPSRADZmi 5661 +VPSRADZmik 5662 +VPSRADZmikz 5663 +VPSRADZri 5664 +VPSRADZrik 5665 +VPSRADZrikz 5666 +VPSRADZrm 5667 +VPSRADZrmk 5668 +VPSRADZrmkz 5669 +VPSRADZrr 5670 +VPSRADZrrk 5671 +VPSRADZrrkz 5672 +VPSRADri 5673 +VPSRADrm 5674 +VPSRADrr 5675 +VPSRAQZ 5676 +VPSRAQZmbi 5677 +VPSRAQZmbik 5678 +VPSRAQZmbikz 5679 +VPSRAQZmi 5680 +VPSRAQZmik 5681 +VPSRAQZmikz 5682 +VPSRAQZri 5683 +VPSRAQZrik 5684 +VPSRAQZrikz 5685 +VPSRAQZrm 5686 +VPSRAQZrmk 5687 +VPSRAQZrmkz 5688 +VPSRAQZrr 5689 +VPSRAQZrrk 5690 +VPSRAQZrrkz 5691 +VPSRAVDYrm 5692 +VPSRAVDYrr 5693 +VPSRAVDZ 5694 +VPSRAVDZrm 5695 +VPSRAVDZrmb 5696 +VPSRAVDZrmbk 5697 +VPSRAVDZrmbkz 5698 +VPSRAVDZrmk 5699 +VPSRAVDZrmkz 5700 +VPSRAVDZrr 5701 +VPSRAVDZrrk 5702 +VPSRAVDZrrkz 5703 +VPSRAVDrm 5704 +VPSRAVDrr 5705 +VPSRAVQZ 5706 +VPSRAVQZrm 5707 +VPSRAVQZrmb 5708 +VPSRAVQZrmbk 5709 +VPSRAVQZrmbkz 5710 +VPSRAVQZrmk 5711 +VPSRAVQZrmkz 5712 +VPSRAVQZrr 5713 +VPSRAVQZrrk 5714 +VPSRAVQZrrkz 5715 +VPSRAVWZ 5716 +VPSRAVWZrm 5717 +VPSRAVWZrmk 5718 +VPSRAVWZrmkz 5719 +VPSRAVWZrr 5720 +VPSRAVWZrrk 5721 +VPSRAVWZrrkz 5722 +VPSRAWYri 5723 +VPSRAWYrm 5724 +VPSRAWYrr 5725 +VPSRAWZ 5726 +VPSRAWZmi 5727 +VPSRAWZmik 5728 +VPSRAWZmikz 5729 +VPSRAWZri 5730 +VPSRAWZrik 5731 +VPSRAWZrikz 5732 +VPSRAWZrm 5733 +VPSRAWZrmk 5734 +VPSRAWZrmkz 5735 +VPSRAWZrr 5736 +VPSRAWZrrk 5737 +VPSRAWZrrkz 5738 +VPSRAWri 5739 +VPSRAWrm 5740 +VPSRAWrr 5741 +VPSRLDQYri 5742 +VPSRLDQZ 5743 +VPSRLDQZmi 5744 +VPSRLDQZri 5745 +VPSRLDQri 5746 +VPSRLDYri 5747 +VPSRLDYrm 5748 +VPSRLDYrr 5749 +VPSRLDZ 5750 +VPSRLDZmbi 5751 +VPSRLDZmbik 5752 +VPSRLDZmbikz 5753 +VPSRLDZmi 5754 +VPSRLDZmik 5755 +VPSRLDZmikz 5756 +VPSRLDZri 5757 +VPSRLDZrik 5758 +VPSRLDZrikz 5759 +VPSRLDZrm 5760 +VPSRLDZrmk 5761 +VPSRLDZrmkz 5762 +VPSRLDZrr 5763 +VPSRLDZrrk 5764 +VPSRLDZrrkz 5765 +VPSRLDri 5766 +VPSRLDrm 5767 +VPSRLDrr 5768 +VPSRLQYri 5769 +VPSRLQYrm 5770 +VPSRLQYrr 5771 +VPSRLQZ 5772 +VPSRLQZmbi 5773 +VPSRLQZmbik 5774 +VPSRLQZmbikz 5775 +VPSRLQZmi 5776 +VPSRLQZmik 5777 +VPSRLQZmikz 5778 +VPSRLQZri 5779 +VPSRLQZrik 5780 +VPSRLQZrikz 5781 +VPSRLQZrm 5782 +VPSRLQZrmk 5783 +VPSRLQZrmkz 5784 +VPSRLQZrr 5785 +VPSRLQZrrk 5786 +VPSRLQZrrkz 5787 +VPSRLQri 5788 +VPSRLQrm 5789 +VPSRLQrr 5790 +VPSRLVDYrm 5791 +VPSRLVDYrr 5792 +VPSRLVDZ 5793 +VPSRLVDZrm 5794 +VPSRLVDZrmb 5795 +VPSRLVDZrmbk 5796 +VPSRLVDZrmbkz 5797 +VPSRLVDZrmk 5798 +VPSRLVDZrmkz 5799 +VPSRLVDZrr 5800 +VPSRLVDZrrk 5801 +VPSRLVDZrrkz 5802 +VPSRLVDrm 5803 +VPSRLVDrr 5804 +VPSRLVQYrm 5805 +VPSRLVQYrr 5806 +VPSRLVQZ 5807 +VPSRLVQZrm 5808 +VPSRLVQZrmb 5809 +VPSRLVQZrmbk 5810 +VPSRLVQZrmbkz 5811 +VPSRLVQZrmk 5812 +VPSRLVQZrmkz 5813 +VPSRLVQZrr 5814 +VPSRLVQZrrk 5815 +VPSRLVQZrrkz 5816 +VPSRLVQrm 5817 +VPSRLVQrr 5818 +VPSRLVWZ 5819 +VPSRLVWZrm 5820 +VPSRLVWZrmk 5821 +VPSRLVWZrmkz 5822 +VPSRLVWZrr 5823 +VPSRLVWZrrk 5824 +VPSRLVWZrrkz 5825 +VPSRLWYri 5826 +VPSRLWYrm 5827 +VPSRLWYrr 5828 +VPSRLWZ 5829 +VPSRLWZmi 5830 +VPSRLWZmik 5831 +VPSRLWZmikz 5832 +VPSRLWZri 5833 +VPSRLWZrik 5834 +VPSRLWZrikz 5835 +VPSRLWZrm 5836 +VPSRLWZrmk 5837 +VPSRLWZrmkz 5838 +VPSRLWZrr 5839 +VPSRLWZrrk 5840 +VPSRLWZrrkz 5841 +VPSRLWri 5842 +VPSRLWrm 5843 +VPSRLWrr 5844 +VPSUBBYrm 5845 +VPSUBBYrr 5846 +VPSUBBZ 5847 +VPSUBBZrm 5848 +VPSUBBZrmk 5849 +VPSUBBZrmkz 5850 +VPSUBBZrr 5851 +VPSUBBZrrk 5852 +VPSUBBZrrkz 5853 +VPSUBBrm 5854 +VPSUBBrr 5855 +VPSUBDYrm 5856 +VPSUBDYrr 5857 +VPSUBDZ 5858 +VPSUBDZrm 5859 +VPSUBDZrmb 5860 +VPSUBDZrmbk 5861 +VPSUBDZrmbkz 5862 +VPSUBDZrmk 5863 +VPSUBDZrmkz 5864 +VPSUBDZrr 5865 +VPSUBDZrrk 5866 +VPSUBDZrrkz 5867 +VPSUBDrm 5868 +VPSUBDrr 5869 +VPSUBQYrm 5870 +VPSUBQYrr 5871 +VPSUBQZ 5872 +VPSUBQZrm 5873 +VPSUBQZrmb 5874 +VPSUBQZrmbk 5875 +VPSUBQZrmbkz 5876 +VPSUBQZrmk 5877 +VPSUBQZrmkz 5878 +VPSUBQZrr 5879 +VPSUBQZrrk 5880 +VPSUBQZrrkz 5881 +VPSUBQrm 5882 +VPSUBQrr 5883 +VPSUBSBYrm 5884 +VPSUBSBYrr 5885 +VPSUBSBZ 5886 +VPSUBSBZrm 5887 +VPSUBSBZrmk 5888 +VPSUBSBZrmkz 5889 +VPSUBSBZrr 5890 +VPSUBSBZrrk 5891 +VPSUBSBZrrkz 5892 +VPSUBSBrm 5893 +VPSUBSBrr 5894 +VPSUBSWYrm 5895 +VPSUBSWYrr 5896 +VPSUBSWZ 5897 +VPSUBSWZrm 5898 +VPSUBSWZrmk 5899 +VPSUBSWZrmkz 5900 +VPSUBSWZrr 5901 +VPSUBSWZrrk 5902 +VPSUBSWZrrkz 5903 +VPSUBSWrm 5904 +VPSUBSWrr 5905 +VPSUBUSBYrm 5906 +VPSUBUSBYrr 5907 +VPSUBUSBZ 5908 +VPSUBUSBZrm 5909 +VPSUBUSBZrmk 5910 +VPSUBUSBZrmkz 5911 +VPSUBUSBZrr 5912 +VPSUBUSBZrrk 5913 +VPSUBUSBZrrkz 5914 +VPSUBUSBrm 5915 +VPSUBUSBrr 5916 +VPSUBUSWYrm 5917 +VPSUBUSWYrr 5918 +VPSUBUSWZ 5919 +VPSUBUSWZrm 5920 +VPSUBUSWZrmk 5921 +VPSUBUSWZrmkz 5922 +VPSUBUSWZrr 5923 +VPSUBUSWZrrk 5924 +VPSUBUSWZrrkz 5925 +VPSUBUSWrm 5926 +VPSUBUSWrr 5927 +VPSUBWYrm 5928 +VPSUBWYrr 5929 +VPSUBWZ 5930 +VPSUBWZrm 5931 +VPSUBWZrmk 5932 +VPSUBWZrmkz 5933 +VPSUBWZrr 5934 +VPSUBWZrrk 5935 +VPSUBWZrrkz 5936 +VPSUBWrm 5937 +VPSUBWrr 5938 +VPTERNLOGDZ 5939 +VPTERNLOGDZrmbi 5940 +VPTERNLOGDZrmbik 5941 +VPTERNLOGDZrmbikz 5942 +VPTERNLOGDZrmi 5943 +VPTERNLOGDZrmik 5944 +VPTERNLOGDZrmikz 5945 +VPTERNLOGDZrri 5946 +VPTERNLOGDZrrik 5947 +VPTERNLOGDZrrikz 5948 +VPTERNLOGQZ 5949 +VPTERNLOGQZrmbi 5950 +VPTERNLOGQZrmbik 5951 +VPTERNLOGQZrmbikz 5952 +VPTERNLOGQZrmi 5953 +VPTERNLOGQZrmik 5954 +VPTERNLOGQZrmikz 5955 +VPTERNLOGQZrri 5956 +VPTERNLOGQZrrik 5957 +VPTERNLOGQZrrikz 5958 +VPTESTMBZ 5959 +VPTESTMBZrm 5960 +VPTESTMBZrmk 5961 +VPTESTMBZrr 5962 +VPTESTMBZrrk 5963 +VPTESTMDZ 5964 +VPTESTMDZrm 5965 +VPTESTMDZrmb 5966 +VPTESTMDZrmbk 5967 +VPTESTMDZrmk 5968 +VPTESTMDZrr 5969 +VPTESTMDZrrk 5970 +VPTESTMQZ 5971 +VPTESTMQZrm 5972 +VPTESTMQZrmb 5973 +VPTESTMQZrmbk 5974 +VPTESTMQZrmk 5975 +VPTESTMQZrr 5976 +VPTESTMQZrrk 5977 +VPTESTMWZ 5978 +VPTESTMWZrm 5979 +VPTESTMWZrmk 5980 +VPTESTMWZrr 5981 +VPTESTMWZrrk 5982 +VPTESTNMBZ 5983 +VPTESTNMBZrm 5984 +VPTESTNMBZrmk 5985 +VPTESTNMBZrr 5986 +VPTESTNMBZrrk 5987 +VPTESTNMDZ 5988 +VPTESTNMDZrm 5989 +VPTESTNMDZrmb 5990 +VPTESTNMDZrmbk 5991 +VPTESTNMDZrmk 5992 +VPTESTNMDZrr 5993 +VPTESTNMDZrrk 5994 +VPTESTNMQZ 5995 +VPTESTNMQZrm 5996 +VPTESTNMQZrmb 5997 +VPTESTNMQZrmbk 5998 +VPTESTNMQZrmk 5999 +VPTESTNMQZrr 6000 +VPTESTNMQZrrk 6001 +VPTESTNMWZ 6002 +VPTESTNMWZrm 6003 +VPTESTNMWZrmk 6004 +VPTESTNMWZrr 6005 +VPTESTNMWZrrk 6006 +VPTESTYrm 6007 +VPTESTYrr 6008 +VPTESTrm 6009 +VPTESTrr 6010 +VPUNPCKHBWYrm 6011 +VPUNPCKHBWYrr 6012 +VPUNPCKHBWZ 6013 +VPUNPCKHBWZrm 6014 +VPUNPCKHBWZrmk 6015 +VPUNPCKHBWZrmkz 6016 +VPUNPCKHBWZrr 6017 +VPUNPCKHBWZrrk 6018 +VPUNPCKHBWZrrkz 6019 +VPUNPCKHBWrm 6020 +VPUNPCKHBWrr 6021 +VPUNPCKHDQYrm 6022 +VPUNPCKHDQYrr 6023 +VPUNPCKHDQZ 6024 +VPUNPCKHDQZrm 6025 +VPUNPCKHDQZrmb 6026 +VPUNPCKHDQZrmbk 6027 +VPUNPCKHDQZrmbkz 6028 +VPUNPCKHDQZrmk 6029 +VPUNPCKHDQZrmkz 6030 +VPUNPCKHDQZrr 6031 +VPUNPCKHDQZrrk 6032 +VPUNPCKHDQZrrkz 6033 +VPUNPCKHDQrm 6034 +VPUNPCKHDQrr 6035 +VPUNPCKHQDQYrm 6036 +VPUNPCKHQDQYrr 6037 +VPUNPCKHQDQZ 6038 +VPUNPCKHQDQZrm 6039 +VPUNPCKHQDQZrmb 6040 +VPUNPCKHQDQZrmbk 6041 +VPUNPCKHQDQZrmbkz 6042 +VPUNPCKHQDQZrmk 6043 +VPUNPCKHQDQZrmkz 6044 +VPUNPCKHQDQZrr 6045 +VPUNPCKHQDQZrrk 6046 +VPUNPCKHQDQZrrkz 6047 +VPUNPCKHQDQrm 6048 +VPUNPCKHQDQrr 6049 +VPUNPCKHWDYrm 6050 +VPUNPCKHWDYrr 6051 +VPUNPCKHWDZ 6052 +VPUNPCKHWDZrm 6053 +VPUNPCKHWDZrmk 6054 +VPUNPCKHWDZrmkz 6055 +VPUNPCKHWDZrr 6056 +VPUNPCKHWDZrrk 6057 +VPUNPCKHWDZrrkz 6058 +VPUNPCKHWDrm 6059 +VPUNPCKHWDrr 6060 +VPUNPCKLBWYrm 6061 +VPUNPCKLBWYrr 6062 +VPUNPCKLBWZ 6063 +VPUNPCKLBWZrm 6064 +VPUNPCKLBWZrmk 6065 +VPUNPCKLBWZrmkz 6066 +VPUNPCKLBWZrr 6067 +VPUNPCKLBWZrrk 6068 +VPUNPCKLBWZrrkz 6069 +VPUNPCKLBWrm 6070 +VPUNPCKLBWrr 6071 +VPUNPCKLDQYrm 6072 +VPUNPCKLDQYrr 6073 +VPUNPCKLDQZ 6074 +VPUNPCKLDQZrm 6075 +VPUNPCKLDQZrmb 6076 +VPUNPCKLDQZrmbk 6077 +VPUNPCKLDQZrmbkz 6078 +VPUNPCKLDQZrmk 6079 +VPUNPCKLDQZrmkz 6080 +VPUNPCKLDQZrr 6081 +VPUNPCKLDQZrrk 6082 +VPUNPCKLDQZrrkz 6083 +VPUNPCKLDQrm 6084 +VPUNPCKLDQrr 6085 +VPUNPCKLQDQYrm 6086 +VPUNPCKLQDQYrr 6087 +VPUNPCKLQDQZ 6088 +VPUNPCKLQDQZrm 6089 +VPUNPCKLQDQZrmb 6090 +VPUNPCKLQDQZrmbk 6091 +VPUNPCKLQDQZrmbkz 6092 +VPUNPCKLQDQZrmk 6093 +VPUNPCKLQDQZrmkz 6094 +VPUNPCKLQDQZrr 6095 +VPUNPCKLQDQZrrk 6096 +VPUNPCKLQDQZrrkz 6097 +VPUNPCKLQDQrm 6098 +VPUNPCKLQDQrr 6099 +VPUNPCKLWDYrm 6100 +VPUNPCKLWDYrr 6101 +VPUNPCKLWDZ 6102 +VPUNPCKLWDZrm 6103 +VPUNPCKLWDZrmk 6104 +VPUNPCKLWDZrmkz 6105 +VPUNPCKLWDZrr 6106 +VPUNPCKLWDZrrk 6107 +VPUNPCKLWDZrrkz 6108 +VPUNPCKLWDrm 6109 +VPUNPCKLWDrr 6110 +VPXORDZ 6111 +VPXORDZrm 6112 +VPXORDZrmb 6113 +VPXORDZrmbk 6114 +VPXORDZrmbkz 6115 +VPXORDZrmk 6116 +VPXORDZrmkz 6117 +VPXORDZrr 6118 +VPXORDZrrk 6119 +VPXORDZrrkz 6120 +VPXORQZ 6121 +VPXORQZrm 6122 +VPXORQZrmb 6123 +VPXORQZrmbk 6124 +VPXORQZrmbkz 6125 +VPXORQZrmk 6126 +VPXORQZrmkz 6127 +VPXORQZrr 6128 +VPXORQZrrk 6129 +VPXORQZrrkz 6130 +VPXORYrm 6131 +VPXORYrr 6132 +VPXORrm 6133 +VPXORrr 6134 +VRANGEPDZ 6135 +VRANGEPDZrmbi 6136 +VRANGEPDZrmbik 6137 +VRANGEPDZrmbikz 6138 +VRANGEPDZrmi 6139 +VRANGEPDZrmik 6140 +VRANGEPDZrmikz 6141 +VRANGEPDZrri 6142 +VRANGEPDZrrib 6143 +VRANGEPDZrribk 6144 +VRANGEPDZrribkz 6145 +VRANGEPDZrrik 6146 +VRANGEPDZrrikz 6147 +VRANGEPSZ 6148 +VRANGEPSZrmbi 6149 +VRANGEPSZrmbik 6150 +VRANGEPSZrmbikz 6151 +VRANGEPSZrmi 6152 +VRANGEPSZrmik 6153 +VRANGEPSZrmikz 6154 +VRANGEPSZrri 6155 +VRANGEPSZrrib 6156 +VRANGEPSZrribk 6157 +VRANGEPSZrribkz 6158 +VRANGEPSZrrik 6159 +VRANGEPSZrrikz 6160 +VRANGESDZrmi 6161 +VRANGESDZrmik 6162 +VRANGESDZrmikz 6163 +VRANGESDZrri 6164 +VRANGESDZrrib 6165 +VRANGESDZrribk 6166 +VRANGESDZrribkz 6167 +VRANGESDZrrik 6168 +VRANGESDZrrikz 6169 +VRANGESSZrmi 6170 +VRANGESSZrmik 6171 +VRANGESSZrmikz 6172 +VRANGESSZrri 6173 +VRANGESSZrrib 6174 +VRANGESSZrribk 6175 +VRANGESSZrribkz 6176 +VRANGESSZrrik 6177 +VRANGESSZrrikz 6178 +VRCP 6179 +VRCPBF 6180 +VRCPPHZ 6181 +VRCPPHZm 6182 +VRCPPHZmb 6183 +VRCPPHZmbk 6184 +VRCPPHZmbkz 6185 +VRCPPHZmk 6186 +VRCPPHZmkz 6187 +VRCPPHZr 6188 +VRCPPHZrk 6189 +VRCPPHZrkz 6190 +VRCPPSYm 6191 +VRCPPSYr 6192 +VRCPPSm 6193 +VRCPPSr 6194 +VRCPSHZrm 6195 +VRCPSHZrmk 6196 +VRCPSHZrmkz 6197 +VRCPSHZrr 6198 +VRCPSHZrrk 6199 +VRCPSHZrrkz 6200 +VRCPSSm 6201 +VRCPSSm_Int 6202 +VRCPSSr 6203 +VRCPSSr_Int 6204 +VREDUCEBF 6205 +VREDUCEPDZ 6206 +VREDUCEPDZrmbi 6207 +VREDUCEPDZrmbik 6208 +VREDUCEPDZrmbikz 6209 +VREDUCEPDZrmi 6210 +VREDUCEPDZrmik 6211 +VREDUCEPDZrmikz 6212 +VREDUCEPDZrri 6213 +VREDUCEPDZrrib 6214 +VREDUCEPDZrribk 6215 +VREDUCEPDZrribkz 6216 +VREDUCEPDZrrik 6217 +VREDUCEPDZrrikz 6218 +VREDUCEPHZ 6219 +VREDUCEPHZrmbi 6220 +VREDUCEPHZrmbik 6221 +VREDUCEPHZrmbikz 6222 +VREDUCEPHZrmi 6223 +VREDUCEPHZrmik 6224 +VREDUCEPHZrmikz 6225 +VREDUCEPHZrri 6226 +VREDUCEPHZrrib 6227 +VREDUCEPHZrribk 6228 +VREDUCEPHZrribkz 6229 +VREDUCEPHZrrik 6230 +VREDUCEPHZrrikz 6231 +VREDUCEPSZ 6232 +VREDUCEPSZrmbi 6233 +VREDUCEPSZrmbik 6234 +VREDUCEPSZrmbikz 6235 +VREDUCEPSZrmi 6236 +VREDUCEPSZrmik 6237 +VREDUCEPSZrmikz 6238 +VREDUCEPSZrri 6239 +VREDUCEPSZrrib 6240 +VREDUCEPSZrribk 6241 +VREDUCEPSZrribkz 6242 +VREDUCEPSZrrik 6243 +VREDUCEPSZrrikz 6244 +VREDUCESDZrmi 6245 +VREDUCESDZrmik 6246 +VREDUCESDZrmikz 6247 +VREDUCESDZrri 6248 +VREDUCESDZrrib 6249 +VREDUCESDZrribk 6250 +VREDUCESDZrribkz 6251 +VREDUCESDZrrik 6252 +VREDUCESDZrrikz 6253 +VREDUCESHZrmi 6254 +VREDUCESHZrmik 6255 +VREDUCESHZrmikz 6256 +VREDUCESHZrri 6257 +VREDUCESHZrrib 6258 +VREDUCESHZrribk 6259 +VREDUCESHZrribkz 6260 +VREDUCESHZrrik 6261 +VREDUCESHZrrikz 6262 +VREDUCESSZrmi 6263 +VREDUCESSZrmik 6264 +VREDUCESSZrmikz 6265 +VREDUCESSZrri 6266 +VREDUCESSZrrib 6267 +VREDUCESSZrribk 6268 +VREDUCESSZrribkz 6269 +VREDUCESSZrrik 6270 +VREDUCESSZrrikz 6271 +VRNDSCALEBF 6272 +VRNDSCALEPDZ 6273 +VRNDSCALEPDZrmbi 6274 +VRNDSCALEPDZrmbik 6275 +VRNDSCALEPDZrmbikz 6276 +VRNDSCALEPDZrmi 6277 +VRNDSCALEPDZrmik 6278 +VRNDSCALEPDZrmikz 6279 +VRNDSCALEPDZrri 6280 +VRNDSCALEPDZrrib 6281 +VRNDSCALEPDZrribk 6282 +VRNDSCALEPDZrribkz 6283 +VRNDSCALEPDZrrik 6284 +VRNDSCALEPDZrrikz 6285 +VRNDSCALEPHZ 6286 +VRNDSCALEPHZrmbi 6287 +VRNDSCALEPHZrmbik 6288 +VRNDSCALEPHZrmbikz 6289 +VRNDSCALEPHZrmi 6290 +VRNDSCALEPHZrmik 6291 +VRNDSCALEPHZrmikz 6292 +VRNDSCALEPHZrri 6293 +VRNDSCALEPHZrrib 6294 +VRNDSCALEPHZrribk 6295 +VRNDSCALEPHZrribkz 6296 +VRNDSCALEPHZrrik 6297 +VRNDSCALEPHZrrikz 6298 +VRNDSCALEPSZ 6299 +VRNDSCALEPSZrmbi 6300 +VRNDSCALEPSZrmbik 6301 +VRNDSCALEPSZrmbikz 6302 +VRNDSCALEPSZrmi 6303 +VRNDSCALEPSZrmik 6304 +VRNDSCALEPSZrmikz 6305 +VRNDSCALEPSZrri 6306 +VRNDSCALEPSZrrib 6307 +VRNDSCALEPSZrribk 6308 +VRNDSCALEPSZrribkz 6309 +VRNDSCALEPSZrrik 6310 +VRNDSCALEPSZrrikz 6311 +VRNDSCALESDZrmi 6312 +VRNDSCALESDZrmi_Int 6313 +VRNDSCALESDZrmik_Int 6314 +VRNDSCALESDZrmikz_Int 6315 +VRNDSCALESDZrri 6316 +VRNDSCALESDZrri_Int 6317 +VRNDSCALESDZrrib_Int 6318 +VRNDSCALESDZrribk_Int 6319 +VRNDSCALESDZrribkz_Int 6320 +VRNDSCALESDZrrik_Int 6321 +VRNDSCALESDZrrikz_Int 6322 +VRNDSCALESHZrmi 6323 +VRNDSCALESHZrmi_Int 6324 +VRNDSCALESHZrmik_Int 6325 +VRNDSCALESHZrmikz_Int 6326 +VRNDSCALESHZrri 6327 +VRNDSCALESHZrri_Int 6328 +VRNDSCALESHZrrib_Int 6329 +VRNDSCALESHZrribk_Int 6330 +VRNDSCALESHZrribkz_Int 6331 +VRNDSCALESHZrrik_Int 6332 +VRNDSCALESHZrrikz_Int 6333 +VRNDSCALESSZrmi 6334 +VRNDSCALESSZrmi_Int 6335 +VRNDSCALESSZrmik_Int 6336 +VRNDSCALESSZrmikz_Int 6337 +VRNDSCALESSZrri 6338 +VRNDSCALESSZrri_Int 6339 +VRNDSCALESSZrrib_Int 6340 +VRNDSCALESSZrribk_Int 6341 +VRNDSCALESSZrribkz_Int 6342 +VRNDSCALESSZrrik_Int 6343 +VRNDSCALESSZrrikz_Int 6344 +VROUNDPDYmi 6345 +VROUNDPDYri 6346 +VROUNDPDmi 6347 +VROUNDPDri 6348 +VROUNDPSYmi 6349 +VROUNDPSYri 6350 +VROUNDPSmi 6351 +VROUNDPSri 6352 +VROUNDSDmi 6353 +VROUNDSDmi_Int 6354 +VROUNDSDri 6355 +VROUNDSDri_Int 6356 +VROUNDSSmi 6357 +VROUNDSSmi_Int 6358 +VROUNDSSri 6359 +VROUNDSSri_Int 6360 +VRSQRT 6361 +VRSQRTBF 6362 +VRSQRTPHZ 6363 +VRSQRTPHZm 6364 +VRSQRTPHZmb 6365 +VRSQRTPHZmbk 6366 +VRSQRTPHZmbkz 6367 +VRSQRTPHZmk 6368 +VRSQRTPHZmkz 6369 +VRSQRTPHZr 6370 +VRSQRTPHZrk 6371 +VRSQRTPHZrkz 6372 +VRSQRTPSYm 6373 +VRSQRTPSYr 6374 +VRSQRTPSm 6375 +VRSQRTPSr 6376 +VRSQRTSHZrm 6377 +VRSQRTSHZrmk 6378 +VRSQRTSHZrmkz 6379 +VRSQRTSHZrr 6380 +VRSQRTSHZrrk 6381 +VRSQRTSHZrrkz 6382 +VRSQRTSSm 6383 +VRSQRTSSm_Int 6384 +VRSQRTSSr 6385 +VRSQRTSSr_Int 6386 +VSCALEFBF 6387 +VSCALEFPDZ 6388 +VSCALEFPDZrm 6389 +VSCALEFPDZrmb 6390 +VSCALEFPDZrmbk 6391 +VSCALEFPDZrmbkz 6392 +VSCALEFPDZrmk 6393 +VSCALEFPDZrmkz 6394 +VSCALEFPDZrr 6395 +VSCALEFPDZrrb 6396 +VSCALEFPDZrrbk 6397 +VSCALEFPDZrrbkz 6398 +VSCALEFPDZrrk 6399 +VSCALEFPDZrrkz 6400 +VSCALEFPHZ 6401 +VSCALEFPHZrm 6402 +VSCALEFPHZrmb 6403 +VSCALEFPHZrmbk 6404 +VSCALEFPHZrmbkz 6405 +VSCALEFPHZrmk 6406 +VSCALEFPHZrmkz 6407 +VSCALEFPHZrr 6408 +VSCALEFPHZrrb 6409 +VSCALEFPHZrrbk 6410 +VSCALEFPHZrrbkz 6411 +VSCALEFPHZrrk 6412 +VSCALEFPHZrrkz 6413 +VSCALEFPSZ 6414 +VSCALEFPSZrm 6415 +VSCALEFPSZrmb 6416 +VSCALEFPSZrmbk 6417 +VSCALEFPSZrmbkz 6418 +VSCALEFPSZrmk 6419 +VSCALEFPSZrmkz 6420 +VSCALEFPSZrr 6421 +VSCALEFPSZrrb 6422 +VSCALEFPSZrrbk 6423 +VSCALEFPSZrrbkz 6424 +VSCALEFPSZrrk 6425 +VSCALEFPSZrrkz 6426 +VSCALEFSDZrm 6427 +VSCALEFSDZrmk 6428 +VSCALEFSDZrmkz 6429 +VSCALEFSDZrr 6430 +VSCALEFSDZrrb_Int 6431 +VSCALEFSDZrrbk_Int 6432 +VSCALEFSDZrrbkz_Int 6433 +VSCALEFSDZrrk 6434 +VSCALEFSDZrrkz 6435 +VSCALEFSHZrm 6436 +VSCALEFSHZrmk 6437 +VSCALEFSHZrmkz 6438 +VSCALEFSHZrr 6439 +VSCALEFSHZrrb_Int 6440 +VSCALEFSHZrrbk_Int 6441 +VSCALEFSHZrrbkz_Int 6442 +VSCALEFSHZrrk 6443 +VSCALEFSHZrrkz 6444 +VSCALEFSSZrm 6445 +VSCALEFSSZrmk 6446 +VSCALEFSSZrmkz 6447 +VSCALEFSSZrr 6448 +VSCALEFSSZrrb_Int 6449 +VSCALEFSSZrrbk_Int 6450 +VSCALEFSSZrrbkz_Int 6451 +VSCALEFSSZrrk 6452 +VSCALEFSSZrrkz 6453 +VSCATTERDPDZ 6454 +VSCATTERDPDZmr 6455 +VSCATTERDPSZ 6456 +VSCATTERDPSZmr 6457 +VSCATTERPF 6458 +VSCATTERQPDZ 6459 +VSCATTERQPDZmr 6460 +VSCATTERQPSZ 6461 +VSCATTERQPSZmr 6462 +VSHA 6463 +VSHUFF 6464 +VSHUFI 6465 +VSHUFPDYrmi 6466 +VSHUFPDYrri 6467 +VSHUFPDZ 6468 +VSHUFPDZrmbi 6469 +VSHUFPDZrmbik 6470 +VSHUFPDZrmbikz 6471 +VSHUFPDZrmi 6472 +VSHUFPDZrmik 6473 +VSHUFPDZrmikz 6474 +VSHUFPDZrri 6475 +VSHUFPDZrrik 6476 +VSHUFPDZrrikz 6477 +VSHUFPDrmi 6478 +VSHUFPDrri 6479 +VSHUFPSYrmi 6480 +VSHUFPSYrri 6481 +VSHUFPSZ 6482 +VSHUFPSZrmbi 6483 +VSHUFPSZrmbik 6484 +VSHUFPSZrmbikz 6485 +VSHUFPSZrmi 6486 +VSHUFPSZrmik 6487 +VSHUFPSZrmikz 6488 +VSHUFPSZrri 6489 +VSHUFPSZrrik 6490 +VSHUFPSZrrikz 6491 +VSHUFPSrmi 6492 +VSHUFPSrri 6493 +VSM 6494 +VSQRTBF 6495 +VSQRTPDYm 6496 +VSQRTPDYr 6497 +VSQRTPDZ 6498 +VSQRTPDZm 6499 +VSQRTPDZmb 6500 +VSQRTPDZmbk 6501 +VSQRTPDZmbkz 6502 +VSQRTPDZmk 6503 +VSQRTPDZmkz 6504 +VSQRTPDZr 6505 +VSQRTPDZrb 6506 +VSQRTPDZrbk 6507 +VSQRTPDZrbkz 6508 +VSQRTPDZrk 6509 +VSQRTPDZrkz 6510 +VSQRTPDm 6511 +VSQRTPDr 6512 +VSQRTPHZ 6513 +VSQRTPHZm 6514 +VSQRTPHZmb 6515 +VSQRTPHZmbk 6516 +VSQRTPHZmbkz 6517 +VSQRTPHZmk 6518 +VSQRTPHZmkz 6519 +VSQRTPHZr 6520 +VSQRTPHZrb 6521 +VSQRTPHZrbk 6522 +VSQRTPHZrbkz 6523 +VSQRTPHZrk 6524 +VSQRTPHZrkz 6525 +VSQRTPSYm 6526 +VSQRTPSYr 6527 +VSQRTPSZ 6528 +VSQRTPSZm 6529 +VSQRTPSZmb 6530 +VSQRTPSZmbk 6531 +VSQRTPSZmbkz 6532 +VSQRTPSZmk 6533 +VSQRTPSZmkz 6534 +VSQRTPSZr 6535 +VSQRTPSZrb 6536 +VSQRTPSZrbk 6537 +VSQRTPSZrbkz 6538 +VSQRTPSZrk 6539 +VSQRTPSZrkz 6540 +VSQRTPSm 6541 +VSQRTPSr 6542 +VSQRTSDZm 6543 +VSQRTSDZm_Int 6544 +VSQRTSDZmk_Int 6545 +VSQRTSDZmkz_Int 6546 +VSQRTSDZr 6547 +VSQRTSDZr_Int 6548 +VSQRTSDZrb_Int 6549 +VSQRTSDZrbk_Int 6550 +VSQRTSDZrbkz_Int 6551 +VSQRTSDZrk_Int 6552 +VSQRTSDZrkz_Int 6553 +VSQRTSDm 6554 +VSQRTSDm_Int 6555 +VSQRTSDr 6556 +VSQRTSDr_Int 6557 +VSQRTSHZm 6558 +VSQRTSHZm_Int 6559 +VSQRTSHZmk_Int 6560 +VSQRTSHZmkz_Int 6561 +VSQRTSHZr 6562 +VSQRTSHZr_Int 6563 +VSQRTSHZrb_Int 6564 +VSQRTSHZrbk_Int 6565 +VSQRTSHZrbkz_Int 6566 +VSQRTSHZrk_Int 6567 +VSQRTSHZrkz_Int 6568 +VSQRTSSZm 6569 +VSQRTSSZm_Int 6570 +VSQRTSSZmk_Int 6571 +VSQRTSSZmkz_Int 6572 +VSQRTSSZr 6573 +VSQRTSSZr_Int 6574 +VSQRTSSZrb_Int 6575 +VSQRTSSZrbk_Int 6576 +VSQRTSSZrbkz_Int 6577 +VSQRTSSZrk_Int 6578 +VSQRTSSZrkz_Int 6579 +VSQRTSSm 6580 +VSQRTSSm_Int 6581 +VSQRTSSr 6582 +VSQRTSSr_Int 6583 +VSTMXCSR 6584 +VSUBBF 6585 +VSUBPDYrm 6586 +VSUBPDYrr 6587 +VSUBPDZ 6588 +VSUBPDZrm 6589 +VSUBPDZrmb 6590 +VSUBPDZrmbk 6591 +VSUBPDZrmbkz 6592 +VSUBPDZrmk 6593 +VSUBPDZrmkz 6594 +VSUBPDZrr 6595 +VSUBPDZrrb 6596 +VSUBPDZrrbk 6597 +VSUBPDZrrbkz 6598 +VSUBPDZrrk 6599 +VSUBPDZrrkz 6600 +VSUBPDrm 6601 +VSUBPDrr 6602 +VSUBPHZ 6603 +VSUBPHZrm 6604 +VSUBPHZrmb 6605 +VSUBPHZrmbk 6606 +VSUBPHZrmbkz 6607 +VSUBPHZrmk 6608 +VSUBPHZrmkz 6609 +VSUBPHZrr 6610 +VSUBPHZrrb 6611 +VSUBPHZrrbk 6612 +VSUBPHZrrbkz 6613 +VSUBPHZrrk 6614 +VSUBPHZrrkz 6615 +VSUBPSYrm 6616 +VSUBPSYrr 6617 +VSUBPSZ 6618 +VSUBPSZrm 6619 +VSUBPSZrmb 6620 +VSUBPSZrmbk 6621 +VSUBPSZrmbkz 6622 +VSUBPSZrmk 6623 +VSUBPSZrmkz 6624 +VSUBPSZrr 6625 +VSUBPSZrrb 6626 +VSUBPSZrrbk 6627 +VSUBPSZrrbkz 6628 +VSUBPSZrrk 6629 +VSUBPSZrrkz 6630 +VSUBPSrm 6631 +VSUBPSrr 6632 +VSUBSDZrm 6633 +VSUBSDZrm_Int 6634 +VSUBSDZrmk_Int 6635 +VSUBSDZrmkz_Int 6636 +VSUBSDZrr 6637 +VSUBSDZrr_Int 6638 +VSUBSDZrrb_Int 6639 +VSUBSDZrrbk_Int 6640 +VSUBSDZrrbkz_Int 6641 +VSUBSDZrrk_Int 6642 +VSUBSDZrrkz_Int 6643 +VSUBSDrm 6644 +VSUBSDrm_Int 6645 +VSUBSDrr 6646 +VSUBSDrr_Int 6647 +VSUBSHZrm 6648 +VSUBSHZrm_Int 6649 +VSUBSHZrmk_Int 6650 +VSUBSHZrmkz_Int 6651 +VSUBSHZrr 6652 +VSUBSHZrr_Int 6653 +VSUBSHZrrb_Int 6654 +VSUBSHZrrbk_Int 6655 +VSUBSHZrrbkz_Int 6656 +VSUBSHZrrk_Int 6657 +VSUBSHZrrkz_Int 6658 +VSUBSSZrm 6659 +VSUBSSZrm_Int 6660 +VSUBSSZrmk_Int 6661 +VSUBSSZrmkz_Int 6662 +VSUBSSZrr 6663 +VSUBSSZrr_Int 6664 +VSUBSSZrrb_Int 6665 +VSUBSSZrrbk_Int 6666 +VSUBSSZrrbkz_Int 6667 +VSUBSSZrrk_Int 6668 +VSUBSSZrrkz_Int 6669 +VSUBSSrm 6670 +VSUBSSrm_Int 6671 +VSUBSSrr 6672 +VSUBSSrr_Int 6673 +VTESTPDYrm 6674 +VTESTPDYrr 6675 +VTESTPDrm 6676 +VTESTPDrr 6677 +VTESTPSYrm 6678 +VTESTPSYrr 6679 +VTESTPSrm 6680 +VTESTPSrr 6681 +VUCOMISDZrm 6682 +VUCOMISDZrm_Int 6683 +VUCOMISDZrr 6684 +VUCOMISDZrr_Int 6685 +VUCOMISDZrrb 6686 +VUCOMISDrm 6687 +VUCOMISDrm_Int 6688 +VUCOMISDrr 6689 +VUCOMISDrr_Int 6690 +VUCOMISHZrm 6691 +VUCOMISHZrm_Int 6692 +VUCOMISHZrr 6693 +VUCOMISHZrr_Int 6694 +VUCOMISHZrrb 6695 +VUCOMISSZrm 6696 +VUCOMISSZrm_Int 6697 +VUCOMISSZrr 6698 +VUCOMISSZrr_Int 6699 +VUCOMISSZrrb 6700 +VUCOMISSrm 6701 +VUCOMISSrm_Int 6702 +VUCOMISSrr 6703 +VUCOMISSrr_Int 6704 +VUCOMXSDZrm 6705 +VUCOMXSDZrm_Int 6706 +VUCOMXSDZrr 6707 +VUCOMXSDZrr_Int 6708 +VUCOMXSDZrrb_Int 6709 +VUCOMXSHZrm 6710 +VUCOMXSHZrm_Int 6711 +VUCOMXSHZrr 6712 +VUCOMXSHZrr_Int 6713 +VUCOMXSHZrrb_Int 6714 +VUCOMXSSZrm 6715 +VUCOMXSSZrm_Int 6716 +VUCOMXSSZrr 6717 +VUCOMXSSZrr_Int 6718 +VUCOMXSSZrrb_Int 6719 +VUNPCKHPDYrm 6720 +VUNPCKHPDYrr 6721 +VUNPCKHPDZ 6722 +VUNPCKHPDZrm 6723 +VUNPCKHPDZrmb 6724 +VUNPCKHPDZrmbk 6725 +VUNPCKHPDZrmbkz 6726 +VUNPCKHPDZrmk 6727 +VUNPCKHPDZrmkz 6728 +VUNPCKHPDZrr 6729 +VUNPCKHPDZrrk 6730 +VUNPCKHPDZrrkz 6731 +VUNPCKHPDrm 6732 +VUNPCKHPDrr 6733 +VUNPCKHPSYrm 6734 +VUNPCKHPSYrr 6735 +VUNPCKHPSZ 6736 +VUNPCKHPSZrm 6737 +VUNPCKHPSZrmb 6738 +VUNPCKHPSZrmbk 6739 +VUNPCKHPSZrmbkz 6740 +VUNPCKHPSZrmk 6741 +VUNPCKHPSZrmkz 6742 +VUNPCKHPSZrr 6743 +VUNPCKHPSZrrk 6744 +VUNPCKHPSZrrkz 6745 +VUNPCKHPSrm 6746 +VUNPCKHPSrr 6747 +VUNPCKLPDYrm 6748 +VUNPCKLPDYrr 6749 +VUNPCKLPDZ 6750 +VUNPCKLPDZrm 6751 +VUNPCKLPDZrmb 6752 +VUNPCKLPDZrmbk 6753 +VUNPCKLPDZrmbkz 6754 +VUNPCKLPDZrmk 6755 +VUNPCKLPDZrmkz 6756 +VUNPCKLPDZrr 6757 +VUNPCKLPDZrrk 6758 +VUNPCKLPDZrrkz 6759 +VUNPCKLPDrm 6760 +VUNPCKLPDrr 6761 +VUNPCKLPSYrm 6762 +VUNPCKLPSYrr 6763 +VUNPCKLPSZ 6764 +VUNPCKLPSZrm 6765 +VUNPCKLPSZrmb 6766 +VUNPCKLPSZrmbk 6767 +VUNPCKLPSZrmbkz 6768 +VUNPCKLPSZrmk 6769 +VUNPCKLPSZrmkz 6770 +VUNPCKLPSZrr 6771 +VUNPCKLPSZrrk 6772 +VUNPCKLPSZrrkz 6773 +VUNPCKLPSrm 6774 +VUNPCKLPSrr 6775 +VXORPDYrm 6776 +VXORPDYrr 6777 +VXORPDZ 6778 +VXORPDZrm 6779 +VXORPDZrmb 6780 +VXORPDZrmbk 6781 +VXORPDZrmbkz 6782 +VXORPDZrmk 6783 +VXORPDZrmkz 6784 +VXORPDZrr 6785 +VXORPDZrrk 6786 +VXORPDZrrkz 6787 +VXORPDrm 6788 +VXORPDrr 6789 +VXORPSYrm 6790 +VXORPSYrr 6791 +VXORPSZ 6792 +VXORPSZrm 6793 +VXORPSZrmb 6794 +VXORPSZrmbk 6795 +VXORPSZrmbkz 6796 +VXORPSZrmk 6797 +VXORPSZrmkz 6798 +VXORPSZrr 6799 +VXORPSZrrk 6800 +VXORPSZrrkz 6801 +VXORPSrm 6802 +VXORPSrr 6803 +VZEROALL 6804 +VZEROUPPER 6805 +V_SET 6806 +V_SETALLONES 6807 +WAIT 6808 +WBINVD 6809 +WBNOINVD 6810 +WRFLAGS 6811 +WRFSBASE 6812 +WRGSBASE 6813 +WRMSR 6814 +WRMSRLIST 6815 +WRMSRNS 6816 +WRMSRNSir 6817 +WRMSRNSir_EVEX 6818 +WRPKRUr 6819 +WRSSD 6820 +WRSSD_EVEX 6821 +WRSSQ 6822 +WRSSQ_EVEX 6823 +WRUSSD 6824 +WRUSSD_EVEX 6825 +WRUSSQ 6826 +WRUSSQ_EVEX 6827 +XABORT 6828 +XABORT_DEF 6829 +XACQUIRE_PREFIX 6830 +XADD 6831 +XAM_F 6832 +XAM_Fp 6833 +XBEGIN 6834 +XCHG 6835 +XCH_F 6836 +XCRYPTCBC 6837 +XCRYPTCFB 6838 +XCRYPTCTR 6839 +XCRYPTECB 6840 +XCRYPTOFB 6841 +XEND 6842 +XGETBV 6843 +XLAT 6844 +XOR 6845 +XORPDrm 6846 +XORPDrr 6847 +XORPSrm 6848 +XORPSrr 6849 +XRELEASE_PREFIX 6850 +XRESLDTRK 6851 +XRSTOR 6852 +XRSTORS 6853 +XSAVE 6854 +XSAVEC 6855 +XSAVEOPT 6856 +XSAVES 6857 +XSETBV 6858 +XSHA 6859 +XSTORE 6860 +XSUSLDTRK 6861 +XTEST 6862 +Immediate 6863 +CImmediate 6864 +FPImmediate 6865 +MBB 6866 +FrameIndex 6867 +ConstantPoolIndex 6868 +TargetIndex 6869 +JumpTableIndex 6870 +ExternalSymbol 6871 +GlobalAddress 6872 +BlockAddress 6873 +RegisterMask 6874 +RegisterLiveOut 6875 +Metadata 6876 +MCSymbol 6877 +CFIIndex 6878 +IntrinsicID 6879 +Predicate 6880 +ShuffleMask 6881 +PhyReg_GR8 6882 +PhyReg_GRH8 6883 +PhyReg_GR8_NOREX2 6884 +PhyReg_GR8_NOREX 6885 +PhyReg_GR8_ABCD_H 6886 +PhyReg_GR8_ABCD_L 6887 +PhyReg_GRH16 6888 +PhyReg_GR16 6889 +PhyReg_GR16_NOREX2 6890 +PhyReg_GR16_NOREX 6891 +PhyReg_VK1 6892 +PhyReg_VK16 6893 +PhyReg_VK2 6894 +PhyReg_VK4 6895 +PhyReg_VK8 6896 +PhyReg_VK16WM 6897 +PhyReg_VK1WM 6898 +PhyReg_VK2WM 6899 +PhyReg_VK4WM 6900 +PhyReg_VK8WM 6901 +PhyReg_SEGMENT_REG 6902 +PhyReg_GR16_ABCD 6903 +PhyReg_FPCCR 6904 +PhyReg_FR16X 6905 +PhyReg_FR16 6906 +PhyReg_VK16PAIR 6907 +PhyReg_VK1PAIR 6908 +PhyReg_VK2PAIR 6909 +PhyReg_VK4PAIR 6910 +PhyReg_VK8PAIR 6911 +PhyReg_VK1PAIR_with_sub_mask_0_in_VK1WM 6912 +PhyReg_LOW32_ADDR_ACCESS_RBP 6913 +PhyReg_LOW32_ADDR_ACCESS 6914 +PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit 6915 +PhyReg_FR32X 6916 +PhyReg_GR32 6917 +PhyReg_GR32_NOSP 6918 +PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX2 6919 +PhyReg_DEBUG_REG 6920 +PhyReg_FR32 6921 +PhyReg_GR32_NOREX2 6922 +PhyReg_GR32_NOREX2_NOSP 6923 +PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX 6924 +PhyReg_GR32_NOREX 6925 +PhyReg_VK32 6926 +PhyReg_GR32_NOREX_NOSP 6927 +PhyReg_RFP32 6928 +PhyReg_VK32WM 6929 +PhyReg_GR32_ABCD 6930 +PhyReg_GR32_TC 6931 +PhyReg_GR32_ABCD_and_GR32_TC 6932 +PhyReg_GR32_AD 6933 +PhyReg_GR32_ArgRef 6934 +PhyReg_GR32_BPSP 6935 +PhyReg_GR32_BSI 6936 +PhyReg_GR32_CB 6937 +PhyReg_GR32_DC 6938 +PhyReg_GR32_DIBP 6939 +PhyReg_GR32_SIDI 6940 +PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_32bit 6941 +PhyReg_CCR 6942 +PhyReg_DFCCR 6943 +PhyReg_GR32_ABCD_and_GR32_BSI 6944 +PhyReg_GR32_AD_and_GR32_ArgRef 6945 +PhyReg_GR32_ArgRef_and_GR32_CB 6946 +PhyReg_GR32_BPSP_and_GR32_DIBP 6947 +PhyReg_GR32_BPSP_and_GR32_TC 6948 +PhyReg_GR32_BSI_and_GR32_SIDI 6949 +PhyReg_GR32_DIBP_and_GR32_SIDI 6950 +PhyReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit_with_sub_32bit 6951 +PhyReg_LOW32_ADDR_ACCESS_with_sub_32bit 6952 +PhyReg_RFP64 6953 +PhyReg_GR64 6954 +PhyReg_FR64X 6955 +PhyReg_GR64_with_sub_8bit 6956 +PhyReg_GR64_NOSP 6957 +PhyReg_GR64_NOREX2 6958 +PhyReg_CONTROL_REG 6959 +PhyReg_FR64 6960 +PhyReg_GR64_with_sub_16bit_in_GR16_NOREX2 6961 +PhyReg_GR64_NOREX2_NOSP 6962 +PhyReg_GR64PLTSafe 6963 +PhyReg_GR64_TC 6964 +PhyReg_GR64_NOREX 6965 +PhyReg_GR64_TCW64 6966 +PhyReg_GR64_TC_with_sub_8bit 6967 +PhyReg_GR64_NOREX2_NOSP_and_GR64_TC 6968 +PhyReg_GR64_TCW64_with_sub_8bit 6969 +PhyReg_GR64_TC_and_GR64_TCW64 6970 +PhyReg_GR64_with_sub_16bit_in_GR16_NOREX 6971 +PhyReg_VK64 6972 +PhyReg_VR64 6973 +PhyReg_GR64PLTSafe_and_GR64_TC 6974 +PhyReg_GR64_NOREX2_NOSP_and_GR64_TCW64 6975 +PhyReg_GR64_NOREX_NOSP 6976 +PhyReg_GR64_NOREX_and_GR64_TC 6977 +PhyReg_GR64_TCW64_and_GR64_TC_with_sub_8bit 6978 +PhyReg_VK64WM 6979 +PhyReg_GR64_TC_and_GR64_NOREX2_NOSP_and_GR64_TCW64 6980 +PhyReg_GR64_TC_and_GR64_with_sub_16bit_in_GR16_NOREX 6981 +PhyReg_GR64PLTSafe_and_GR64_TCW64 6982 +PhyReg_GR64_NOREX_and_GR64PLTSafe_and_GR64_TC 6983 +PhyReg_GR64_NOREX_and_GR64_TCW64 6984 +PhyReg_GR64_ABCD 6985 +PhyReg_GR64_with_sub_32bit_in_GR32_TC 6986 +PhyReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_TC 6987 +PhyReg_GR64_AD 6988 +PhyReg_GR64_ArgRef 6989 +PhyReg_GR64_and_LOW32_ADDR_ACCESS_RBP 6990 +PhyReg_GR64_with_sub_32bit_in_GR32_ArgRef 6991 +PhyReg_GR64_with_sub_32bit_in_GR32_BPSP 6992 +PhyReg_GR64_with_sub_32bit_in_GR32_BSI 6993 +PhyReg_GR64_with_sub_32bit_in_GR32_CB 6994 +PhyReg_GR64_with_sub_32bit_in_GR32_DIBP 6995 +PhyReg_GR64_with_sub_32bit_in_GR32_SIDI 6996 +PhyReg_GR64_A 6997 +PhyReg_GR64_ArgRef_and_GR64_TC 6998 +PhyReg_GR64_and_LOW32_ADDR_ACCESS 6999 +PhyReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_BSI 7000 +PhyReg_GR64_with_sub_32bit_in_GR32_AD_and_GR32_ArgRef 7001 +PhyReg_GR64_with_sub_32bit_in_GR32_ArgRef_and_GR32_CB 7002 +PhyReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_DIBP 7003 +PhyReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_TC 7004 +PhyReg_GR64_with_sub_32bit_in_GR32_BSI_and_GR32_SIDI 7005 +PhyReg_GR64_with_sub_32bit_in_GR32_DIBP_and_GR32_SIDI 7006 +PhyReg_RST 7007 +PhyReg_RFP80 7008 +PhyReg_RFP80_7 7009 +PhyReg_VR128X 7010 +PhyReg_VR128 7011 +PhyReg_VR256X 7012 +PhyReg_VR256 7013 +PhyReg_VR512 7014 +PhyReg_VR512_0_15 7015 +PhyReg_TILE 7016 +VirtReg_GR8 7017 +VirtReg_GRH8 7018 +VirtReg_GR8_NOREX2 7019 +VirtReg_GR8_NOREX 7020 +VirtReg_GR8_ABCD_H 7021 +VirtReg_GR8_ABCD_L 7022 +VirtReg_GRH16 7023 +VirtReg_GR16 7024 +VirtReg_GR16_NOREX2 7025 +VirtReg_GR16_NOREX 7026 +VirtReg_VK1 7027 +VirtReg_VK16 7028 +VirtReg_VK2 7029 +VirtReg_VK4 7030 +VirtReg_VK8 7031 +VirtReg_VK16WM 7032 +VirtReg_VK1WM 7033 +VirtReg_VK2WM 7034 +VirtReg_VK4WM 7035 +VirtReg_VK8WM 7036 +VirtReg_SEGMENT_REG 7037 +VirtReg_GR16_ABCD 7038 +VirtReg_FPCCR 7039 +VirtReg_FR16X 7040 +VirtReg_FR16 7041 +VirtReg_VK16PAIR 7042 +VirtReg_VK1PAIR 7043 +VirtReg_VK2PAIR 7044 +VirtReg_VK4PAIR 7045 +VirtReg_VK8PAIR 7046 +VirtReg_VK1PAIR_with_sub_mask_0_in_VK1WM 7047 +VirtReg_LOW32_ADDR_ACCESS_RBP 7048 +VirtReg_LOW32_ADDR_ACCESS 7049 +VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit 7050 +VirtReg_FR32X 7051 +VirtReg_GR32 7052 +VirtReg_GR32_NOSP 7053 +VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX2 7054 +VirtReg_DEBUG_REG 7055 +VirtReg_FR32 7056 +VirtReg_GR32_NOREX2 7057 +VirtReg_GR32_NOREX2_NOSP 7058 +VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_16bit_in_GR16_NOREX 7059 +VirtReg_GR32_NOREX 7060 +VirtReg_VK32 7061 +VirtReg_GR32_NOREX_NOSP 7062 +VirtReg_RFP32 7063 +VirtReg_VK32WM 7064 +VirtReg_GR32_ABCD 7065 +VirtReg_GR32_TC 7066 +VirtReg_GR32_ABCD_and_GR32_TC 7067 +VirtReg_GR32_AD 7068 +VirtReg_GR32_ArgRef 7069 +VirtReg_GR32_BPSP 7070 +VirtReg_GR32_BSI 7071 +VirtReg_GR32_CB 7072 +VirtReg_GR32_DC 7073 +VirtReg_GR32_DIBP 7074 +VirtReg_GR32_SIDI 7075 +VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_32bit 7076 +VirtReg_CCR 7077 +VirtReg_DFCCR 7078 +VirtReg_GR32_ABCD_and_GR32_BSI 7079 +VirtReg_GR32_AD_and_GR32_ArgRef 7080 +VirtReg_GR32_ArgRef_and_GR32_CB 7081 +VirtReg_GR32_BPSP_and_GR32_DIBP 7082 +VirtReg_GR32_BPSP_and_GR32_TC 7083 +VirtReg_GR32_BSI_and_GR32_SIDI 7084 +VirtReg_GR32_DIBP_and_GR32_SIDI 7085 +VirtReg_LOW32_ADDR_ACCESS_RBP_with_sub_8bit_with_sub_32bit 7086 +VirtReg_LOW32_ADDR_ACCESS_with_sub_32bit 7087 +VirtReg_RFP64 7088 +VirtReg_GR64 7089 +VirtReg_FR64X 7090 +VirtReg_GR64_with_sub_8bit 7091 +VirtReg_GR64_NOSP 7092 +VirtReg_GR64_NOREX2 7093 +VirtReg_CONTROL_REG 7094 +VirtReg_FR64 7095 +VirtReg_GR64_with_sub_16bit_in_GR16_NOREX2 7096 +VirtReg_GR64_NOREX2_NOSP 7097 +VirtReg_GR64PLTSafe 7098 +VirtReg_GR64_TC 7099 +VirtReg_GR64_NOREX 7100 +VirtReg_GR64_TCW64 7101 +VirtReg_GR64_TC_with_sub_8bit 7102 +VirtReg_GR64_NOREX2_NOSP_and_GR64_TC 7103 +VirtReg_GR64_TCW64_with_sub_8bit 7104 +VirtReg_GR64_TC_and_GR64_TCW64 7105 +VirtReg_GR64_with_sub_16bit_in_GR16_NOREX 7106 +VirtReg_VK64 7107 +VirtReg_VR64 7108 +VirtReg_GR64PLTSafe_and_GR64_TC 7109 +VirtReg_GR64_NOREX2_NOSP_and_GR64_TCW64 7110 +VirtReg_GR64_NOREX_NOSP 7111 +VirtReg_GR64_NOREX_and_GR64_TC 7112 +VirtReg_GR64_TCW64_and_GR64_TC_with_sub_8bit 7113 +VirtReg_VK64WM 7114 +VirtReg_GR64_TC_and_GR64_NOREX2_NOSP_and_GR64_TCW64 7115 +VirtReg_GR64_TC_and_GR64_with_sub_16bit_in_GR16_NOREX 7116 +VirtReg_GR64PLTSafe_and_GR64_TCW64 7117 +VirtReg_GR64_NOREX_and_GR64PLTSafe_and_GR64_TC 7118 +VirtReg_GR64_NOREX_and_GR64_TCW64 7119 +VirtReg_GR64_ABCD 7120 +VirtReg_GR64_with_sub_32bit_in_GR32_TC 7121 +VirtReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_TC 7122 +VirtReg_GR64_AD 7123 +VirtReg_GR64_ArgRef 7124 +VirtReg_GR64_and_LOW32_ADDR_ACCESS_RBP 7125 +VirtReg_GR64_with_sub_32bit_in_GR32_ArgRef 7126 +VirtReg_GR64_with_sub_32bit_in_GR32_BPSP 7127 +VirtReg_GR64_with_sub_32bit_in_GR32_BSI 7128 +VirtReg_GR64_with_sub_32bit_in_GR32_CB 7129 +VirtReg_GR64_with_sub_32bit_in_GR32_DIBP 7130 +VirtReg_GR64_with_sub_32bit_in_GR32_SIDI 7131 +VirtReg_GR64_A 7132 +VirtReg_GR64_ArgRef_and_GR64_TC 7133 +VirtReg_GR64_and_LOW32_ADDR_ACCESS 7134 +VirtReg_GR64_with_sub_32bit_in_GR32_ABCD_and_GR32_BSI 7135 +VirtReg_GR64_with_sub_32bit_in_GR32_AD_and_GR32_ArgRef 7136 +VirtReg_GR64_with_sub_32bit_in_GR32_ArgRef_and_GR32_CB 7137 +VirtReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_DIBP 7138 +VirtReg_GR64_with_sub_32bit_in_GR32_BPSP_and_GR32_TC 7139 +VirtReg_GR64_with_sub_32bit_in_GR32_BSI_and_GR32_SIDI 7140 +VirtReg_GR64_with_sub_32bit_in_GR32_DIBP_and_GR32_SIDI 7141 +VirtReg_RST 7142 +VirtReg_RFP80 7143 +VirtReg_RFP80_7 7144 +VirtReg_VR128X 7145 +VirtReg_VR128 7146 +VirtReg_VR256X 7147 +VirtReg_VR256 7148 +VirtReg_VR512 7149 +VirtReg_VR512_0_15 7150 +VirtReg_TILE 7151 From ba4abc61a1f53a80d0526ce5201d5b4e0b556025 Mon Sep 17 00:00:00 2001 From: Jakub Kuderski Date: Thu, 6 Nov 2025 11:55:06 -0500 Subject: [PATCH 06/71] [Support] Fix up cast function object definitions. NFC. (#166789) The template arguments specify the *target* type, not the *source* type. --- llvm/include/llvm/Support/Casting.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/Support/Casting.h b/llvm/include/llvm/Support/Casting.h index a6435a2562a2b..af283e2c8ada3 100644 --- a/llvm/include/llvm/Support/Casting.h +++ b/llvm/include/llvm/Support/Casting.h @@ -878,18 +878,18 @@ inline constexpr detail::IsaAndPresentCheckPredicate IsaAndPresentPred{}; /// Function objects corresponding to the Cast types defined above. -template -inline constexpr detail::StaticCastFunc StaticCastTo{}; +template +inline constexpr detail::StaticCastFunc StaticCastTo{}; -template inline constexpr detail::CastFunc CastTo{}; +template inline constexpr detail::CastFunc CastTo{}; -template -inline constexpr detail::CastIfPresentFunc CastIfPresentTo{}; +template +inline constexpr detail::CastIfPresentFunc CastIfPresentTo{}; -template -inline constexpr detail::DynCastIfPresentFunc DynCastIfPresentTo{}; +template +inline constexpr detail::DynCastIfPresentFunc DynCastIfPresentTo{}; -template inline constexpr detail::DynCastFunc DynCastTo{}; +template inline constexpr detail::DynCastFunc DynCastTo{}; } // end namespace llvm From 6ac458527d88f480be9eee4147fab7469fad7f52 Mon Sep 17 00:00:00 2001 From: Sergej Salnikov Date: Thu, 6 Nov 2025 17:59:01 +0100 Subject: [PATCH 07/71] [clang][AST] Do not try to handle irrelevant cases in writeBareSourceLocation (#166588) `writeBareSourceLocation` is always called on either `Expanded` or `Spelling` location, in any on those cases the `SM.getSpellingLineNumber(Loc) == SM.getExpansionLineNumber(Loc) == SM.getLineNumber(Loc)`. --- clang/include/clang/AST/JSONNodeDumper.h | 2 +- clang/lib/AST/JSONNodeDumper.cpp | 21 +++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/AST/JSONNodeDumper.h b/clang/include/clang/AST/JSONNodeDumper.h index 427a9c51ece1b..d364795a05811 100644 --- a/clang/include/clang/AST/JSONNodeDumper.h +++ b/clang/include/clang/AST/JSONNodeDumper.h @@ -149,7 +149,7 @@ class JSONNodeDumper void writeIncludeStack(PresumedLoc Loc, bool JustFirst = false); // Writes the attributes of a SourceLocation object without. - void writeBareSourceLocation(SourceLocation Loc, bool IsSpelling); + void writeBareSourceLocation(SourceLocation Loc); // Writes the attributes of a SourceLocation to JSON based on its presumed // spelling location. If the given location represents a macro invocation, diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 9f4dba9f14fa6..89abf888cbbba 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -272,15 +272,13 @@ void JSONNodeDumper::writeIncludeStack(PresumedLoc Loc, bool JustFirst) { JOS.attributeEnd(); } -void JSONNodeDumper::writeBareSourceLocation(SourceLocation Loc, - bool IsSpelling) { +void JSONNodeDumper::writeBareSourceLocation(SourceLocation Loc) { PresumedLoc Presumed = SM.getPresumedLoc(Loc); - unsigned ActualLine = IsSpelling ? SM.getSpellingLineNumber(Loc) - : SM.getExpansionLineNumber(Loc); - StringRef ActualFile = SM.getBufferName(Loc); - if (Presumed.isValid()) { - JOS.attribute("offset", SM.getDecomposedLoc(Loc).second); + StringRef ActualFile = SM.getBufferName(Loc); + auto [FID, FilePos] = SM.getDecomposedLoc(Loc); + unsigned ActualLine = SM.getLineNumber(FID, FilePos); + JOS.attribute("offset", FilePos); if (LastLocFilename != ActualFile) { JOS.attribute("file", ActualFile); JOS.attribute("line", ActualLine); @@ -318,18 +316,17 @@ void JSONNodeDumper::writeSourceLocation(SourceLocation Loc) { if (Expansion != Spelling) { // If the expansion and the spelling are different, output subobjects // describing both locations. - JOS.attributeObject("spellingLoc", [Spelling, this] { - writeBareSourceLocation(Spelling, /*IsSpelling*/ true); - }); + JOS.attributeObject( + "spellingLoc", [Spelling, this] { writeBareSourceLocation(Spelling); }); JOS.attributeObject("expansionLoc", [Expansion, Loc, this] { - writeBareSourceLocation(Expansion, /*IsSpelling*/ false); + writeBareSourceLocation(Expansion); // If there is a macro expansion, add extra information if the interesting // bit is the macro arg expansion. if (SM.isMacroArgExpansion(Loc)) JOS.attribute("isMacroArgExpansion", true); }); } else - writeBareSourceLocation(Spelling, /*IsSpelling*/ true); + writeBareSourceLocation(Spelling); } void JSONNodeDumper::writeSourceRange(SourceRange R) { From 83930beb8d0162a40489bce95fef0362b385db91 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 17:02:18 +0000 Subject: [PATCH 08/71] [CI] Ensure compatibility with Python 3.8 55436aeb2e8275d803a0e1bdff432717a1cf86b5 broke this on Windows as we only use Python 3.9 there, but the construct is only supported from 3.10 onwards. Use the old Optional type to ensure compatibility. --- .ci/generate_test_report_lib.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/generate_test_report_lib.py b/.ci/generate_test_report_lib.py index 48a6be903da41..ce8262f0dc73f 100644 --- a/.ci/generate_test_report_lib.py +++ b/.ci/generate_test_report_lib.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception """Library to parse JUnit XML files and return a markdown report.""" -from typing import TypedDict +from typing import TypedDict, Optional import platform from junitparser import JUnitXml, Failure @@ -11,10 +11,12 @@ # This data structure should match the definition in llvm-zorg in # premerge/advisor/advisor_lib.py +# TODO(boomanaiden154): Drop the Optional here and switch to str | None when +# we require Python 3.10. class FailureExplanation(TypedDict): name: str explained: bool - reason: str | None + reason: Optional[str] SEE_BUILD_FILE_STR = "Download the build's log file to see the details." From 75c09b792433fffc442e0ea53b45ee8e330f8acc Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Thu, 6 Nov 2025 09:14:50 -0800 Subject: [PATCH 09/71] [DirectX] Let data scalarizer pass account for sub-types when updating GEP type (#166200) This pr lets the `dxil-data-scalarization` account for a GEP with a source type that is a sub-type of the pointer operand type. The pass is updated so that the replaced GEP introduces zero indices such that the result type remains the same (with the vector -> array transform). Please see resolved issue for an annotated example. Resolves: https://github.com/llvm/llvm-project/issues/165473 --- .../Target/DirectX/DXILDataScalarization.cpp | 68 +++++++++++++----- llvm/test/CodeGen/DirectX/scalarize-alloca.ll | 65 +++++++++++++++++ llvm/test/CodeGen/DirectX/scalarize-global.ll | 70 +++++++++++++++++++ 3 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/scalarize-global.ll diff --git a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp index d507d71b99fc9..9f1616f6960fe 100644 --- a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp +++ b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp @@ -304,40 +304,76 @@ bool DataScalarizerVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) { GEPOperator *GOp = cast(&GEPI); Value *PtrOperand = GOp->getPointerOperand(); Type *NewGEPType = GOp->getSourceElementType(); - bool NeedsTransform = false; // Unwrap GEP ConstantExprs to find the base operand and element type - while (auto *CE = dyn_cast(PtrOperand)) { - if (auto *GEPCE = dyn_cast(CE)) { - GOp = GEPCE; - PtrOperand = GEPCE->getPointerOperand(); - NewGEPType = GEPCE->getSourceElementType(); - } else - break; + while (auto *GEPCE = dyn_cast_or_null( + dyn_cast(PtrOperand))) { + GOp = GEPCE; + PtrOperand = GEPCE->getPointerOperand(); + NewGEPType = GEPCE->getSourceElementType(); } + Type *const OrigGEPType = NewGEPType; + Value *const OrigOperand = PtrOperand; + if (GlobalVariable *NewGlobal = lookupReplacementGlobal(PtrOperand)) { NewGEPType = NewGlobal->getValueType(); PtrOperand = NewGlobal; - NeedsTransform = true; } else if (AllocaInst *Alloca = dyn_cast(PtrOperand)) { Type *AllocatedType = Alloca->getAllocatedType(); if (isa(AllocatedType) && - AllocatedType != GOp->getResultElementType()) { + AllocatedType != GOp->getResultElementType()) NewGEPType = AllocatedType; - NeedsTransform = true; + } else + return false; // Only GEPs into an alloca or global variable are considered + + // Defer changing i8 GEP types until dxil-flatten-arrays + if (OrigGEPType->isIntegerTy(8)) + NewGEPType = OrigGEPType; + + // If the original type is a "sub-type" of the new type, then ensure the gep + // correctly zero-indexes the extra dimensions to keep the offset calculation + // correct. + // Eg: + // i32, [4 x i32] and [8 x [4 x i32]] are sub-types of [8 x [4 x i32]], etc. + // + // So then: + // gep [4 x i32] %idx + // -> gep [8 x [4 x i32]], i32 0, i32 %idx + // gep i32 %idx + // -> gep [8 x [4 x i32]], i32 0, i32 0, i32 %idx + uint32_t MissingDims = 0; + Type *SubType = NewGEPType; + + // The new type will be in its array version; so match accordingly. + Type *const GEPArrType = equivalentArrayTypeFromVector(OrigGEPType); + + while (SubType != GEPArrType) { + MissingDims++; + + ArrayType *ArrType = dyn_cast(SubType); + if (!ArrType) { + assert(SubType == GEPArrType && + "GEP uses an DXIL invalid sub-type of alloca/global variable"); + break; } + + SubType = ArrType->getElementType(); } + bool NeedsTransform = OrigOperand != PtrOperand || + OrigGEPType != NewGEPType || MissingDims != 0; + if (!NeedsTransform) return false; - // Keep scalar GEPs scalar; dxil-flatten-arrays will do flattening later - if (!isa(GOp->getSourceElementType())) - NewGEPType = GOp->getSourceElementType(); - IRBuilder<> Builder(&GEPI); - SmallVector Indices(GOp->indices()); + SmallVector Indices; + + for (uint32_t I = 0; I < MissingDims; I++) + Indices.push_back(Builder.getInt32(0)); + llvm::append_range(Indices, GOp->indices()); + Value *NewGEP = Builder.CreateGEP(NewGEPType, PtrOperand, Indices, GOp->getName(), GOp->getNoWrapFlags()); diff --git a/llvm/test/CodeGen/DirectX/scalarize-alloca.ll b/llvm/test/CodeGen/DirectX/scalarize-alloca.ll index a8557e47b0ea6..475935d2eb135 100644 --- a/llvm/test/CodeGen/DirectX/scalarize-alloca.ll +++ b/llvm/test/CodeGen/DirectX/scalarize-alloca.ll @@ -42,3 +42,68 @@ define void @alloca_2d_gep_test() { %3 = getelementptr inbounds nuw [2 x <2 x i32>], ptr %1, i32 0, i32 %2 ret void } + +; CHECK-LABEL: subtype_array_test +define void @subtype_array_test() { + ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 4 + ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 4 + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr [[alloca_val]], i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 4 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]] + ; CHECK: ret void + %arr = alloca [8 x [4 x i32]], align 4 + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw [4 x i32], ptr %arr, i32 %i + ret void +} + +; CHECK-LABEL: subtype_vector_test +define void @subtype_vector_test() { + ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 4 + ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 4 + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr [[alloca_val]], i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 4 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]] + ; CHECK: ret void + %arr = alloca [8 x <4 x i32>], align 4 + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw <4 x i32>, ptr %arr, i32 %i + ret void +} + +; CHECK-LABEL: subtype_scalar_test +define void @subtype_scalar_test() { + ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 4 + ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 4 + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr [[alloca_val]], i32 0, i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 1 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]] + ; CHECK: ret void + %arr = alloca [8 x [4 x i32]], align 4 + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw i32, ptr %arr, i32 %i + ret void +} + +; CHECK-LABEL: subtype_i8_test +define void @subtype_i8_test() { + ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 4 + ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 4 + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw i8, ptr [[alloca_val]], i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 1 + ; FCHECK: [[flatidx_lshr:%.*]] = lshr i32 [[flatidx_mul]], 2 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_lshr]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]] + ; CHECK: ret void + %arr = alloca [8 x [4 x i32]], align 4 + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw i8, ptr %arr, i32 %i + ret void +} diff --git a/llvm/test/CodeGen/DirectX/scalarize-global.ll b/llvm/test/CodeGen/DirectX/scalarize-global.ll new file mode 100644 index 0000000000000..ca10f6ece5a85 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/scalarize-global.ll @@ -0,0 +1,70 @@ +; RUN: opt -S -passes='dxil-data-scalarization' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=SCHECK,CHECK +; RUN: opt -S -passes='dxil-data-scalarization,dxil-flatten-arrays' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=FCHECK,CHECK + +@"arrayofVecData" = local_unnamed_addr addrspace(3) global [8 x <4 x i32>] zeroinitializer, align 16 +@"vecData" = external addrspace(3) global <4 x i32>, align 4 + +; SCHECK: [[arrayofVecData:@arrayofVecData.*]] = local_unnamed_addr addrspace(3) global [8 x [4 x i32]] zeroinitializer, align 16 +; FCHECK: [[arrayofVecData:@arrayofVecData.*]] = local_unnamed_addr addrspace(3) global [32 x i32] zeroinitializer, align 16 +; CHECK: [[vecData:@vecData.*]] = external addrspace(3) global [4 x i32], align 4 + +; CHECK-LABEL: subtype_array_test +define <4 x i32> @subtype_array_test() { + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 4 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[flatidx]] + ; CHECK: [[x:%.*]] = load <4 x i32>, ptr addrspace(3) [[gep]], align 4 + ; CHECK: ret <4 x i32> [[x]] + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw [4 x i32], ptr addrspace(3) @"arrayofVecData", i32 %i + %x = load <4 x i32>, ptr addrspace(3) %gep, align 4 + ret <4 x i32> %x +} + +; CHECK-LABEL: subtype_vector_test +define <4 x i32> @subtype_vector_test() { + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 4 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[flatidx]] + ; CHECK: [[x:%.*]] = load <4 x i32>, ptr addrspace(3) [[gep]], align 4 + ; CHECK: ret <4 x i32> [[x]] + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw <4 x i32>, ptr addrspace(3) @"arrayofVecData", i32 %i + %x = load <4 x i32>, ptr addrspace(3) %gep, align 4 + ret <4 x i32> %x +} + +; CHECK-LABEL: subtype_scalar_test +define <4 x i32> @subtype_scalar_test() { + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [8 x [4 x i32]], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 0, i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 1 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[flatidx]] + ; CHECK: [[x:%.*]] = load <4 x i32>, ptr addrspace(3) [[gep]], align 4 + ; CHECK: ret <4 x i32> [[x]] + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw i32, ptr addrspace(3) @"arrayofVecData", i32 %i + %x = load <4 x i32>, ptr addrspace(3) %gep, align 4 + ret <4 x i32> %x +} + +; CHECK-LABEL: subtype_i8_test +define <4 x i32> @subtype_i8_test() { + ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0) + ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(3) [[arrayofVecData]], i32 [[tid]] + ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 1 + ; FCHECK: [[flatidx_lshr:%.*]] = lshr i32 [[flatidx_mul]], 2 + ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_lshr]] + ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr addrspace(3) [[arrayofVecData]], i32 0, i32 [[flatidx]] + ; CHECK: [[x:%.*]] = load <4 x i32>, ptr addrspace(3) [[gep]], align 4 + ; CHECK: ret <4 x i32> [[x]] + %i = tail call i32 @llvm.dx.thread.id(i32 0) + %gep = getelementptr inbounds nuw i8, ptr addrspace(3) @"arrayofVecData", i32 %i + %x = load <4 x i32>, ptr addrspace(3) %gep, align 4 + ret <4 x i32> %x +} From 50daf4d6005e4ae6073b4114b920414afe77609d Mon Sep 17 00:00:00 2001 From: Daniel Thornburgh Date: Thu, 6 Nov 2025 09:16:47 -0800 Subject: [PATCH 10/71] Add @llvm.reloc.none intrinsic to LLVM release notes (#166805) This declares PR #147427. --- llvm/docs/ReleaseNotes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index bfe68274eae3f..23bba99ec874f 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -67,6 +67,9 @@ Changes to the LLVM IR Instead, the `align` attribute should be placed on the pointer (or vector of pointers) argument. * A `load atomic` may now be used with vector types on x86. +* Added `@llvm.reloc.none` intrinsic to emit null relocations to symbols. This + emits an undefined symbol reference without adding any dedicated code or data to + to bear the relocation. Changes to LLVM infrastructure ------------------------------ From 210b9a58f68baad990a4d0b3b1a0874c700bdbc7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 6 Nov 2025 17:17:50 +0000 Subject: [PATCH 11/71] [Github] Update GitHub Artifact Actions (major) (#166112) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/download-artifact](https://redirect.github.com/actions/download-artifact) | action | major | `v5.0.0` -> `v6.0.0` | | [actions/upload-artifact](https://redirect.github.com/actions/upload-artifact) | action | major | `v4.6.2` -> `v5.0.0` | | [actions/upload-artifact](https://redirect.github.com/actions/upload-artifact) | action | major | `4.6.2` -> `5.0.0` | --- .github/workflows/build-ci-container-tooling.yml | 4 ++-- .github/workflows/build-ci-container-windows.yml | 4 ++-- .github/workflows/build-ci-container.yml | 4 ++-- .github/workflows/build-metrics-container.yml | 4 ++-- .github/workflows/ci-post-commit-analyzer.yml | 2 +- .github/workflows/commit-access-review.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/email-check.yaml | 2 +- .github/workflows/libclang-abi-tests.yml | 8 ++++---- .github/workflows/libcxx-build-and-test.yaml | 8 ++++---- .github/workflows/llvm-abi-tests.yml | 12 ++++++------ .github/workflows/pr-code-format.yml | 2 +- .github/workflows/pr-code-lint.yml | 2 +- .github/workflows/pr-request-release-note.yml | 2 +- .github/workflows/premerge.yaml | 4 ++-- .github/workflows/release-binaries.yml | 6 +++--- .github/workflows/release-documentation.yml | 2 +- .github/workflows/release-sources.yml | 2 +- .github/workflows/scorecard.yml | 2 +- 19 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build-ci-container-tooling.yml b/.github/workflows/build-ci-container-tooling.yml index 992947eb2fffb..d3e33e2ccf931 100644 --- a/.github/workflows/build-ci-container-tooling.yml +++ b/.github/workflows/build-ci-container-tooling.yml @@ -63,7 +63,7 @@ jobs: podman save ${{ steps.vars.outputs.container-name-lint-tag }} > ${{ steps.vars.outputs.container-lint-filename }} - name: Upload container image - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: container-amd64 path: "*.tar" @@ -86,7 +86,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Download container - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - name: Push Container run: | diff --git a/.github/workflows/build-ci-container-windows.yml b/.github/workflows/build-ci-container-windows.yml index 14c349b1b2fe5..b6c46b70030ab 100644 --- a/.github/workflows/build-ci-container-windows.yml +++ b/.github/workflows/build-ci-container-windows.yml @@ -44,7 +44,7 @@ jobs: run: | docker save ${{ steps.vars.outputs.container-name-tag }} > ${{ steps.vars.outputs.container-filename }} - name: Upload container image - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: container path: ${{ steps.vars.outputs.container-filename }} @@ -61,7 +61,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Download container - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: container - name: Push Container diff --git a/.github/workflows/build-ci-container.yml b/.github/workflows/build-ci-container.yml index 027c558afdd0b..49c10d3318330 100644 --- a/.github/workflows/build-ci-container.yml +++ b/.github/workflows/build-ci-container.yml @@ -64,7 +64,7 @@ jobs: podman save ${{ steps.vars.outputs.container-name-agent-tag }} > ${{ steps.vars.outputs.container-agent-filename }} - name: Upload container image - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: container-${{ matrix.arch }} path: "*.tar" @@ -88,7 +88,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Download container - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - name: Push Container run: | diff --git a/.github/workflows/build-metrics-container.yml b/.github/workflows/build-metrics-container.yml index 69b571575f40c..786c41214d853 100644 --- a/.github/workflows/build-metrics-container.yml +++ b/.github/workflows/build-metrics-container.yml @@ -49,7 +49,7 @@ jobs: run: | podman save ${{ steps.vars.outputs.container-name-tag }} > ${{ steps.vars.outputs.container-filename }} - name: Upload Container Image - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: container path: ${{ steps.vars.outputs.container-filename }} @@ -66,7 +66,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Download Container - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: container - name: Push Container diff --git a/.github/workflows/ci-post-commit-analyzer.yml b/.github/workflows/ci-post-commit-analyzer.yml index 49cf4100dd71c..59df0b68a8ad7 100644 --- a/.github/workflows/ci-post-commit-analyzer.yml +++ b/.github/workflows/ci-post-commit-analyzer.yml @@ -87,7 +87,7 @@ jobs: scan-build --generate-index-only build/analyzer-results - name: Upload Results - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: analyzer-results diff --git a/.github/workflows/commit-access-review.yml b/.github/workflows/commit-access-review.yml index 734dc212fa648..7cdcfca532990 100644 --- a/.github/workflows/commit-access-review.yml +++ b/.github/workflows/commit-access-review.yml @@ -28,7 +28,7 @@ jobs: python3 .github/workflows/commit-access-review.py $GITHUB_TOKEN - name: Upload Triage List - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: triagers path: triagers.log diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7374777cb759c..2f9354a798e42 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -209,7 +209,7 @@ jobs: mkdir built-docs/flang cp -r flang-build/docs/* built-docs/flang/ - name: Upload docs - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: docs-output path: built-docs/ diff --git a/.github/workflows/email-check.yaml b/.github/workflows/email-check.yaml index 981c6fa62cb19..ba625b2b3b062 100644 --- a/.github/workflows/email-check.yaml +++ b/.github/workflows/email-check.yaml @@ -39,7 +39,7 @@ jobs: [{"body" : "$COMMENT"}] EOF - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: workflow-args diff --git a/.github/workflows/libclang-abi-tests.yml b/.github/workflows/libclang-abi-tests.yml index 432c45744abda..6377dd53d1f6c 100644 --- a/.github/workflows/libclang-abi-tests.yml +++ b/.github/workflows/libclang-abi-tests.yml @@ -131,7 +131,7 @@ jobs: sed -i 's/LLVM_[0-9]\+/LLVM_NOVERSION/' $lib-${{ matrix.ref }}.abi done - name: Upload ABI file - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: ${{ matrix.name }} path: '*${{ matrix.ref }}.abi' @@ -144,12 +144,12 @@ jobs: - abi-dump steps: - name: Download baseline - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: build-baseline path: build-baseline - name: Download latest - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: build-latest path: build-latest @@ -165,7 +165,7 @@ jobs: done - name: Upload ABI Comparison if: always() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: compat-report-${{ github.sha }} path: compat_reports/ diff --git a/.github/workflows/libcxx-build-and-test.yaml b/.github/workflows/libcxx-build-and-test.yaml index 6c8f2cb45ee0a..461b723bd736b 100644 --- a/.github/workflows/libcxx-build-and-test.yaml +++ b/.github/workflows/libcxx-build-and-test.yaml @@ -60,7 +60,7 @@ jobs: env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: ${{ matrix.config }}-${{ matrix.cxx }}-results @@ -105,7 +105,7 @@ jobs: env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() # Upload artifacts even if the build or test suite fails with: name: ${{ matrix.config }}-${{ matrix.cxx }}-results @@ -169,7 +169,7 @@ jobs: env: CC: clang-22 CXX: clang++-22 - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: ${{ matrix.config }}-results @@ -223,7 +223,7 @@ jobs: source .venv/bin/activate python -m pip install psutil bash libcxx/utils/ci/run-buildbot ${{ matrix.config }} - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() # Upload artifacts even if the build or test suite fails with: name: macos-${{ matrix.config }}-results diff --git a/.github/workflows/llvm-abi-tests.yml b/.github/workflows/llvm-abi-tests.yml index 961f1cc79389d..b0c2d32d4a41b 100644 --- a/.github/workflows/llvm-abi-tests.yml +++ b/.github/workflows/llvm-abi-tests.yml @@ -128,14 +128,14 @@ jobs: # Remove symbol versioning from dumps, so we can compare across major versions. sed -i 's/LLVM_${{ matrix.llvm_version_major }}/LLVM_NOVERSION/' ${{ matrix.ref }}.abi - name: Upload ABI file - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: ${{ matrix.name }} path: ${{ matrix.ref }}.abi - name: Upload symbol list file if: matrix.name == 'build-baseline' - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: symbol-list path: llvm.symbols @@ -148,17 +148,17 @@ jobs: - abi-dump steps: - name: Download baseline - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: build-baseline path: build-baseline - name: Download latest - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: build-latest path: build-latest - name: Download symbol list - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: symbol-list path: symbol-list @@ -179,7 +179,7 @@ jobs: abi-compliance-checker $EXTRA_ARGS -l libLLVM.so -old build-baseline/*.abi -new build-latest/*.abi || test "${{ needs.abi-dump-setup.outputs.ABI_HEADERS }}" = "llvm-c" - name: Upload ABI Comparison if: always() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: compat-report-${{ github.sha }} path: compat_reports/ diff --git a/.github/workflows/pr-code-format.yml b/.github/workflows/pr-code-format.yml index ac0689b4d3243..029325c51d41f 100644 --- a/.github/workflows/pr-code-format.yml +++ b/.github/workflows/pr-code-format.yml @@ -56,7 +56,7 @@ jobs: --end-rev HEAD \ --changed-files "$CHANGED_FILES" - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: workflow-args diff --git a/.github/workflows/pr-code-lint.yml b/.github/workflows/pr-code-lint.yml index 8ba9378703739..3cb564feb255b 100644 --- a/.github/workflows/pr-code-lint.yml +++ b/.github/workflows/pr-code-lint.yml @@ -91,7 +91,7 @@ jobs: --changed-files "$CHANGED_FILES" - name: Upload results - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: workflow-args diff --git a/.github/workflows/pr-request-release-note.yml b/.github/workflows/pr-request-release-note.yml index 8162a8984ee5f..c2dc2de65f133 100644 --- a/.github/workflows/pr-request-release-note.yml +++ b/.github/workflows/pr-request-release-note.yml @@ -41,7 +41,7 @@ jobs: request-release-note \ --pr-number ${{ github.event.pull_request.number}} - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: workflow-args diff --git a/.github/workflows/premerge.yaml b/.github/workflows/premerge.yaml index 973d3abf358ce..8503b2d62c5eb 100644 --- a/.github/workflows/premerge.yaml +++ b/.github/workflows/premerge.yaml @@ -110,7 +110,7 @@ jobs: # https://github.com/actions/upload-artifact/issues/569 continue-on-error: true if: '!cancelled()' - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: Premerge Artifacts (Linux ${{ runner.arch }}) path: artifacts/ @@ -165,7 +165,7 @@ jobs: # https://github.com/actions/upload-artifact/issues/569 continue-on-error: true if: '!cancelled()' - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: Premerge Artifacts (Windows) path: artifacts/ diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 25f426b7814df..9263754aa021a 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -225,7 +225,7 @@ jobs: release_dir=`find ${{ steps.setup-stage.outputs.build-prefix }}/build -iname 'stage2-bins'` mv $release_dir/${{ needs.prepare.outputs.release-binary-filename }} . - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: ${{ runner.os }}-${{ runner.arch }}-release-binary # Due to path differences on Windows when running in bash vs running on node, @@ -263,7 +263,7 @@ jobs: sparse-checkout-cone-mode: false - name: 'Download artifact' - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: pattern: '*-release-binary' merge-multiple: true @@ -279,7 +279,7 @@ jobs: mv ${{ steps.provenance.outputs.bundle-path }} ${{ needs.prepare.outputs.release-binary-filename }}.jsonl - name: Upload Build Provenance - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: ${{ needs.prepare.outputs.release-binary-filename }}-attestation path: ${{ needs.prepare.outputs.release-binary-filename }}.jsonl diff --git a/.github/workflows/release-documentation.yml b/.github/workflows/release-documentation.yml index 4cf973d000a4b..9b77112e9bddb 100644 --- a/.github/workflows/release-documentation.yml +++ b/.github/workflows/release-documentation.yml @@ -63,7 +63,7 @@ jobs: ./llvm/utils/release/build-docs.sh -release "${{ inputs.release-version }}" -no-doxygen - name: Create Release Notes Artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # 5.0.0 with: name: release-notes path: docs-build/html-export/ diff --git a/.github/workflows/release-sources.yml b/.github/workflows/release-sources.yml index 2278b96dbe242..70323c276c18d 100644 --- a/.github/workflows/release-sources.yml +++ b/.github/workflows/release-sources.yml @@ -99,7 +99,7 @@ jobs: run: | mv ${{ steps.provenance.outputs.bundle-path }} . - name: Create Tarball Artifacts - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: path: | *.xz diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index bd3277a8b452c..084511935fa27 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -49,7 +49,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: SARIF file path: results.sarif From 70f5fd47a4974e1e47f85b95e3249d505d570501 Mon Sep 17 00:00:00 2001 From: Abid Qadeer Date: Thu, 6 Nov 2025 17:18:07 +0000 Subject: [PATCH 12/71] [flang][debug] Add debug type support for procedure pointers (#166764) Fixes #161223 Procedure pointers in Fortran were generating incorrect debug type information, showing as 'integer' in GDB instead of the actual procedure signature. --- .../Transforms/DebugTypeGenerator.cpp | 25 +++++++++++ flang/test/Integration/debug-proc-ptr-e2e.f90 | 26 ++++++++++++ flang/test/Transforms/debug-proc-ptr.fir | 41 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 flang/test/Integration/debug-proc-ptr-e2e.f90 create mode 100644 flang/test/Transforms/debug-proc-ptr.fir diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index e1e6125fc348b..8019c399f3779 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -718,6 +718,31 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, return convertRecordType(recTy, fileAttr, scope, declOp); } else if (auto tupleTy = mlir::dyn_cast_if_present(Ty)) { return convertTupleType(tupleTy, fileAttr, scope, declOp); + } else if (mlir::isa(Ty)) { + // Handle function types - these represent procedure pointers after the + // BoxedProcedure pass has run and unwrapped the fir.boxproc type, as well + // as dummy procedures (which are represented as function types in FIR) + llvm::SmallVector types; + + auto funcTy = mlir::cast(Ty); + // Add return type (or void if no return type) + if (funcTy.getNumResults() == 0) + types.push_back(mlir::LLVM::DINullTypeAttr::get(context)); + else + types.push_back( + convertType(funcTy.getResult(0), fileAttr, scope, declOp)); + + for (mlir::Type paramTy : funcTy.getInputs()) + types.push_back(convertType(paramTy, fileAttr, scope, declOp)); + + auto subroutineTy = mlir::LLVM::DISubroutineTypeAttr::get( + context, /*callingConvention=*/0, types); + + return mlir::LLVM::DIDerivedTypeAttr::get( + context, llvm::dwarf::DW_TAG_pointer_type, + mlir::StringAttr::get(context, ""), subroutineTy, + /*sizeInBits=*/ptrSize * 8, /*alignInBits=*/0, /*offset=*/0, + /*optional
=*/std::nullopt, /*extra data=*/nullptr); } else if (auto refTy = mlir::dyn_cast_if_present(Ty)) { auto elTy = refTy.getEleTy(); return convertPointerLikeType(elTy, fileAttr, scope, declOp, diff --git a/flang/test/Integration/debug-proc-ptr-e2e.f90 b/flang/test/Integration/debug-proc-ptr-e2e.f90 new file mode 100644 index 0000000000000..aa89160b7c8f9 --- /dev/null +++ b/flang/test/Integration/debug-proc-ptr-e2e.f90 @@ -0,0 +1,26 @@ +! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s + +program test_proc_ptr + implicit none + procedure(fun1), pointer :: fun_ptr + + fun_ptr => fun1 + print *, fun_ptr(3) + +contains + integer function fun1(x) + integer :: x + fun1 = x + 1 + end function fun1 +end program test_proc_ptr + +! Check that fun_ptr is declared with correct type +! CHECK-DAG: ![[INT:.*]] = !DIBasicType(name: "integer", size: 32, encoding: DW_ATE_signed) +! CHECK-DAG: ![[PTR_INT:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[INT]], size: 64) + +! Check that fun_ptr variable is a pointer to a subroutine type +! The order is: DILocalVariable -> pointer type -> subroutine type -> {return, params} +! CHECK-DAG: ![[FUN_PTR_VAR:.*]] = !DILocalVariable(name: "fun_ptr", {{.*}}type: ![[PROC_PTR:[0-9]+]] +! CHECK-DAG: ![[PROC_PTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[SUBR_TYPE:[0-9]+]], size: 64) +! CHECK-DAG: ![[SUBR_TYPE]] = !DISubroutineType(types: ![[SUBR_TYPES:[0-9]+]]) +! CHECK-DAG: ![[SUBR_TYPES]] = !{![[INT]], ![[PTR_INT]]} diff --git a/flang/test/Transforms/debug-proc-ptr.fir b/flang/test/Transforms/debug-proc-ptr.fir new file mode 100644 index 0000000000000..2963557786907 --- /dev/null +++ b/flang/test/Transforms/debug-proc-ptr.fir @@ -0,0 +1,41 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module { + func.func @_QQmain() attributes {fir.bindc_name = "test"} { + %0 = fir.alloca (!fir.ref) -> i32 {bindc_name = "fun_ptr", uniq_name = "_QFEfun_ptr"} + %1 = fircg.ext_declare %0 {uniq_name = "_QFEfun_ptr"} : (!fir.ref<(!fir.ref) -> i32>) -> !fir.ref<(!fir.ref) -> i32> loc(#loc1) + + // Procedure pointer with no return: procedure(sub1), pointer :: sub_ptr + %2 = fir.alloca () -> () {bindc_name = "sub_ptr", uniq_name = "_QFEsub_ptr"} + %3 = fircg.ext_declare %2 {uniq_name = "_QFEsub_ptr"} : (!fir.ref<() -> ()>) -> !fir.ref<() -> ()> loc(#loc2) + + // Procedure pointer with multiple args: procedure(func2), pointer :: func_ptr + %4 = fir.alloca (!fir.ref, !fir.ref) -> f32 {bindc_name = "func_ptr", uniq_name = "_QFEfunc_ptr"} + %5 = fircg.ext_declare %4 {uniq_name = "_QFEfunc_ptr"} : (!fir.ref<(!fir.ref, !fir.ref) -> f32>) -> !fir.ref<(!fir.ref, !fir.ref) -> f32> loc(#loc3) + + return + } loc(#loc) +} +#loc = loc("test.f90":1:1) +#loc1 = loc("test.f90":2:30) +#loc2 = loc("test.f90":3:30) +#loc3 = loc("test.f90":4:30) + +// CHECK-DAG: #[[INT:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL32:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[REAL:.*]] = #llvm.di_basic_type + +// CHECK-DAG: #[[PTR_INT:.*]] = #llvm.di_derived_type +// CHECK-DAG: #[[PTR_REAL:.*]] = #llvm.di_derived_type + +// CHECK-DAG: #[[SUB1:.*]] = #llvm.di_subroutine_type +// CHECK-DAG: #[[PTR_SUB1:.*]] = #llvm.di_derived_type +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "fun_ptr"{{.*}}type = #[[PTR_SUB1]]{{.*}}> + +// CHECK-DAG: #di_subroutine_type{{.*}} = #llvm.di_subroutine_type +// CHECK-DAG: #di_local_variable{{.*}} = #llvm.di_local_variable<{{.*}}name = "sub_ptr"{{.*}}type = #di_derived_type{{.*}}> +// CHECK-DAG: #di_derived_type{{.*}} = #llvm.di_derived_type + +// CHECK-DAG: #[[SUB3:.*]] = #llvm.di_subroutine_type +// CHECK-DAG: #[[PTR_SUB3:.*]] = #llvm.di_derived_type +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "func_ptr"{{.*}}type = #[[PTR_SUB3]]{{.*}}> From d1387ed2729cedefacebeec44edf943fe8dffe86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Thu, 6 Nov 2025 09:19:37 -0800 Subject: [PATCH 13/71] CodeGen: More accurate mayAlias for instructions with multiple MMOs (#166211) There can only be meaningful aliasing between the memory accesses of different instructions if at least one of the accesses modifies memory. This check is applied at the instruction-level earlier in the method. This change merely extends the check on a per-MMO basis. This affects a SystemZ test because PFD instructions are both mayLoad and mayStore but may carry a load-only MMO which is now no longer treated as aliasing loads. The PFD instructions are from llvm.prefetch generated by loop-data-prefetch. --- llvm/lib/CodeGen/MachineInstr.cpp | 8 ++++++-- llvm/test/CodeGen/SystemZ/vec-load-element.ll | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 8ad9245a47684..37e5c517d24d8 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1547,10 +1547,14 @@ bool MachineInstr::mayAlias(BatchAAResults *AA, const MachineInstr &Other, // Check each pair of memory operands from both instructions, which can't // alias only if all pairs won't alias. - for (auto *MMOa : memoperands()) - for (auto *MMOb : Other.memoperands()) + for (auto *MMOa : memoperands()) { + for (auto *MMOb : Other.memoperands()) { + if (!MMOa->isStore() && !MMOb->isStore()) + continue; if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb)) return true; + } + } return false; } diff --git a/llvm/test/CodeGen/SystemZ/vec-load-element.ll b/llvm/test/CodeGen/SystemZ/vec-load-element.ll index 2baaed19546df..9bef279d7c0fa 100644 --- a/llvm/test/CodeGen/SystemZ/vec-load-element.ll +++ b/llvm/test/CodeGen/SystemZ/vec-load-element.ll @@ -5,8 +5,8 @@ ; CHECK-LABEL: .LBB0_1: ; CHECK-NOT: l %r ; CHECK-NOT: vlvgf -; CHECK: pfd -; CHECK: vlef +; CHECK-DAG: pfd +; CHECK-DAG: vlef %type0 = type { i32, [400 x i8], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } @Mem = external global [150 x %type0], align 4 From 5af27f8c208b4ba13f339801c9188cfc19cebdc0 Mon Sep 17 00:00:00 2001 From: Stephen Senran Zhang Date: Fri, 7 Nov 2025 01:22:06 +0800 Subject: [PATCH 14/71] [InstrProf] Fix frontend generated function hash (#165358) --- clang/lib/CodeGen/CodeGenPGO.cpp | 9 +++++++-- .../Profile/Inputs/c-counter-overflows.proftext | 2 +- clang/test/Profile/Inputs/c-general.profdata.v12 | Bin 0 -> 2616 bytes clang/test/Profile/Inputs/c-general.proftext | 12 ++++++------ .../Profile/Inputs/c-unprofiled-blocks.proftext | 4 ++-- clang/test/Profile/Inputs/cxx-rangefor.proftext | 2 +- clang/test/Profile/Inputs/cxx-throws.proftext | 2 +- .../Inputs/misexpect-switch-default.proftext | 2 +- .../Inputs/misexpect-switch-nonconst.proftext | 2 +- clang/test/Profile/c-collision.c | 4 ++-- clang/test/Profile/c-general.c | 1 + compiler-rt/include/profile/InstrProfData.inc | 2 +- llvm/include/llvm/ProfileData/InstrProf.h | 10 +++++++--- llvm/include/llvm/ProfileData/InstrProfData.inc | 2 +- llvm/lib/ProfileData/InstrProf.cpp | 5 +++-- llvm/lib/ProfileData/InstrProfWriter.cpp | 2 +- .../Instrumentation/PGOInstrumentation.cpp | 2 +- .../tools/llvm-profdata/profile-version.test | 2 +- 18 files changed, 38 insertions(+), 27 deletions(-) create mode 100644 clang/test/Profile/Inputs/c-general.profdata.v12 diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp index 8f095649f87ce..06d7380b4e37c 100644 --- a/clang/lib/CodeGen/CodeGenPGO.cpp +++ b/clang/lib/CodeGen/CodeGenPGO.cpp @@ -58,9 +58,10 @@ enum PGOHashVersion : unsigned { PGO_HASH_V1, PGO_HASH_V2, PGO_HASH_V3, + PGO_HASH_V4, // Keep this set to the latest hash version. - PGO_HASH_LATEST = PGO_HASH_V3 + PGO_HASH_LATEST = PGO_HASH_V4 }; namespace { @@ -152,7 +153,9 @@ static PGOHashVersion getPGOHashVersion(llvm::IndexedInstrProfReader *PGOReader, return PGO_HASH_V1; if (PGOReader->getVersion() <= 5) return PGO_HASH_V2; - return PGO_HASH_V3; + if (PGOReader->getVersion() <= 12) + return PGO_HASH_V3; + return PGO_HASH_V4; } /// A RecursiveASTVisitor that fills a map of statements to PGO counters. @@ -1099,6 +1102,8 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) { assert(Walker.NextCounter > 0 && "no entry counter mapped for decl"); NumRegionCounters = Walker.NextCounter; FunctionHash = Walker.Hash.finalize(); + if (HashVersion >= PGO_HASH_V4) + FunctionHash &= llvm::NamedInstrProfRecord::FUNC_HASH_MASK; } bool CodeGenPGO::skipRegionMappingForDecl(const Decl *D) { diff --git a/clang/test/Profile/Inputs/c-counter-overflows.proftext b/clang/test/Profile/Inputs/c-counter-overflows.proftext index 4d0287c787051..8633060507014 100644 --- a/clang/test/Profile/Inputs/c-counter-overflows.proftext +++ b/clang/test/Profile/Inputs/c-counter-overflows.proftext @@ -1,5 +1,5 @@ main -7779561829442898616 +862032801801816760 8 1 68719476720 diff --git a/clang/test/Profile/Inputs/c-general.profdata.v12 b/clang/test/Profile/Inputs/c-general.profdata.v12 new file mode 100644 index 0000000000000000000000000000000000000000..57a72faaecc85f567936cec900704e0fb531946b GIT binary patch literal 2616 zcmb_eTSydP6#jQx(@ITI%v3}LQy(m`lnAezRANa4iHSC@v#UEXJG1SKq(qTzXa?OZ zql?f=1qRh)2oVJpQN1XUJ=8-{VV4&rdZ-@E_CMb){;SwS`|{2C{&V}!Idf)bRIg8O zS9)UE{J+#?bNT$`bLAqEmlB;o2(x;UErd=1dtx||kjD|{@E7RimLgvjws zg1pS#G30S1je8XNtl{XOrk(UrhlhFGvY7Z(!qz+d!XnQ~xMdFMr4a`1#RZ=rXA?hl zI6nB4NOCS=QToc@la*w|X{_Kp>bQ;0-&W7hm)hs&D;MA`EbG%F<^FVYcQSe2NGR)? zQ!y1?bEuN;b@?2o?i-unhr9=jAuBS8kg3VDy#IF8jp@y&+^F;M$SB6HmnDrUWr;Ps za$)c2HEIGxO@Wv}^cr@Mf#AjL!`a$upW5=D7|IID(oN`c_|$I6)uot5d2?ZWUD8h) zmvFKu#d>-`kkyOGumgsZ*)sqX$Hjf&2wy42Vo21EYjIpa;Y~tn9~Nxvg$zOOiMgZMv@NUP;w;uOW>WH>{h? zyd@3=h5&Vj48)6v+k^jCeKFhJ=er7`uIBE=?Z!x9U#G`wqz~1$Y>?lNr4WgrKsXcS zg?Q+Rt$++Wv<5QlL==`cgN!W+d$h*FUibAU|Ne3%8m*}!6+`iORTpo~cxla0g2xsb z2t;*~F0c;n3BytLTt6|=fB9M?w&5Al_&WeDhZfp9#@P>Lr@yN<#+PS!b`c_n43UDJ zWFP|I9Qxq1Ngs%5flS8?sax5vS0^V+or7;M_4%aYaVQ!-8i)oIy)?auwQn7+H&@X? z5usez;nHR|uDVv$}=d0_5iL`5>th|dsTK{))+cyp0Bel(Bb YX5x<&$;U{p#P%2R`zY|+Q4m4z4;UZ1fdBvi literal 0 HcmV?d00001 diff --git a/clang/test/Profile/Inputs/c-general.proftext b/clang/test/Profile/Inputs/c-general.proftext index 08280ef39a89d..72e1be6e8846f 100644 --- a/clang/test/Profile/Inputs/c-general.proftext +++ b/clang/test/Profile/Inputs/c-general.proftext @@ -7,7 +7,7 @@ simple_loops 75 conditionals -4904767535850050386 +293081517422662482 13 1 100 @@ -24,7 +24,7 @@ conditionals 1 early_exits -2880354649761471549 +574511640547777597 9 1 0 @@ -37,7 +37,7 @@ early_exits 0 jumps -15051420506203462683 +63440946314451995 22 1 1 @@ -86,7 +86,7 @@ switches 0 big_switch -13144136522122330070 +461999971447013334 17 1 32 @@ -125,7 +125,7 @@ boolean_operators 33 boolop_loops -12402604614320574815 +873389568252105055 13 1 50 @@ -149,7 +149,7 @@ conditional_operator 1 do_fallthrough -8714614136504380050 +644163604256451218 4 1 10 diff --git a/clang/test/Profile/Inputs/c-unprofiled-blocks.proftext b/clang/test/Profile/Inputs/c-unprofiled-blocks.proftext index d880663fed32d..7af509715f8f7 100644 --- a/clang/test/Profile/Inputs/c-unprofiled-blocks.proftext +++ b/clang/test/Profile/Inputs/c-unprofiled-blocks.proftext @@ -1,5 +1,5 @@ never_called -6820425066224770721 +1055817543190535841 9 0 0 @@ -17,7 +17,7 @@ main 1 dead_code -5254464978620792806 +642778960193404902 10 1 0 diff --git a/clang/test/Profile/Inputs/cxx-rangefor.proftext b/clang/test/Profile/Inputs/cxx-rangefor.proftext index d41205bbde147..cfc88da8f9726 100644 --- a/clang/test/Profile/Inputs/cxx-rangefor.proftext +++ b/clang/test/Profile/Inputs/cxx-rangefor.proftext @@ -1,5 +1,5 @@ _Z9range_forv -8789831523895825398 +719380991647896566 5 1 4 diff --git a/clang/test/Profile/Inputs/cxx-throws.proftext b/clang/test/Profile/Inputs/cxx-throws.proftext index 043dea08c728f..92b0eab396844 100644 --- a/clang/test/Profile/Inputs/cxx-throws.proftext +++ b/clang/test/Profile/Inputs/cxx-throws.proftext @@ -1,5 +1,5 @@ _Z6throwsv -18172607911962830854 +878785342860126214 9 1 100 diff --git a/clang/test/Profile/Inputs/misexpect-switch-default.proftext b/clang/test/Profile/Inputs/misexpect-switch-default.proftext index 533da91765234..112426e0c7b57 100644 --- a/clang/test/Profile/Inputs/misexpect-switch-default.proftext +++ b/clang/test/Profile/Inputs/misexpect-switch-default.proftext @@ -1,6 +1,6 @@ main # Func Hash: -8734802134600123338 +664351602352194506 # Num Counters: 9 # Counter Values: diff --git a/clang/test/Profile/Inputs/misexpect-switch-nonconst.proftext b/clang/test/Profile/Inputs/misexpect-switch-nonconst.proftext index 0da9379357ae7..99d067c57f16f 100644 --- a/clang/test/Profile/Inputs/misexpect-switch-nonconst.proftext +++ b/clang/test/Profile/Inputs/misexpect-switch-nonconst.proftext @@ -1,6 +1,6 @@ main # Func Hash: -3721743393642630379 +262978879822089451 # Num Counters: 10 # Counter Values: diff --git a/clang/test/Profile/c-collision.c b/clang/test/Profile/c-collision.c index 6c779c6facaa2..f35ba1bfb7627 100644 --- a/clang/test/Profile/c-collision.c +++ b/clang/test/Profile/c-collision.c @@ -2,8 +2,8 @@ // RUN: %clang_cc1 -UEXTRA -triple x86_64-unknown-linux-gnu -main-file-name c-collision.c %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s --check-prefix=CHECK-NOEXTRA // RUN: %clang_cc1 -DEXTRA -triple x86_64-unknown-linux-gnu -main-file-name c-collision.c %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s --check-prefix=CHECK-EXTRA -// CHECK-NOEXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 7156072912471487002, -// CHECK-EXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 -4383447408116050035, +// CHECK-NOEXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 238543884830405146, +// CHECK-EXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 228238610311337869, extern int bar; void foo(void) { diff --git a/clang/test/Profile/c-general.c b/clang/test/Profile/c-general.c index ee36a43dac081..6c865e608a037 100644 --- a/clang/test/Profile/c-general.c +++ b/clang/test/Profile/c-general.c @@ -4,6 +4,7 @@ // RUN: llvm-profdata merge %S/Inputs/c-general.proftext -o %t.profdata // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use=clang -fprofile-instrument-use-path=%t.profdata | FileCheck -allow-deprecated-dag-overlap -check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use=clang -fprofile-instrument-use-path=%S/Inputs/c-general.profdata.v12 | FileCheck -allow-deprecated-dag-overlap -check-prefix=PGOUSE %s // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use=clang -fprofile-instrument-use-path=%S/Inputs/c-general.profdata.v5 | FileCheck -allow-deprecated-dag-overlap -check-prefix=PGOUSE %s // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use=clang -fprofile-instrument-use-path=%S/Inputs/c-general.profdata.v3 | FileCheck -allow-deprecated-dag-overlap -check-prefix=PGOUSE %s // Also check compatibility with older profiles. diff --git a/compiler-rt/include/profile/InstrProfData.inc b/compiler-rt/include/profile/InstrProfData.inc index 0496f240dc823..46d6bb5bd8896 100644 --- a/compiler-rt/include/profile/InstrProfData.inc +++ b/compiler-rt/include/profile/InstrProfData.inc @@ -722,7 +722,7 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, /* Raw profile format version (start from 1). */ #define INSTR_PROF_RAW_VERSION 10 /* Indexed profile format version (start from 1). */ -#define INSTR_PROF_INDEX_VERSION 12 +#define INSTR_PROF_INDEX_VERSION 13 /* Coverage mapping format version (start from 0). */ #define INSTR_PROF_COVMAP_VERSION 6 diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index 85a9efe73855b..7886478158c3c 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -1058,8 +1058,10 @@ struct NamedInstrProfRecord : InstrProfRecord { StringRef Name; uint64_t Hash; - // We reserve this bit as the flag for context sensitive profile record. - static const int CS_FLAG_IN_FUNC_HASH = 60; + // We reserve the highest 4 bits as flags. + static constexpr uint64_t FUNC_HASH_MASK = 0x0FFF'FFFF'FFFF'FFFF; + // The 60th bit is for context sensitive profile record. + static constexpr unsigned CS_FLAG_IN_FUNC_HASH = 60; NamedInstrProfRecord() = default; NamedInstrProfRecord(StringRef Name, uint64_t Hash, @@ -1174,7 +1176,9 @@ enum ProfVersion { Version11 = 11, // VTable profiling, decision record and bitmap are modified for mcdc. Version12 = 12, - // The current version is 12. + // In this version, the frontend PGO stable hash algorithm defaults to V4. + Version13 = 13, + // The current version is 13. CurrentVersion = INSTR_PROF_INDEX_VERSION }; const uint64_t Version = ProfVersion::CurrentVersion; diff --git a/llvm/include/llvm/ProfileData/InstrProfData.inc b/llvm/include/llvm/ProfileData/InstrProfData.inc index 0496f240dc823..46d6bb5bd8896 100644 --- a/llvm/include/llvm/ProfileData/InstrProfData.inc +++ b/llvm/include/llvm/ProfileData/InstrProfData.inc @@ -722,7 +722,7 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, /* Raw profile format version (start from 1). */ #define INSTR_PROF_RAW_VERSION 10 /* Indexed profile format version (start from 1). */ -#define INSTR_PROF_INDEX_VERSION 12 +#define INSTR_PROF_INDEX_VERSION 13 /* Coverage mapping format version (start from 0). */ #define INSTR_PROF_COVMAP_VERSION 6 diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 02087355ab318..54987872f2d8b 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -1690,7 +1690,7 @@ Expected
Header::readFromBuffer(const unsigned char *Buffer) { IndexedInstrProf::ProfVersion::CurrentVersion) return make_error(instrprof_error::unsupported_version); - static_assert(IndexedInstrProf::ProfVersion::CurrentVersion == Version12, + static_assert(IndexedInstrProf::ProfVersion::CurrentVersion == Version13, "Please update the reader as needed when a new field is added " "or when indexed profile version gets bumped."); @@ -1723,10 +1723,11 @@ size_t Header::size() const { // of the header, and byte offset of existing fields shouldn't change when // indexed profile version gets incremented. static_assert( - IndexedInstrProf::ProfVersion::CurrentVersion == Version12, + IndexedInstrProf::ProfVersion::CurrentVersion == Version13, "Please update the size computation below if a new field has " "been added to the header; for a version bump without new " "fields, add a case statement to fall through to the latest version."); + case 13ull: case 12ull: return 72; case 11ull: diff --git a/llvm/lib/ProfileData/InstrProfWriter.cpp b/llvm/lib/ProfileData/InstrProfWriter.cpp index a3473514d4637..0f15ca8ff6df7 100644 --- a/llvm/lib/ProfileData/InstrProfWriter.cpp +++ b/llvm/lib/ProfileData/InstrProfWriter.cpp @@ -542,7 +542,7 @@ Error InstrProfWriter::writeImpl(ProfOStream &OS) { // The WritePrevVersion handling will either need to be removed or updated // if the version is advanced beyond 12. static_assert(IndexedInstrProf::ProfVersion::CurrentVersion == - IndexedInstrProf::ProfVersion::Version12); + IndexedInstrProf::ProfVersion::Version13); if (static_cast(ProfileKind & InstrProfKind::IRInstrumentation)) Header.Version |= VARIANT_MASK_IR_PROF; if (static_cast(ProfileKind & InstrProfKind::ContextSensitive)) diff --git a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp index af53fa0bae468..02f06bebb8f0d 100644 --- a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -734,7 +734,7 @@ void FuncPGOInstrumentation::computeCFGHash() { FunctionHash = (((uint64_t)JCH.getCRC()) << 28) + JC.getCRC(); // Reserve bit 60-63 for other information purpose. - FunctionHash &= 0x0FFFFFFFFFFFFFFF; + FunctionHash &= NamedInstrProfRecord::FUNC_HASH_MASK; if (IsCS) NamedInstrProfRecord::setCSFlagInHash(FunctionHash); LLVM_DEBUG(dbgs() << "Function Hash Computation for " << F.getName() << ":\n" diff --git a/llvm/test/tools/llvm-profdata/profile-version.test b/llvm/test/tools/llvm-profdata/profile-version.test index cb68a648d5e5a..e811699ac63ed 100644 --- a/llvm/test/tools/llvm-profdata/profile-version.test +++ b/llvm/test/tools/llvm-profdata/profile-version.test @@ -2,7 +2,7 @@ Test the profile version. RUN: llvm-profdata merge -o %t.profdata %p/Inputs/basic.proftext RUN: llvm-profdata show --profile-version %t.profdata | FileCheck %s -CHECK: Profile version: 12 +CHECK: Profile version: 13 RUN: llvm-profdata merge -o %t.prev.profdata %p/Inputs/basic.proftext --write-prev-version RUN: llvm-profdata show --profile-version %t.prev.profdata | FileCheck %s --check-prefix=PREV From 3be825053233740dc3960cae2f74c00211363487 Mon Sep 17 00:00:00 2001 From: Anutosh Bhat Date: Thu, 6 Nov 2025 23:07:24 +0530 Subject: [PATCH 15/71] [clang-repl] Fixing vulnerabilities with respect to orc runtime (#165852) Fixed `getORCRuntimePath` function to respect `getCompilerRTPath` and `getRuntimePath` --- clang/lib/Interpreter/Interpreter.cpp | 49 +++++++++++++++++---------- clang/tools/clang-repl/ClangRepl.cpp | 1 + 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index cde354c9cd8d1..76338065d2231 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -394,36 +394,48 @@ Interpreter::outOfProcessJITBuilder(JITConfig Config) { llvm::Expected Interpreter::getOrcRuntimePath(const driver::ToolChain &TC) { - std::optional CompilerRTPath = TC.getCompilerRTPath(); - std::optional ResourceDir = TC.getRuntimePath(); + const std::array OrcRTLibNames = { + "liborc_rt.a", "liborc_rt_osx.a", "liborc_rt-x86_64.a"}; + + auto findInDir = [&](llvm::StringRef Base) -> std::optional { + for (const char *LibName : OrcRTLibNames) { + llvm::SmallString<256> CandidatePath(Base); + llvm::sys::path::append(CandidatePath, LibName); + if (llvm::sys::fs::exists(CandidatePath)) + return std::string(CandidatePath.str()); + } + return std::nullopt; + }; + + std::string SearchedPaths; - if (!CompilerRTPath) { + if (std::optional CompilerRTPath = TC.getCompilerRTPath()) { + if (auto Found = findInDir(*CompilerRTPath)) + return *Found; + SearchedPaths += *CompilerRTPath; + } else { return llvm::make_error("CompilerRT path not found", std::error_code()); } - const std::array OrcRTLibNames = { - "liborc_rt.a", "liborc_rt_osx.a", "liborc_rt-x86_64.a"}; - - for (const char *LibName : OrcRTLibNames) { - llvm::SmallString<256> CandidatePath((*CompilerRTPath).c_str()); - llvm::sys::path::append(CandidatePath, LibName); - - if (llvm::sys::fs::exists(CandidatePath)) { - return CandidatePath.str().str(); - } + if (std::optional ResourceDir = TC.getRuntimePath()) { + if (auto Found = findInDir(*ResourceDir)) + return *Found; + if (!SearchedPaths.empty()) + SearchedPaths += "; "; + SearchedPaths += *ResourceDir; + } else { + return llvm::make_error("ResourceDir path not found", + std::error_code()); } return llvm::make_error( - llvm::Twine("OrcRuntime library not found in: ") + (*CompilerRTPath), + llvm::Twine("OrcRuntime library not found in: ") + SearchedPaths, std::error_code()); } llvm::Expected> Interpreter::create(std::unique_ptr CI, JITConfig Config) { - llvm::Error Err = llvm::Error::success(); - - std::unique_ptr JB; if (Config.IsOutOfProcess) { const TargetInfo &TI = CI->getTarget(); @@ -453,6 +465,9 @@ Interpreter::create(std::unique_ptr CI, JITConfig Config) { } } + llvm::Error Err = llvm::Error::success(); + std::unique_ptr JB; + auto Interp = std::unique_ptr(new Interpreter( std::move(CI), Err, std::move(JB), /*Consumer=*/nullptr, Config)); if (auto E = std::move(Err)) diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp index c7879422cd7df..c86a1314ac026 100644 --- a/clang/tools/clang-repl/ClangRepl.cpp +++ b/clang/tools/clang-repl/ClangRepl.cpp @@ -309,6 +309,7 @@ int main(int argc, const char **argv) { clang::Interpreter::JITConfig Config; Config.IsOutOfProcess = !OOPExecutor.empty() || !OOPExecutorConnect.empty(); Config.OOPExecutor = OOPExecutor; + Config.OrcRuntimePath = OrcRuntimePath; auto SizeOrErr = getSlabAllocSize(SlabAllocateSizeString); if (!SizeOrErr) { llvm::logAllUnhandledErrors(SizeOrErr.takeError(), llvm::errs(), "error: "); From 6fce53af846cd88def615230ac5eaa8455958ccb Mon Sep 17 00:00:00 2001 From: YongKang Zhu Date: Thu, 6 Nov 2025 09:38:25 -0800 Subject: [PATCH 16/71] [BOLT][AArch64] Skip as many zeros as possible in padding validation (#166467) We are skipping four zero's at a time when validating code padding in case that the next zero would be part of an instruction or constant island, and for functions that have large amount of padding (like due to hugify), this could be very slow. We now change the validation to skip as many as possible but still need to be 4's exact multiple number of zero's. No valid instruction has encoding as 0x00000000 and even if we stumble into some constant island, the API `BinaryFunction::isInConstantIsland()` has been made to find the size between the asked address and the end of island (#164037), so this should be safe. --- bolt/lib/Core/BinaryContext.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp index 7af32c8c56635..b478925a4d7b7 100644 --- a/bolt/lib/Core/BinaryContext.cpp +++ b/bolt/lib/Core/BinaryContext.cpp @@ -1010,14 +1010,12 @@ bool BinaryContext::hasValidCodePadding(const BinaryFunction &BF) { return Offset - StartOffset; }; - // Skip a sequence of zero bytes. For AArch64 we only skip 4 bytes of zeros - // in case the following zeros belong to constant island or veneer. + // Skip a sequence of zero bytes. For AArch64 we only skip 4's exact + // multiple number of zeros in case the following zeros belong to veneer. auto skipZeros = [&]() { const uint64_t StartOffset = Offset; uint64_t CurrentOffset = Offset; - for (; CurrentOffset < BF.getMaxSize() && - (!isAArch64() || CurrentOffset < StartOffset + 4); - ++CurrentOffset) + for (; CurrentOffset < BF.getMaxSize(); ++CurrentOffset) if ((*FunctionData)[CurrentOffset] != 0) break; From 509ee6baa6f463b6c69099cc97a195614cf8382a Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Fri, 7 Nov 2025 01:52:53 +0800 Subject: [PATCH 17/71] [PatternMatch] Fix matching order for `m_c_Intrinsic` (#166047) `Op0` should always be checked before `Op1`. Otherwise it may not work as expected when `Op1` contains `m_Deferred`. --- llvm/include/llvm/IR/PatternMatch.h | 22 ++++++++++++++++++---- llvm/unittests/IR/PatternMatch.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index e3ec7e1764da7..bb3d7fff5c9bc 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -3069,12 +3069,26 @@ m_c_MaxOrMin(const LHS &L, const RHS &R) { m_CombineOr(m_c_UMax(L, R), m_c_UMin(L, R))); } +template +struct CommutativeBinaryIntrinsic_match { + LHS L; + RHS R; + + CommutativeBinaryIntrinsic_match(const LHS &L, const RHS &R) : L(L), R(R) {} + + template bool match(OpTy *V) const { + const auto *II = dyn_cast(V); + if (!II || II->getIntrinsicID() != IntrID) + return false; + return (L.match(II->getArgOperand(0)) && R.match(II->getArgOperand(1))) || + (L.match(II->getArgOperand(1)) && R.match(II->getArgOperand(0))); + } +}; + template -inline match_combine_or::Ty, - typename m_Intrinsic_Ty::Ty> +inline CommutativeBinaryIntrinsic_match m_c_Intrinsic(const T0 &Op0, const T1 &Op1) { - return m_CombineOr(m_Intrinsic(Op0, Op1), - m_Intrinsic(Op1, Op0)); + return CommutativeBinaryIntrinsic_match(Op0, Op1); } /// Matches FAdd with LHS and RHS in either order. diff --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp index 972dac82d3331..1142c559c97f8 100644 --- a/llvm/unittests/IR/PatternMatch.cpp +++ b/llvm/unittests/IR/PatternMatch.cpp @@ -2657,4 +2657,31 @@ TEST_F(PatternMatchTest, ShiftOrSelf) { EXPECT_EQ(ShAmtC, 0U); } +TEST_F(PatternMatchTest, CommutativeDeferredIntrinsicMatch) { + Value *X = ConstantFP::get(IRB.getDoubleTy(), 1.0); + Value *Y = ConstantFP::get(IRB.getDoubleTy(), 2.0); + + auto CheckMatch = [X, Y](Value *Pattern) { + Value *tX = nullptr, *tY = nullptr; + EXPECT_TRUE( + match(Pattern, m_c_Intrinsic( + m_Value(tX), m_c_Intrinsic( + m_Deferred(tX), m_Value(tY))))); + EXPECT_EQ(tX, X); + EXPECT_EQ(tY, Y); + }; + CheckMatch(IRB.CreateBinaryIntrinsic( + Intrinsic::minimum, X, + IRB.CreateBinaryIntrinsic(Intrinsic::minimum, X, Y))); + CheckMatch(IRB.CreateBinaryIntrinsic( + Intrinsic::minimum, X, + IRB.CreateBinaryIntrinsic(Intrinsic::minimum, Y, X))); + CheckMatch(IRB.CreateBinaryIntrinsic( + Intrinsic::minimum, IRB.CreateBinaryIntrinsic(Intrinsic::minimum, X, Y), + X)); + CheckMatch(IRB.CreateBinaryIntrinsic( + Intrinsic::minimum, IRB.CreateBinaryIntrinsic(Intrinsic::minimum, Y, X), + X)); +} + } // anonymous namespace. From 948d39bfd6830903b14239c85d8259c787217949 Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Thu, 6 Nov 2025 14:58:24 -0300 Subject: [PATCH 18/71] [RISCV] Update SpacemiT-X60 vector reduction operations latencies (#152737) This PR adds hardware-measured latencies for all instructions defined in Section 14 of the RVV specification: "Vector Reduction Operations" to the SpacemiT-X60 scheduling model. --------- Signed-off-by: Mikhail R. Gadelha --- .../lib/Target/RISCV/RISCVSchedSpacemitX60.td | 66 +- .../RISCV/SpacemitX60/rvv-reduction.s | 1118 ++++++++--------- 2 files changed, 617 insertions(+), 567 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td b/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td index 24ebbc3007cec..41071b29e5c9e 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td @@ -654,8 +654,17 @@ foreach mx = SchedMxList in { foreach sew = SchedSEWSet.val in { defvar IsWorstCase = SMX60IsWorstCaseMXSEW.c; - defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; - defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; + defvar VIRedLat = GetLMULValue<[5, 5, 5, 7, 11, 19, 35], mx>.c; + defvar VIRedOcc = GetLMULValue<[1, 1, 2, 2, 4, 10, 35], mx>.c; + let Latency = VIRedLat, ReleaseAtCycles = [VIRedOcc] in { + defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; + + // Pattern for vredsum: 5/5/5/7/11/19/35 + // Pattern for vredand, vredor, vredxor: 4/4/4/6/10/18/34 + // They are grouped together, so we use the worst-case vredsum latency. + // TODO: split vredand, vredor, vredxor into separate scheduling classe. + defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; + } } } @@ -663,7 +672,27 @@ foreach mx = SchedMxListWRed in { foreach sew = SchedSEWSet.val in { defvar IsWorstCase = SMX60IsWorstCaseMXSEW.c; - defm "" : LMULSEWWriteResMXSEW<"WriteVIWRedV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; + defvar VIRedLat = GetLMULValue<[5, 5, 5, 7, 11, 19, 35], mx>.c; + defvar VIRedOcc = GetLMULValue<[1, 1, 2, 2, 4, 10, 35], mx>.c; + let Latency = VIRedLat, ReleaseAtCycles = [VIRedOcc] in { + defm "" : LMULSEWWriteResMXSEW<"WriteVIWRedV_From", [SMX60_VIEU], mx, sew, IsWorstCase>; + } + } +} + +foreach mx = SchedMxListF in { + foreach sew = SchedSEWSet.val in { + defvar IsWorstCase = SMX60IsWorstCaseMXSEW.c; + + // Latency for vfredmax.vs, vfredmin.vs: 12/12/15/21/33/57 + // Latency for vfredusum.vs is slightly lower for e16/e32 + // We use the worst-case + defvar VFRedLat = GetLMULValue<[12, 12, 12, 15, 21, 33, 57], mx>.c; + defvar VFRedOcc = GetLMULValue<[8, 8, 8, 8, 14, 20, 57], mx>.c; + let Latency = VFRedLat, ReleaseAtCycles = [VFRedOcc] in { + defm "" : LMULSEWWriteResMXSEW<"WriteVFRedV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + defm "" : LMULSEWWriteResMXSEW<"WriteVFRedMinMaxV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + } } } @@ -671,9 +700,20 @@ foreach mx = SchedMxListF in { foreach sew = SchedSEWSet.val in { defvar IsWorstCase = SMX60IsWorstCaseMXSEW.c; - defm "" : LMULSEWWriteResMXSEW<"WriteVFRedV_From", [SMX60_VFP], mx, sew, IsWorstCase>; - defm "" : LMULSEWWriteResMXSEW<"WriteVFRedOV_From", [SMX60_VFP], mx, sew, IsWorstCase>; - defm "" : LMULSEWWriteResMXSEW<"WriteVFRedMinMaxV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + // Compute latency based on SEW + defvar VFRedOV_FromLat = !cond( + !eq(sew, 16) : ConstValueUntilLMULThenDouble<"MF4", 12, mx>.c, + !eq(sew, 32) : ConstValueUntilLMULThenDouble<"MF2", 12, mx>.c, + !eq(sew, 64) : ConstValueUntilLMULThenDouble<"M1", 12, mx>.c + ); + defvar VFRedOV_FromOcc = !cond( + !eq(sew, 16) : GetLMULValue<[8, 8, 20, 24, 48, 96, 384], mx>.c, + !eq(sew, 32) : GetLMULValue<[8, 8, 8, 12, 24, 48, 192], mx>.c, + !eq(sew, 64) : GetLMULValue<[6, 6, 6, 6, 12, 24, 96], mx>.c + ); + let Latency = VFRedOV_FromLat, ReleaseAtCycles = [VFRedOV_FromOcc] in { + defm "" : LMULSEWWriteResMXSEW<"WriteVFRedOV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + } } } @@ -681,8 +721,18 @@ foreach mx = SchedMxListFWRed in { foreach sew = SchedSEWSet.val in { defvar IsWorstCase = SMX60IsWorstCaseMXSEW.c; - defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedV_From", [SMX60_VFP], mx, sew, IsWorstCase>; - defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedOV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + defvar VFRedOVLat = !cond( + !eq(sew, 16) : ConstValueUntilLMULThenDouble<"MF4", 16, mx>.c, + !eq(sew, 32) : ConstValueUntilLMULThenDouble<"MF2", 16, mx>.c, + ); + defvar VFRedOVOcc = !cond( + !eq(sew, 16) : GetLMULValue<[11, 11, 27, 32, 64, 128, 512], mx>.c, + !eq(sew, 32) : GetLMULValue<[11, 11, 11, 16, 32, 64, 256], mx>.c, + ); + let Latency = VFRedOVLat, ReleaseAtCycles = [VFRedOVOcc] in { + defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + defm "" : LMULSEWWriteResMXSEW<"WriteVFWRedOV_From", [SMX60_VFP], mx, sew, IsWorstCase>; + } } } diff --git a/llvm/test/tools/llvm-mca/RISCV/SpacemitX60/rvv-reduction.s b/llvm/test/tools/llvm-mca/RISCV/SpacemitX60/rvv-reduction.s index 3d7a67d8ba161..621cad6e121ab 100644 --- a/llvm/test/tools/llvm-mca/RISCV/SpacemitX60/rvv-reduction.s +++ b/llvm/test/tools/llvm-mca/RISCV/SpacemitX60/rvv-reduction.s @@ -630,593 +630,593 @@ vfwredusum.vs v8, v8, v8 # CHECK: [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions: # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDAND_VS vredand.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDAND_VS vredand.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAXU_VS vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAXU_VS vredmaxu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMAX_VS vredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMAX_VS vredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMINU_VS vredminu.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMINU_VS vredminu.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDMIN_VS vredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDMIN_VS vredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDOR_VS vredor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDOR_VS vredor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDSUM_VS vredsum.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDSUM_VS vredsum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VREDXOR_VS vredxor.vs v8, v8, v8 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VREDXOR_VS vredxor.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUMU_VS vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUMU_VS vwredsumu.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, mf8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 1.00 5 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 5 2.00 5 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 7 2.00 7 SMX60_VIEU[2] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 11 4.00 11 SMX60_VIEU[4] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 19 10.00 19 SMX60_VIEU[10] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VIEU VWREDSUM_VS vwredsum.vs v8, v16, v24 +# CHECK-NEXT: 1 35 35.00 35 SMX60_VIEU[35] VWREDSUM_VS vwredsum.vs v8, v16, v24 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMAX_VS vfredmax.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMAX_VS vfredmax.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDMIN_VS vfredmin.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDMIN_VS vfredmin.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 24 20.00 24 SMX60_VFP[20] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 48 24.00 48 SMX60_VFP[24] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 96 48.00 96 SMX60_VFP[48] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 192 96.00 192 SMX60_VFP[96] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 384 384.00 384 SMX60_VFP[384] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 24 12.00 24 SMX60_VFP[12] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 48 24.00 48 SMX60_VFP[24] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 96 48.00 96 SMX60_VFP[48] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 192 192.00 192 SMX60_VFP[192] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 6.00 12 SMX60_VFP[6] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 24 12.00 24 SMX60_VFP[12] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 48 24.00 48 SMX60_VFP[24] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDOSUM_VS vfredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 96 96.00 96 SMX60_VFP[96] VFREDOSUM_VS vfredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 12 8.00 12 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 15 8.00 15 SMX60_VFP[8] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 21 14.00 21 SMX60_VFP[14] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 33 20.00 33 SMX60_VFP[20] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFREDUSUM_VS vfredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 57 57.00 57 SMX60_VFP[57] VFREDUSUM_VS vfredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 32 27.00 32 SMX60_VFP[27] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 16 11.00 16 SMX60_VFP[11] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 64 32.00 64 SMX60_VFP[32] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 128 64.00 128 SMX60_VFP[64] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 256 128.00 256 SMX60_VFP[128] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 512 512.00 512 SMX60_VFP[512] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 16 11.00 16 SMX60_VFP[11] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 32 16.00 32 SMX60_VFP[16] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 64 32.00 64 SMX60_VFP[32] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 128 64.00 128 SMX60_VFP[64] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: 1 256 256.00 256 SMX60_VFP[256] VFWREDOSUM_VS vfwredosum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 32 27.00 32 SMX60_VFP[27] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 16 11.00 16 SMX60_VFP[11] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 64 32.00 64 SMX60_VFP[32] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 128 64.00 128 SMX60_VFP[64] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 256 128.00 256 SMX60_VFP[128] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 512 512.00 512 SMX60_VFP[512] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 16 11.00 16 SMX60_VFP[11] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 32 16.00 32 SMX60_VFP[16] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 64 32.00 64 SMX60_VFP[32] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 128 64.00 128 SMX60_VFP[64] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK-NEXT: 1 1 1.00 U 1 SMX60_IEU,SMX60_IEUA VSETVLI vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: 1 1 1.00 1 SMX60_VFP VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: 1 256 256.00 256 SMX60_VFP[256] VFWREDUSUM_VS vfwredusum.vs v8, v8, v8 # CHECK: Resources: # CHECK-NEXT: [0] - SMX60_FP @@ -1230,595 +1230,595 @@ vfwredusum.vs v8, v8, v8 # CHECK: Resource pressure per iteration: # CHECK-NEXT: [0] [1] [2] [3.0] [3.1] [4] [5] [6] -# CHECK-NEXT: - 294.00 - - - 82.00 212.00 - +# CHECK-NEXT: - 294.00 - - - 4271.00 2028.00 - # CHECK: Resource pressure by instruction: # CHECK-NEXT: [0] [1] [2] [3.0] [3.1] [4] [5] [6] Instructions: # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredand.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredand.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmaxu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmaxu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredminu.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredminu.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredsum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredsum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 2.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 4.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 10.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vredxor.vs v8, v8, v8 +# CHECK-NEXT: - - - - - - 35.00 - vredxor.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsumu.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsumu.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, mf8, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e8, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu # CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 2.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 4.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 10.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - - 1.00 - vwredsum.vs v8, v16, v24 +# CHECK-NEXT: - - - - - - 35.00 - vwredsum.vs v8, v16, v24 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmax.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmax.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredmin.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredmin.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 24.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 48.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 96.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 384.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 12.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 24.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 48.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 192.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 6.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 12.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 24.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 96.00 - - vfredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 8.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 14.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 20.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e64, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 57.00 - - vfredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 27.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 11.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 32.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 64.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 128.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 512.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 11.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 16.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 32.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 64.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredosum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 256.00 - - vfwredosum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 27.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, mf4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 11.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 32.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 64.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 128.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e16, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 512.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, mf2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 11.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m1, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 16.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m2, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 32.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m4, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 64.00 - - vfwredusum.vs v8, v8, v8 # CHECK-NEXT: - 1.00 - - - - - - vsetvli t3, zero, e32, m8, tu, mu -# CHECK-NEXT: - - - - - 1.00 - - vfwredusum.vs v8, v8, v8 +# CHECK-NEXT: - - - - - 256.00 - - vfwredusum.vs v8, v8, v8 From f55b55c2a1109865bea742d1279c9bbe74509348 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 6 Nov 2025 10:02:16 -0800 Subject: [PATCH 19/71] [CMake][Fuchsia] Build libclang_rt.builtins for arm-fuchsia (#166686) No other runtimes can yet be built for the arm-fuchsia target, but this one can be. There is no OS-specific code in the arm builtins needed for Fuchsia. --- clang/cmake/caches/Fuchsia-stage2.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index 3d4d71a680d96..be3d0cfa2e657 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -200,16 +200,17 @@ endforeach() if(FUCHSIA_SDK) set(FUCHSIA_aarch64-unknown-fuchsia_NAME arm64) + set(FUCHSIA_arm-unknown-fuchsia_NAME arm) set(FUCHSIA_i386-unknown-fuchsia_NAME x64) set(FUCHSIA_x86_64-unknown-fuchsia_NAME x64) set(FUCHSIA_riscv64-unknown-fuchsia_NAME riscv64) - foreach(target i386-unknown-fuchsia;x86_64-unknown-fuchsia;aarch64-unknown-fuchsia;riscv64-unknown-fuchsia) + foreach(target i386-unknown-fuchsia;x86_64-unknown-fuchsia;aarch64-unknown-fuchsia;arm-unknown-fuchsia;riscv64-unknown-fuchsia) set(FUCHSIA_${target}_COMPILER_FLAGS "--target=${target} -I${FUCHSIA_SDK}/pkg/sync/include -I${FUCHSIA_SDK}/pkg/fdio/include") set(FUCHSIA_${target}_LINKER_FLAGS "-L${FUCHSIA_SDK}/arch/${FUCHSIA_${target}_NAME}/lib") set(FUCHSIA_${target}_SYSROOT "${FUCHSIA_SDK}/arch/${FUCHSIA_${target}_NAME}/sysroot") endforeach() - foreach(target i386-unknown-fuchsia;x86_64-unknown-fuchsia;aarch64-unknown-fuchsia;riscv64-unknown-fuchsia) + foreach(target i386-unknown-fuchsia;x86_64-unknown-fuchsia;aarch64-unknown-fuchsia;arm-unknown-fuchsia;riscv64-unknown-fuchsia) # Set the per-target builtins options. list(APPEND BUILTIN_TARGETS "${target}") set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") From 52e8f3c97bf8b3e7c428794d51949e74e7141a8a Mon Sep 17 00:00:00 2001 From: Alireza Torabian Date: Thu, 6 Nov 2025 13:05:57 -0500 Subject: [PATCH 20/71] [DA] Check for overflow in strong SIV test (#166223) Reland reverted PR [#164704](https://github.com/llvm/llvm-project/pull/164704). Overflow is checked in the strong SIV test in DA on calculation of the product of `UpperBound` and `AbsCoeff`, and also the subtraction of `DstConst` from `SrcConst`. This patch resolves the issues with the strong SIV test in both https://github.com/llvm/llvm-project/issues/159846 and https://github.com/llvm/llvm-project/pull/164246. --- llvm/lib/Analysis/DependenceAnalysis.cpp | 19 +++- .../SimpleSIVNoValidityCheck.ll | 2 +- .../Analysis/DependenceAnalysis/StrongSIV.ll | 86 ++++++++++++++++--- .../DependenceAnalysis/strong-siv-overflow.ll | 32 ++++--- 4 files changed, 108 insertions(+), 31 deletions(-) diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index 11d829492a10e..e45d1f79b3165 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -1587,6 +1587,15 @@ static const SCEV *minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B, return nullptr; } +/// Returns \p A * \p B if it guaranteed not to signed wrap. Otherwise returns +/// nullptr. \p A and \p B must have the same integer type. +static const SCEV *mulSCEVNoSignedOverflow(const SCEV *A, const SCEV *B, + ScalarEvolution &SE) { + if (SE.willNotOverflow(Instruction::Mul, /*Signed=*/true, A, B)) + return SE.getMulExpr(A, B); + return nullptr; +} + /// Returns the absolute value of \p A. In the context of dependence analysis, /// we need an absolute value in a mathematical sense. If \p A is the signed /// minimum value, we cannot represent it unless extending the original type. @@ -1686,7 +1695,11 @@ bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst, assert(0 < Level && Level <= CommonLevels && "level out of range"); Level--; - const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst); + const SCEV *Delta = minusSCEVNoSignedOverflow(SrcConst, DstConst, *SE); + if (!Delta) { + Result.Consistent = false; + return false; + } LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta); LLVM_DEBUG(dbgs() << ", " << *Delta->getType() << "\n"); @@ -1702,7 +1715,9 @@ bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst, const SCEV *AbsCoeff = absSCEVNoSignedOverflow(Coeff, *SE); if (!AbsDelta || !AbsCoeff) return false; - const SCEV *Product = SE->getMulExpr(UpperBound, AbsCoeff); + const SCEV *Product = mulSCEVNoSignedOverflow(UpperBound, AbsCoeff, *SE); + if (!Product) + return false; return isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product); }(); if (IsDeltaLarge) { diff --git a/llvm/test/Analysis/DependenceAnalysis/SimpleSIVNoValidityCheck.ll b/llvm/test/Analysis/DependenceAnalysis/SimpleSIVNoValidityCheck.ll index 4346507ba8f90..181a4494b036e 100644 --- a/llvm/test/Analysis/DependenceAnalysis/SimpleSIVNoValidityCheck.ll +++ b/llvm/test/Analysis/DependenceAnalysis/SimpleSIVNoValidityCheck.ll @@ -210,7 +210,7 @@ define void @t3(i64 %n, i64 %m, i64 %lb, ptr %a) { ; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx6, align 4 --> Dst: %2 = load i32, ptr %arrayidx6, align 4 ; CHECK-NEXT: da analyze - none! ; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx6, align 4 --> Dst: store i32 %2, ptr %arrayidx8, align 4 -; CHECK-NEXT: da analyze - consistent anti [1 -2]! +; CHECK-NEXT: da analyze - anti [1 *]! ; CHECK-NEXT: Src: store i32 %2, ptr %arrayidx8, align 4 --> Dst: store i32 %2, ptr %arrayidx8, align 4 ; CHECK-NEXT: da analyze - none! ; diff --git a/llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll b/llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll index 44bd9b7727910..71b93826ac260 100644 --- a/llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll +++ b/llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll @@ -1,6 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 ; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ -; RUN: | FileCheck %s +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-ALL +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa -da-enable-dependence-test=strong-siv 2>&1 \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-STRONG-SIV target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.6.0" @@ -423,19 +425,33 @@ for.end: ; preds = %for.body ;; *B++ = A[i + 2*n]; define void @strong9(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { -; CHECK-LABEL: 'strong9' -; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 -; CHECK-NEXT: da analyze - none! -; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 -; CHECK-NEXT: da analyze - none! -; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 -; CHECK-NEXT: da analyze - confused! -; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 -; CHECK-NEXT: da analyze - none! -; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 -; CHECK-NEXT: da analyze - confused! -; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 -; CHECK-NEXT: da analyze - none! +; CHECK-ALL-LABEL: 'strong9' +; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 +; CHECK-ALL-NEXT: da analyze - none! +; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 +; CHECK-ALL-NEXT: da analyze - none! +; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-ALL-NEXT: da analyze - confused! +; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 +; CHECK-ALL-NEXT: da analyze - none! +; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-ALL-NEXT: da analyze - confused! +; CHECK-ALL-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-ALL-NEXT: da analyze - none! +; +; CHECK-STRONG-SIV-LABEL: 'strong9' +; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - none! +; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - flow [*|<]! +; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - confused! +; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - none! +; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - confused! +; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - none! ; entry: %cmp1 = icmp eq i64 %n, 0 @@ -512,3 +528,45 @@ for.body: ; preds = %entry, %for.body for.end: ; preds = %for.body ret void } + + +;; for (long unsigned i = 0; i < 9223372036854775806; i++) +;; for (long unsigned j = 0; j < 2147483640; j++) +;; if (i < 3000000000) +;; A[i] = 0; +; +; FIXME: DependenceAnalysis fails to detect the dependency between A[i] and +; itself, and the issue is not caused by the Strong SIV. +define void @strong11(ptr %A) nounwind uwtable ssp { +; CHECK-ALL-LABEL: 'strong11' +; CHECK-ALL-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 4 +; CHECK-ALL-NEXT: da analyze - none! +; +; CHECK-STRONG-SIV-LABEL: 'strong11' +; CHECK-STRONG-SIV-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 4 +; CHECK-STRONG-SIV-NEXT: da analyze - consistent output [0 S]! +; +entry: + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %entry, %for.cond.cleanup3 + %i.017 = phi i64 [ 0, %entry ], [ %inc8, %for.cond.cleanup3 ] + %cmp5 = icmp samesign ult i64 %i.017, 3000000000 + %arrayidx = getelementptr inbounds nuw i32, ptr %A, i64 %i.017 + br i1 %cmp5, label %for.body4.us, label %for.cond.cleanup3 + +for.body4.us: ; preds = %for.cond1.preheader, %for.body4.us + %j.016.us = phi i64 [ %inc.us, %for.body4.us ], [ 0, %for.cond1.preheader ] + store i32 0, ptr %arrayidx, align 4 + %inc.us = add nuw nsw i64 %j.016.us, 1 + %exitcond.not = icmp eq i64 %inc.us, 2147483640 + br i1 %exitcond.not, label %for.cond.cleanup3, label %for.body4.us + +for.cond.cleanup: ; preds = %for.cond.cleanup3 + ret void + +for.cond.cleanup3: ; preds = %for.body4.us, %for.cond1.preheader + %inc8 = add nuw nsw i64 %i.017, 1 + %exitcond19.not = icmp eq i64 %inc8, 9223372036854775806 + br i1 %exitcond19.not, label %for.cond.cleanup, label %for.cond1.preheader +} diff --git a/llvm/test/Analysis/DependenceAnalysis/strong-siv-overflow.ll b/llvm/test/Analysis/DependenceAnalysis/strong-siv-overflow.ll index bf0fafcbfd6c9..6fd71ac8fe414 100644 --- a/llvm/test/Analysis/DependenceAnalysis/strong-siv-overflow.ll +++ b/llvm/test/Analysis/DependenceAnalysis/strong-siv-overflow.ll @@ -12,19 +12,24 @@ ; A[2*i - 4] = 2; ; } ; -; FIXME: DependenceAnalysis currently detects no dependency between the two -; stores, but it does exist. For example, each store will access A[0] when i -; is 1 and 2 respectively. -; The root cause is that the product of the BTC and the coefficient -; ((1LL << 62) - 1 and 2) overflows in a signed sense. +; FIXME: DependenceAnalysis fails to detect the dependency between the two +; stores, and the issue is not caused by the Strong SIV. define void @strongsiv_const_ovfl(ptr %A) { -; CHECK-LABEL: 'strongsiv_const_ovfl' -; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 -; CHECK-NEXT: da analyze - none! -; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 -; CHECK-NEXT: da analyze - none! -; CHECK-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 -; CHECK-NEXT: da analyze - none! +; CHECK-ALL-LABEL: 'strongsiv_const_ovfl' +; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 +; CHECK-ALL-NEXT: da analyze - none! +; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 +; CHECK-ALL-NEXT: da analyze - none! +; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 +; CHECK-ALL-NEXT: da analyze - none! +; +; CHECK-STRONG-SIV-LABEL: 'strongsiv_const_ovfl' +; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 +; CHECK-STRONG-SIV-NEXT: da analyze - none! +; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 +; CHECK-STRONG-SIV-NEXT: da analyze - consistent output [1]! +; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 +; CHECK-STRONG-SIV-NEXT: da analyze - none! ; entry: br label %loop.header @@ -64,5 +69,4 @@ exit: ret void } ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; CHECK-ALL: {{.*}} -; CHECK-STRONG-SIV: {{.*}} +; CHECK: {{.*}} From f20619c610f58e04633b1b053f323fe46a30c8d1 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 6 Nov 2025 10:16:47 -0800 Subject: [PATCH 21/71] [RISCV] More explicitly check that combineOp_VLToVWOp_VL removes the extends it is supposed to. (#166710) If we visit multiple root nodes, make sure the strategy chosen for other nodes includes the nodes we've already committed to remove. This can occur if have add/sub nodes where one operand is a zext and the other is a sext. We might see that the nodes share a common extension but pick a strategy that doesn't share it. --- llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 45 ++++++++++++------- .../RISCV/rvv/vscale-vw-web-simplification.ll | 7 ++- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 995ae75da1c30..3b69edacb8982 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -17867,6 +17867,7 @@ static SDValue combineOp_VLToVWOp_VL(SDNode *N, SmallVector Worklist; SmallPtrSet Inserted; + SmallPtrSet ExtensionsToRemove; Worklist.push_back(N); Inserted.insert(N); SmallVector CombinesToApply; @@ -17876,22 +17877,25 @@ static SDValue combineOp_VLToVWOp_VL(SDNode *N, NodeExtensionHelper LHS(Root, 0, DAG, Subtarget); NodeExtensionHelper RHS(Root, 1, DAG, Subtarget); - auto AppendUsersIfNeeded = [&Worklist, &Subtarget, - &Inserted](const NodeExtensionHelper &Op) { - if (Op.needToPromoteOtherUsers()) { - for (SDUse &Use : Op.OrigOperand->uses()) { - SDNode *TheUser = Use.getUser(); - if (!NodeExtensionHelper::isSupportedRoot(TheUser, Subtarget)) - return false; - // We only support the first 2 operands of FMA. - if (Use.getOperandNo() >= 2) - return false; - if (Inserted.insert(TheUser).second) - Worklist.push_back(TheUser); - } - } - return true; - }; + auto AppendUsersIfNeeded = + [&Worklist, &Subtarget, &Inserted, + &ExtensionsToRemove](const NodeExtensionHelper &Op) { + if (Op.needToPromoteOtherUsers()) { + // Remember that we're supposed to remove this extension. + ExtensionsToRemove.insert(Op.OrigOperand.getNode()); + for (SDUse &Use : Op.OrigOperand->uses()) { + SDNode *TheUser = Use.getUser(); + if (!NodeExtensionHelper::isSupportedRoot(TheUser, Subtarget)) + return false; + // We only support the first 2 operands of FMA. + if (Use.getOperandNo() >= 2) + return false; + if (Inserted.insert(TheUser).second) + Worklist.push_back(TheUser); + } + } + return true; + }; // Control the compile time by limiting the number of node we look at in // total. @@ -17912,6 +17916,15 @@ static SDValue combineOp_VLToVWOp_VL(SDNode *N, std::optional Res = FoldingStrategy(Root, LHS, RHS, DAG, Subtarget); if (Res) { + // If this strategy wouldn't remove an extension we're supposed to + // remove, reject it. + if (!Res->LHSExt.has_value() && + ExtensionsToRemove.contains(LHS.OrigOperand.getNode())) + continue; + if (!Res->RHSExt.has_value() && + ExtensionsToRemove.contains(RHS.OrigOperand.getNode())) + continue; + Matched = true; CombinesToApply.push_back(*Res); // All the inputs that are extended need to be folded, otherwise diff --git a/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll b/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll index b1f0eee3e9f52..034186210513c 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll @@ -595,12 +595,11 @@ define @mismatched_extend_sub_add_commuted( ; FOLDING: # %bb.0: ; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; FOLDING-NEXT: vzext.vf2 v10, v8 -; FOLDING-NEXT: vsext.vf2 v12, v9 ; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma -; FOLDING-NEXT: vwsub.wv v10, v10, v9 -; FOLDING-NEXT: vwaddu.wv v12, v12, v8 +; FOLDING-NEXT: vwsub.wv v12, v10, v9 +; FOLDING-NEXT: vwadd.wv v10, v10, v9 ; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; FOLDING-NEXT: vmul.vv v8, v10, v12 +; FOLDING-NEXT: vmul.vv v8, v12, v10 ; FOLDING-NEXT: ret %a = zext %x to %b = sext %y to From 3c31cde979985cc2ad62e75d7d3b1889f4008421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Thu, 6 Nov 2025 10:27:55 -0800 Subject: [PATCH 22/71] CodeGen: Handle bundled instructions in two-address-instructions pass (#166212) If the instruction with tied operands is a BUNDLE instruction and we handle it by replacing an operand, then we need to update the corresponding internal operands as well. Otherwise, the resulting MIR is invalid. The test case is degenerate in the sense that the bundle only contains a single instruction, but it is sufficient to exercise this issue. --- .../lib/CodeGen/TwoAddressInstructionPass.cpp | 11 ++++ llvm/test/CodeGen/AMDGPU/twoaddr-bundle.mir | 57 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 llvm/test/CodeGen/AMDGPU/twoaddr-bundle.mir diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 414e414738b71..b99e1c7f19b71 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -1665,6 +1665,17 @@ void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *MI, // by SubRegB is compatible with RegA with no subregister. So regardless of // whether the dest oper writes a subreg, the source oper should not. MO.setSubReg(0); + + // Update uses of RegB to uses of RegA inside the bundle. + if (MI->isBundle()) { + for (MachineOperand &MO : mi_bundle_ops(*MI)) { + if (MO.isReg() && MO.getReg() == RegB) { + assert(MO.getSubReg() == 0 && SubRegB == 0 && + "tied subregister uses in bundled instructions not supported"); + MO.setReg(RegA); + } + } + } } if (AllUsesCopied) { diff --git a/llvm/test/CodeGen/AMDGPU/twoaddr-bundle.mir b/llvm/test/CodeGen/AMDGPU/twoaddr-bundle.mir new file mode 100644 index 0000000000000..696962a88c8b8 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/twoaddr-bundle.mir @@ -0,0 +1,57 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 +# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 %s --passes=two-address-instruction -verify-each -o - | FileCheck --check-prefixes=GCN %s + +# Exercise very basic handling of BUNDLE'd instructions by the two-address-instruction pass. + +# This test is an example where it is best to keep the two-address instruction +# and resolve the tie with a COPY that is expected to be coalesced. +--- +name: test_fmac_bundle +body: | + bb.0: + + ; GCN-LABEL: name: test_fmac_bundle + ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 + ; GCN-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 + ; GCN-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec + ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF + ; GCN-NEXT: [[DEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF + ; GCN-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[V_ADD_U32_e64_]] + ; GCN-NEXT: BUNDLE implicit-def [[COPY2]], implicit [[DEF]], implicit [[DEF1]], implicit [[COPY2]](tied-def 0), implicit $mode, implicit $exec { + ; GCN-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = V_FMAC_F32_e32 killed [[DEF]], killed [[DEF1]], killed [[COPY2]], implicit $mode, implicit $exec + ; GCN-NEXT: } + %10:vgpr_32 = COPY $vgpr0 + %11:vgpr_32 = COPY $vgpr1 + %2:vgpr_32 = V_ADD_U32_e64 %10, %11, 0, implicit $exec + %0:vgpr_32 = IMPLICIT_DEF + %1:vgpr_32 = IMPLICIT_DEF + BUNDLE implicit-def %3:vgpr_32, implicit %0, implicit %1, implicit killed %2(tied-def 0), implicit $mode, implicit $exec { + %3:vgpr_32 = V_FMAC_F32_e32 killed %0, killed %1, killed %2, implicit $mode, implicit $exec + } + +... + +# This test is an example where conversion to three-address form would be beneficial. +--- +name: test_fmac_reuse_bundle +body: | + bb.0: + + ; GCN-LABEL: name: test_fmac_reuse_bundle + ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 + ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF + ; GCN-NEXT: [[DEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF + ; GCN-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[COPY]] + ; GCN-NEXT: BUNDLE implicit-def [[COPY1]], implicit [[DEF]], implicit [[DEF1]], implicit [[COPY1]](tied-def 0), implicit $mode, implicit $exec { + ; GCN-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = V_FMAC_F32_e32 killed [[DEF]], killed [[DEF1]], killed [[COPY1]], implicit $mode, implicit $exec + ; GCN-NEXT: } + ; GCN-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY1]], [[COPY]], 0, implicit $exec + %2:vgpr_32 = COPY $vgpr0 + %0:vgpr_32 = IMPLICIT_DEF + %1:vgpr_32 = IMPLICIT_DEF + BUNDLE implicit-def %3:vgpr_32, implicit %0, implicit %1, implicit %2(tied-def 0), implicit $mode, implicit $exec { + %3:vgpr_32 = V_FMAC_F32_e32 killed %0, killed %1, killed %2, implicit $mode, implicit $exec + } + %4:vgpr_32 = V_ADD_U32_e64 %3, %2, 0, implicit $exec + +... From f84c4c468353c5a9df0dac6eadd2acd51fd2107e Mon Sep 17 00:00:00 2001 From: Tarun Prabhu Date: Thu, 6 Nov 2025 11:39:19 -0700 Subject: [PATCH 23/71] [flang][Driver] Better error message when multiple actions are specified (#165575) If multiple action options are specified on the command line, list them all in the error message that is emitted Fixes #79458 --- .../clang/Basic/DiagnosticDriverKinds.td | 2 + flang/lib/Frontend/CompilerInvocation.cpp | 12 ++++-- flang/test/Driver/multiple-actions-error.f95 | 38 +++++++++++++++---- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 83980e3ac35b7..afd44a110bc74 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -312,6 +312,8 @@ def warn_drv_yc_multiple_inputs_clang_cl : Warning< def warn_drv_potentially_misspelled_joined_argument : Warning< "joined argument treated as '%0'; did you mean '%1'?">, InGroup; +def err_drv_too_many_actions: Error< + "only one action option is allowed. Got %0">; def err_drv_invalid_value : Error<"invalid value '%1' in '%0'">; def err_drv_invalid_int_value : Error<"invalid integral value '%1' in '%0'">; def err_drv_invalid_value_with_suggestion : Error< diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 548ca675db5ea..f05c4cfccf7fc 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -595,9 +595,15 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, // -cc1` does accept multiple action options, but will only consider the // rightmost one. if (args.hasMultipleArgs(clang::driver::options::OPT_Action_Group)) { - const unsigned diagID = diags.getCustomDiagID( - clang::DiagnosticsEngine::Error, "Only one action option is allowed"); - diags.Report(diagID); + llvm::SmallString<32> buf; + llvm::raw_svector_ostream os(buf); + for (const llvm::opt::Arg *arg : + args.filtered(clang::driver::options::OPT_Action_Group)) { + if (buf.size()) + os << ", "; + os << "'" << arg->getSpelling() << "'"; + } + diags.Report(clang::diag::err_drv_too_many_actions) << buf; return false; } diff --git a/flang/test/Driver/multiple-actions-error.f95 b/flang/test/Driver/multiple-actions-error.f95 index 5ec4e9166657f..3b2b7dc26d2c6 100644 --- a/flang/test/Driver/multiple-actions-error.f95 +++ b/flang/test/Driver/multiple-actions-error.f95 @@ -1,8 +1,30 @@ -! Verify that the frontend driver error-out if multiple actions are specified - -! RUN: not %flang_fc1 -E -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=ERROR -! RUN: not %flang_fc1 -fsyntax-only -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=ERROR - -! ERROR: error: Only one action option is allowed - -end progream +! Verify that the frontend driver raises the expected error when multiple +! actions are specified. +! +! RUN: not %flang_fc1 -fsyntax-only -fsyntax-only %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-1 +! +! RUN: not %flang_fc1 -E -fsyntax-only %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-2 +! +! RUN: not %flang_fc1 -fsyntax-only -E -emit-llvm %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-3 +! +! If one or more options are specified with -Xflang, they will appear last in +! the error message. +! +! RUN: not %flang -S -Xflang -emit-llvm %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-4 +! +! RUN: not %flang -Xflang -emit-llvm -S %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-4 +! +! RUN: not %flang -Xflang -emit-obj -S -Xflang -emit-llvm %s 2>&1 \ +! RUN: | FileCheck %s --check-prefixes=ERROR,ACTIONS-5 +! +! ERROR: error: only one action option is allowed. +! ACTIONS-1: Got '-fsyntax-only', '-fsyntax-only' +! ACTIONS-2: Got '-E', '-fsyntax-only' +! ACTIONS-3: Got '-fsyntax-only', '-E', '-emit-llvm' +! ACTIONS-4: Got '-S', '-emit-llvm' +! ACTIONS-5: Got '-S', '-emit-obj', '-emit-llvm' From 0ca7d57d745ed2adcbf6b012135dc3036f5c8792 Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Thu, 6 Nov 2025 20:48:45 +0200 Subject: [PATCH 24/71] [NFCI][lldb][test] Enable GNU POSIX extensions where necessary (#166768) Otherwise these tests are reliant on the compiler defaulting to having the extensions on. Rest of LLVM's codebase doesn't seem to make such assumptions. Tested by building with `-std=c2y` in Clang's C frotend's config file. --- lldb/packages/Python/lldbsuite/test/make/Makefile.rules | 5 +++++ lldb/test/Shell/Commands/Inputs/sigchld.c | 4 ++++ .../Shell/Commands/command-list-reach-beginning-of-file.test | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules index 63a35224b0435..0122fe8409c29 100644 --- a/lldb/packages/Python/lldbsuite/test/make/Makefile.rules +++ b/lldb/packages/Python/lldbsuite/test/make/Makefile.rules @@ -294,6 +294,11 @@ ifeq "$(MAKE_DEBUG_NAMES)" "YES" CFLAGS += -gpubnames endif +# Enable GNU POSIX extensions (e.g. kill(), usleep(), getpgid(), ...) +ifeq "$(OS)" "Linux" + CFLAGS += -D_DEFAULT_SOURCE +endif + ifeq "$(USE_PRIVATE_MODULE_CACHE)" "YES" THE_CLANG_MODULE_CACHE_DIR := $(BUILDDIR)/private-module-cache else diff --git a/lldb/test/Shell/Commands/Inputs/sigchld.c b/lldb/test/Shell/Commands/Inputs/sigchld.c index ba8c5ef45365b..0121e70c1bdd0 100644 --- a/lldb/test/Shell/Commands/Inputs/sigchld.c +++ b/lldb/test/Shell/Commands/Inputs/sigchld.c @@ -1,3 +1,7 @@ +#if defined(__linux__) +#define _XOPEN_SOURCE 500 /* for CLD_EXITED */ +#endif + #include #include #include diff --git a/lldb/test/Shell/Commands/command-list-reach-beginning-of-file.test b/lldb/test/Shell/Commands/command-list-reach-beginning-of-file.test index fa4a93e5904aa..9987efedd8020 100644 --- a/lldb/test/Shell/Commands/command-list-reach-beginning-of-file.test +++ b/lldb/test/Shell/Commands/command-list-reach-beginning-of-file.test @@ -4,7 +4,7 @@ # RUN: %lldb %t.out -b -s %s 2>&1 | FileCheck %s list -# CHECK: note: No source available +# CHECK: note: No source available b main # CHECK: Breakpoint 1: @@ -18,7 +18,7 @@ list list - # CHECK: int main() -list -10 +list -13 # CHECK: #include list - From 732c7255bf0c0b777242852960ed804b3c33947a Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Thu, 6 Nov 2025 18:55:24 +0000 Subject: [PATCH 25/71] [X86] narrowBitOpRMW - add additional uses of the StoredVal back to the DAG worklist (#166819) As StoredVal has been replaced with a fresh load, and has one less user, make sure we add the remaining user(s) back to the worklist in case this opens further folds. --- llvm/lib/Target/X86/X86ISelLowering.cpp | 5 +- llvm/test/CodeGen/X86/bittest-big-integer.ll | 59 +++++++++++++------- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 168e04109a0a5..d103953a4f2cf 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -53354,6 +53354,7 @@ static SDValue combineMaskedStore(SDNode *N, SelectionDAG &DAG, // i32 sub value. static SDValue narrowBitOpRMW(StoreSDNode *St, const SDLoc &DL, SelectionDAG &DAG, + TargetLowering::DAGCombinerInfo &DCI, const X86Subtarget &Subtarget) { using namespace SDPatternMatch; SDValue StoredVal = St->getValue(); @@ -53451,6 +53452,8 @@ static SDValue narrowBitOpRMW(StoreSDNode *St, const SDLoc &DL, if (!StoredVal.hasOneUse()) { SDValue NewLoad = DAG.getLoad(VT, DL, NewStore, Ld->getBasePtr(), Ld->getMemOperand()); + for (SDNode *User : StoredVal->users()) + DCI.AddToWorklist(User); DAG.ReplaceAllUsesWith(StoredVal, NewLoad); } return NewStore; @@ -53682,7 +53685,7 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG, } } - if (SDValue R = narrowBitOpRMW(St, dl, DAG, Subtarget)) + if (SDValue R = narrowBitOpRMW(St, dl, DAG, DCI, Subtarget)) return R; // Convert store(cmov(load(p), x, CC), p) to cstore(x, p, CC) diff --git a/llvm/test/CodeGen/X86/bittest-big-integer.ll b/llvm/test/CodeGen/X86/bittest-big-integer.ll index 32d225273a6e1..9d31c298bfb9e 100644 --- a/llvm/test/CodeGen/X86/bittest-big-integer.ll +++ b/llvm/test/CodeGen/X86/bittest-big-integer.ll @@ -1056,26 +1056,45 @@ define i32 @chain_reset_i256(ptr %p0, ptr %p1, ptr %p2, i32 %position) nounwind ; X86-NEXT: popl %ebp ; X86-NEXT: retl ; -; X64-LABEL: chain_reset_i256: -; X64: # %bb.0: -; X64-NEXT: # kill: def $ecx killed $ecx def $rcx -; X64-NEXT: movl $-2, %eax -; X64-NEXT: roll %cl, %eax -; X64-NEXT: shrl $3, %ecx -; X64-NEXT: andl $28, %ecx -; X64-NEXT: andl %eax, (%rdi,%rcx) -; X64-NEXT: movq (%rdi), %rcx -; X64-NEXT: movq 8(%rdi), %r8 -; X64-NEXT: orq 24(%rdi), %r8 -; X64-NEXT: movq 16(%rdi), %rdi -; X64-NEXT: orq %rcx, %rdi -; X64-NEXT: movl (%rsi), %eax -; X64-NEXT: movl %ecx, (%rsi) -; X64-NEXT: movl (%rdx), %ecx -; X64-NEXT: addl %ecx, %eax -; X64-NEXT: orq %r8, %rdi -; X64-NEXT: cmovnel %ecx, %eax -; X64-NEXT: retq +; SSE-LABEL: chain_reset_i256: +; SSE: # %bb.0: +; SSE-NEXT: # kill: def $ecx killed $ecx def $rcx +; SSE-NEXT: movl $-2, %eax +; SSE-NEXT: roll %cl, %eax +; SSE-NEXT: shrl $3, %ecx +; SSE-NEXT: andl $28, %ecx +; SSE-NEXT: andl %eax, (%rdi,%rcx) +; SSE-NEXT: movq (%rdi), %rcx +; SSE-NEXT: movq 8(%rdi), %r8 +; SSE-NEXT: orq 24(%rdi), %r8 +; SSE-NEXT: movq 16(%rdi), %rdi +; SSE-NEXT: orq %rcx, %rdi +; SSE-NEXT: movl (%rsi), %eax +; SSE-NEXT: movl %ecx, (%rsi) +; SSE-NEXT: movl (%rdx), %ecx +; SSE-NEXT: addl %ecx, %eax +; SSE-NEXT: orq %r8, %rdi +; SSE-NEXT: cmovnel %ecx, %eax +; SSE-NEXT: retq +; +; AVX-LABEL: chain_reset_i256: +; AVX: # %bb.0: +; AVX-NEXT: # kill: def $ecx killed $ecx def $rcx +; AVX-NEXT: movl $-2, %eax +; AVX-NEXT: roll %cl, %eax +; AVX-NEXT: shrl $3, %ecx +; AVX-NEXT: andl $28, %ecx +; AVX-NEXT: andl %eax, (%rdi,%rcx) +; AVX-NEXT: vmovdqu (%rdi), %ymm0 +; AVX-NEXT: movl (%rdi), %ecx +; AVX-NEXT: movl (%rsi), %eax +; AVX-NEXT: movl %ecx, (%rsi) +; AVX-NEXT: movl (%rdx), %ecx +; AVX-NEXT: addl %ecx, %eax +; AVX-NEXT: vptest %ymm0, %ymm0 +; AVX-NEXT: cmovnel %ecx, %eax +; AVX-NEXT: vzeroupper +; AVX-NEXT: retq %rem = and i32 %position, 255 %ofs = zext nneg i32 %rem to i256 %bit = shl nuw i256 1, %ofs From 2be5421da9aa3eda909b4b8bb86983927b4bba86 Mon Sep 17 00:00:00 2001 From: Tomer Shafir Date: Thu, 6 Nov 2025 20:57:47 +0200 Subject: [PATCH 26/71] [CodeGen] Add missing header guard to LibcallLoweringInfo.h (#166815) Introduced by https://github.com/llvm/llvm-project/pull/164987 --- llvm/include/llvm/CodeGen/LibcallLoweringInfo.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h index e8eceeed6aca6..9229750e00ab8 100644 --- a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h +++ b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +#ifndef LLVM_CODEGEN_LIBCALLLOWERINGINFO_H +#define LLVM_CODEGEN_LIBCALLLOWERINGINFO_H + #include "llvm/IR/RuntimeLibcalls.h" namespace llvm { @@ -64,3 +67,5 @@ class LibcallLoweringInfo { }; } // end namespace llvm + +#endif // LLVM_CODEGEN_LIBCALLLOWERINGINFO_H From 321de63633be1867d5c93d59ab2c49794cd5041a Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 6 Nov 2025 18:58:17 +0000 Subject: [PATCH 27/71] [VPlan] Unify casting unit testing (NFC). Generalize and unify testing of isa/cast/dyn_cast for various recipes, making it easier to extend with additional casts. --- .../Transforms/Vectorize/VPlanTest.cpp | 182 +++++++++++++----- 1 file changed, 137 insertions(+), 45 deletions(-) diff --git a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp index c256eae5dcdc2..82ecc16074a8f 100644 --- a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp +++ b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp @@ -969,16 +969,40 @@ compound=true #endif using VPRecipeTest = VPlanTestBase; + +namespace { +template +void checkVPRecipeCastImpl(RecipeT *R) { + // Direct checks on recipe pointer + EXPECT_TRUE(isa(R)); + EXPECT_EQ(R, dyn_cast(R)); + (void)cast(R); // Verify cast succeeds (asserts on failure) + + // Check through base pointer + VPRecipeBase *BaseR = R; + EXPECT_TRUE(isa(BaseR)); + EXPECT_EQ(R, dyn_cast(BaseR)); + (void)cast(BaseR); + + // Check through const base pointer + const VPRecipeBase *ConstBaseR = R; + EXPECT_TRUE(isa(ConstBaseR)); + EXPECT_EQ(R, dyn_cast(ConstBaseR)); + (void)cast(ConstBaseR); + + if constexpr (sizeof...(Rest) > 0) + checkVPRecipeCastImpl(R); +} +} // namespace + TEST_F(VPRecipeTest, CastVPInstructionToVPUser) { IntegerType *Int32 = IntegerType::get(C, 32); VPlan &Plan = getPlan(); VPValue *Op1 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); VPValue *Op2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); VPInstruction Recipe(Instruction::Add, {Op1, Op2}); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); } TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) { @@ -992,10 +1016,8 @@ TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) { Args.push_back(Op1); Args.push_back(Op2); VPWidenRecipe WidenR(*AI, make_range(Args.begin(), Args.end())); - EXPECT_TRUE(isa(&WidenR)); - VPRecipeBase *WidenRBase = &WidenR; - EXPECT_TRUE(isa(WidenRBase)); - EXPECT_EQ(&WidenR, WidenRBase); + + checkVPRecipeCastImpl(&WidenR); delete AI; } @@ -1013,10 +1035,8 @@ TEST_F(VPRecipeTest, CastVPWidenCallRecipeToVPUserAndVPDef) { Args.push_back(Op2); Args.push_back(CalledFn); VPWidenCallRecipe Recipe(Call, Fn, Args); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); VPValue *VPV = &Recipe; EXPECT_TRUE(VPV->getDefiningRecipe()); @@ -1041,13 +1061,10 @@ TEST_F(VPRecipeTest, CastVPWidenSelectRecipeToVPUserAndVPDef) { Args.push_back(Op3); VPWidenSelectRecipe WidenSelectR(*SelectI, make_range(Args.begin(), Args.end())); - EXPECT_TRUE(isa(&WidenSelectR)); - VPRecipeBase *BaseR = &WidenSelectR; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&WidenSelectR, BaseR); + + checkVPRecipeCastImpl(&WidenSelectR); VPValue *VPV = &WidenSelectR; - EXPECT_TRUE(isa(VPV->getDefiningRecipe())); EXPECT_EQ(&WidenSelectR, VPV->getDefiningRecipe()); delete SelectI; @@ -1065,10 +1082,8 @@ TEST_F(VPRecipeTest, CastVPWidenGEPRecipeToVPUserAndVPDef) { Args.push_back(Op1); Args.push_back(Op2); VPWidenGEPRecipe Recipe(GEP, make_range(Args.begin(), Args.end())); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); VPValue *VPV = &Recipe; EXPECT_TRUE(isa(VPV->getDefiningRecipe())); @@ -1077,6 +1092,28 @@ TEST_F(VPRecipeTest, CastVPWidenGEPRecipeToVPUserAndVPDef) { delete GEP; } +TEST_F(VPRecipeTest, CastVPWidenCastRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + IntegerType *Int64 = IntegerType::get(C, 64); + auto *Cast = CastInst::CreateZExtOrBitCast(PoisonValue::get(Int32), Int64); + VPValue *Op1 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPWidenCastRecipe Recipe(Instruction::ZExt, Op1, Int64, *Cast); + + checkVPRecipeCastImpl(&Recipe); + delete Cast; +} + +TEST_F(VPRecipeTest, CastVPWidenIntrinsicRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + VPValue *Op1 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPValue *Op2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); + VPWidenIntrinsicRecipe Recipe(Intrinsic::smax, {Op1, Op2}, Int32); + + checkVPRecipeCastImpl(&Recipe); +} + TEST_F(VPRecipeTest, CastVPBlendRecipeToVPUser) { VPlan &Plan = getPlan(); IntegerType *Int32 = IntegerType::get(C, 32); @@ -1090,9 +1127,9 @@ TEST_F(VPRecipeTest, CastVPBlendRecipeToVPUser) { Args.push_back(I2); Args.push_back(M2); VPBlendRecipe Recipe(Phi, Args, {}); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); + + checkVPRecipeCastImpl(&Recipe); + delete Phi; } @@ -1103,10 +1140,8 @@ TEST_F(VPRecipeTest, CastVPInterleaveRecipeToVPUser) { VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); InterleaveGroup IG(4, false, Align(4)); VPInterleaveRecipe Recipe(&IG, Addr, {}, Mask, false, {}, DebugLoc()); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); } TEST_F(VPRecipeTest, CastVPReplicateRecipeToVPUser) { @@ -1121,9 +1156,9 @@ TEST_F(VPRecipeTest, CastVPReplicateRecipeToVPUser) { FunctionType *FTy = FunctionType::get(Int32, false); auto *Call = CallInst::Create(FTy, PoisonValue::get(FTy)); VPReplicateRecipe Recipe(Call, make_range(Args.begin(), Args.end()), true); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); + + checkVPRecipeCastImpl(&Recipe); + delete Call; } @@ -1132,10 +1167,8 @@ TEST_F(VPRecipeTest, CastVPBranchOnMaskRecipeToVPUser) { IntegerType *Int32 = IntegerType::get(C, 32); VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); VPBranchOnMaskRecipe Recipe(Mask, {}); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); } TEST_F(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { @@ -1147,10 +1180,8 @@ TEST_F(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { VPValue *Addr = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); VPWidenLoadRecipe Recipe(*Load, Addr, Mask, true, false, {}, {}); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); - EXPECT_EQ(&Recipe, BaseR); + + checkVPRecipeCastImpl(&Recipe); VPValue *VPV = Recipe.getVPSingleValue(); EXPECT_TRUE(isa(VPV->getDefiningRecipe())); @@ -1159,6 +1190,71 @@ TEST_F(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) { delete Load; } +TEST_F(VPRecipeTest, CastVPInterleaveEVLRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + VPValue *Addr = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); + VPValue *EVL = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 8)); + InterleaveGroup IG(4, false, Align(4)); + VPInterleaveRecipe BaseRecipe(&IG, Addr, {}, Mask, false, {}, DebugLoc()); + VPInterleaveEVLRecipe Recipe(BaseRecipe, *EVL, Mask); + + checkVPRecipeCastImpl(&Recipe); +} + +TEST_F(VPRecipeTest, CastVPWidenLoadEVLRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + PointerType *Int32Ptr = PointerType::get(C, 0); + auto *Load = + new LoadInst(Int32, PoisonValue::get(Int32Ptr), "", false, Align(1)); + VPValue *Addr = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); + VPValue *EVL = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 8)); + VPWidenLoadRecipe BaseLoad(*Load, Addr, Mask, true, false, {}, {}); + VPWidenLoadEVLRecipe Recipe(BaseLoad, Addr, *EVL, Mask); + + checkVPRecipeCastImpl(&Recipe); + + delete Load; +} + +TEST_F(VPRecipeTest, CastVPWidenStoreRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + PointerType *Int32Ptr = PointerType::get(C, 0); + auto *Store = new StoreInst(PoisonValue::get(Int32), + PoisonValue::get(Int32Ptr), false, Align(1)); + VPValue *Addr = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPValue *StoredVal = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 42)); + VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); + VPWidenStoreRecipe Recipe(*Store, Addr, StoredVal, Mask, true, false, {}, {}); + + checkVPRecipeCastImpl(&Recipe); + + delete Store; +} + +TEST_F(VPRecipeTest, CastVPWidenStoreEVLRecipeToVPUser) { + VPlan &Plan = getPlan(); + IntegerType *Int32 = IntegerType::get(C, 32); + PointerType *Int32Ptr = PointerType::get(C, 0); + auto *Store = new StoreInst(PoisonValue::get(Int32), + PoisonValue::get(Int32Ptr), false, Align(1)); + VPValue *Addr = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1)); + VPValue *StoredVal = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 42)); + VPValue *EVL = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 8)); + VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2)); + VPWidenStoreRecipe BaseStore(*Store, Addr, StoredVal, Mask, true, false, {}, + {}); + VPWidenStoreEVLRecipe Recipe(BaseStore, Addr, *EVL, Mask); + + checkVPRecipeCastImpl(&Recipe); + + delete Store; +} + TEST_F(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) { IntegerType *Int1 = IntegerType::get(C, 1); IntegerType *Int32 = IntegerType::get(C, 32); @@ -1606,9 +1702,7 @@ TEST_F(VPRecipeTest, CastVPReductionRecipeToVPUser) { VPValue *CondOp = getPlan().getOrAddLiveIn(ConstantInt::get(Int32, 3)); VPReductionRecipe Recipe(RecurKind::Add, FastMathFlags(), Add, ChainOp, CondOp, VecOp, false); - EXPECT_TRUE(isa(&Recipe)); - VPRecipeBase *BaseR = &Recipe; - EXPECT_TRUE(isa(BaseR)); + checkVPRecipeCastImpl(&Recipe); delete Add; } @@ -1623,9 +1717,7 @@ TEST_F(VPRecipeTest, CastVPReductionEVLRecipeToVPUser) { CondOp, VecOp, false); VPValue *EVL = getPlan().getOrAddLiveIn(ConstantInt::get(Int32, 0)); VPReductionEVLRecipe EVLRecipe(Recipe, *EVL, CondOp); - EXPECT_TRUE(isa(&EVLRecipe)); - VPRecipeBase *BaseR = &EVLRecipe; - EXPECT_TRUE(isa(BaseR)); + checkVPRecipeCastImpl(&EVLRecipe); delete Add; } } // namespace From de2a86e5f0bdab3a09d91f4f8f57b06d3ff55b18 Mon Sep 17 00:00:00 2001 From: nerix Date: Thu, 6 Nov 2025 20:00:14 +0100 Subject: [PATCH 28/71] [LLDB] Run working STL data formatter tests with PDB (#166812) This enables testing with PDB for all tests that don't require any changes to pass. I ran the `lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic` tests locally and they passed. --- .../data-formatter-stl/generic/map/TestDataFormatterStdMap.py | 2 ++ .../generic/multimap/TestDataFormatterGenericMultiMap.py | 2 ++ .../generic/multiset/TestDataFormatterGenericMultiSet.py | 2 ++ .../generic/set/TestDataFormatterGenericSet.py | 2 ++ .../generic/tuple/TestDataFormatterStdTuple.py | 2 ++ .../generic/vbool/TestDataFormatterStdVBool.py | 2 ++ 6 files changed, 12 insertions(+) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py index 07d6c963eb05d..ca2d2d6b49541 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py @@ -9,6 +9,8 @@ class StdMapDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): TestBase.setUp(self) ns = "ndk" if lldbplatformutil.target_is_android() else "" diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py index 7ac79714db88d..4b0854b180e0a 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py @@ -11,6 +11,8 @@ class GenericMultiMapDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): TestBase.setUp(self) self.namespace = "std" diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multiset/TestDataFormatterGenericMultiSet.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multiset/TestDataFormatterGenericMultiSet.py index 7e922fccdf7d7..e846e072777f8 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multiset/TestDataFormatterGenericMultiSet.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multiset/TestDataFormatterGenericMultiSet.py @@ -10,6 +10,8 @@ class GenericMultiSetDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): TestBase.setUp(self) self.namespace = "std" diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/set/TestDataFormatterGenericSet.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/set/TestDataFormatterGenericSet.py index 1ac5e323e23e3..355f0c6edba19 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/set/TestDataFormatterGenericSet.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/set/TestDataFormatterGenericSet.py @@ -10,6 +10,8 @@ class GenericSetDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): TestBase.setUp(self) self.namespace = "std" diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py index b23d549fe4c18..898438729ff8f 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py @@ -9,6 +9,8 @@ class TestDataFormatterStdTuple(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): TestBase.setUp(self) self.line = line_number("main.cpp", "// break here") diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vbool/TestDataFormatterStdVBool.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vbool/TestDataFormatterStdVBool.py index dd142d2be193b..f74092ca3a0b8 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vbool/TestDataFormatterStdVBool.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vbool/TestDataFormatterStdVBool.py @@ -9,6 +9,8 @@ class StdVBoolDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def setUp(self): # Call super's setUp(). TestBase.setUp(self) From aaddd8d38aa06f096cdf5ebe0d36c8e2b9a63265 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Thu, 6 Nov 2025 12:37:19 -0600 Subject: [PATCH 29/71] [OpenMP] Fix tests relying on the heap size variable Summary: I made that an unimplemented error, but forgot that it was used for this environment variable. --- .../common/include/PluginInterface.h | 1 + .../common/src/PluginInterface.cpp | 16 +++++++++------- offload/plugins-nextgen/cuda/src/rtl.cpp | 1 + offload/test/offloading/interop-print.c | 1 + 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h index eac5ee215152e..2135e0608323e 100644 --- a/offload/plugins-nextgen/common/include/PluginInterface.h +++ b/offload/plugins-nextgen/common/include/PluginInterface.h @@ -1063,6 +1063,7 @@ struct GenericDeviceTy : public DeviceAllocatorTy { virtual Error getDeviceStackSize(uint64_t &V) = 0; + virtual bool hasDeviceHeapSize() { return false; } virtual Error getDeviceHeapSize(uint64_t &V) { return Plugin::error(error::ErrorCode::UNSUPPORTED, "%s not supported by platform", __func__); diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index 3ed3cb1cc13b8..ee2ecbcfd3098 100644 --- a/offload/plugins-nextgen/common/src/PluginInterface.cpp +++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp @@ -762,13 +762,15 @@ Error GenericDeviceTy::init(GenericPluginTy &Plugin) { return StackSizeEnvarOrErr.takeError(); OMPX_TargetStackSize = std::move(*StackSizeEnvarOrErr); - auto HeapSizeEnvarOrErr = UInt64Envar::create( - "LIBOMPTARGET_HEAP_SIZE", - [this](uint64_t &V) -> Error { return getDeviceHeapSize(V); }, - [this](uint64_t V) -> Error { return setDeviceHeapSize(V); }); - if (!HeapSizeEnvarOrErr) - return HeapSizeEnvarOrErr.takeError(); - OMPX_TargetHeapSize = std::move(*HeapSizeEnvarOrErr); + if (hasDeviceHeapSize()) { + auto HeapSizeEnvarOrErr = UInt64Envar::create( + "LIBOMPTARGET_HEAP_SIZE", + [this](uint64_t &V) -> Error { return getDeviceHeapSize(V); }, + [this](uint64_t V) -> Error { return setDeviceHeapSize(V); }); + if (!HeapSizeEnvarOrErr) + return HeapSizeEnvarOrErr.takeError(); + OMPX_TargetHeapSize = std::move(*HeapSizeEnvarOrErr); + } // Update the maximum number of teams and threads after the device // initialization sets the corresponding hardware limit. diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp index fc3e7710622a2..45e580e7e0cd7 100644 --- a/offload/plugins-nextgen/cuda/src/rtl.cpp +++ b/offload/plugins-nextgen/cuda/src/rtl.cpp @@ -1242,6 +1242,7 @@ struct CUDADeviceTy : public GenericDeviceTy { Error setDeviceStackSize(uint64_t Value) override { return setCtxLimit(CU_LIMIT_STACK_SIZE, Value); } + bool hasDeviceHeapSize() override { return true; } Error getDeviceHeapSize(uint64_t &Value) override { return getCtxLimit(CU_LIMIT_MALLOC_HEAP_SIZE, Value); } diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index a3864209e17bc..f7b37d992f17f 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -8,6 +8,7 @@ // REQUIRES: gpu // XFAIL: nvptx64-nvidia-cuda +// XFAIL: nvptx64-nvidia-cuda-LTO #include #include From ecddaaeb3e3fe34c0202a9a48280f3dd48f3859b Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 6 Nov 2025 14:05:30 -0500 Subject: [PATCH 30/71] [DirectX] Remove llvm.assume intrinsic (#166697) fixes #165051 This change reverts the experiment we did for #165311 While some backends seem to support llvm.assume without validation The validator itself does not so it makes more sense to just remove it. --- llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp | 4 ++++ llvm/lib/Target/DirectX/DXILOpLowering.cpp | 2 -- llvm/test/CodeGen/DirectX/llvm_assume.ll | 9 +++++++++ llvm/test/tools/dxil-dis/llvm_assume.ll | 11 ----------- 4 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/llvm_assume.ll delete mode 100644 llvm/test/tools/dxil-dis/llvm_assume.ll diff --git a/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp b/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp index ebb7c2607c0c8..e0d2dbde92150 100644 --- a/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp +++ b/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp @@ -197,6 +197,7 @@ static Value *expand16BitIsNormal(CallInst *Orig) { static bool isIntrinsicExpansion(Function &F) { switch (F.getIntrinsicID()) { + case Intrinsic::assume: case Intrinsic::abs: case Intrinsic::atan2: case Intrinsic::exp: @@ -988,6 +989,9 @@ static bool expandIntrinsic(Function &F, CallInst *Orig) { case Intrinsic::abs: Result = expandAbs(Orig); break; + case Intrinsic::assume: + Orig->eraseFromParent(); + return true; case Intrinsic::atan2: Result = expandAtan2Intrinsic(Orig); break; diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp index 8720460cceb20..e46a393e50906 100644 --- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp +++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp @@ -904,8 +904,6 @@ class OpLowerer { case Intrinsic::dx_resource_casthandle: // NOTE: llvm.dbg.value is supported as is in DXIL. case Intrinsic::dbg_value: - // NOTE: llvm.assume is supported as is in DXIL. - case Intrinsic::assume: case Intrinsic::not_intrinsic: if (F.use_empty()) F.eraseFromParent(); diff --git a/llvm/test/CodeGen/DirectX/llvm_assume.ll b/llvm/test/CodeGen/DirectX/llvm_assume.ll new file mode 100644 index 0000000000000..d739592b75d78 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/llvm_assume.ll @@ -0,0 +1,9 @@ +; RUN: opt -S -dxil-intrinsic-expansion -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s + +define void @test_llvm_assume(i1 %0) { +; CHECK-LABEL: test_llvm_assume +; CHECK-NEXT: ret void +tail call void @llvm.assume(i1 %0) +ret void +} + diff --git a/llvm/test/tools/dxil-dis/llvm_assume.ll b/llvm/test/tools/dxil-dis/llvm_assume.ll deleted file mode 100644 index f5be66c0d192f..0000000000000 --- a/llvm/test/tools/dxil-dis/llvm_assume.ll +++ /dev/null @@ -1,11 +0,0 @@ -; RUN: llc --filetype=obj %s -o - | dxil-dis -o - | FileCheck %s - -target triple = "dxil-pc-shadermodel6.7-library" - -define void @test_llvm_assume(i1 %0) { -; CHECK-LABEL: test_llvm_assume -; CHECK-NEXT: tail call void @llvm.assume(i1 %0) -tail call void @llvm.assume(i1 %0) -ret void -} - From e341a9f47f3155dd8ab2a9c942fc5dbaa3a87723 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 11:08:03 -0800 Subject: [PATCH 31/71] [Github] Exclude Renovate from Updating OS Versions in GHA (#166811) We usually set this explicitly for various reasons. Exclude them from the renovate config so that they do not get included in the automatically generated PRs. --- .github/renovate.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 6ce98c4e7b105..8e89ba8c4b32a 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -8,5 +8,12 @@ "minimumReleaseAge": "3 days", "assignees": ["boomanaiden154"], "ignorePaths": [".github/workflows/containers/**"], - "groupName": "[Github] Update GHA Dependencies" + "groupName": "[Github] Update GHA Dependencies", + "packageRules": [ + { + "matchPackageNames": ["windows", "macos"], + "matchManagers": ["github-actions"], + "enabled": false + } + ] } From c145f2844b193363f08bb6194141310eae8992e1 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 6 Nov 2025 11:08:16 -0800 Subject: [PATCH 32/71] AMDGPU: Replace some undef uses in tests (#166813) --- llvm/test/CodeGen/AMDGPU/branch-relaxation-gfx1250.ll | 8 ++++---- llvm/test/CodeGen/AMDGPU/flat-saddr-atomics.ll | 2 +- llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll | 2 +- ...cheduler-rp-calc-one-successor-two-predecessors-bug.ll | 4 ++-- llvm/test/CodeGen/AMDGPU/tuple-allocation-failure.ll | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/llvm/test/CodeGen/AMDGPU/branch-relaxation-gfx1250.ll b/llvm/test/CodeGen/AMDGPU/branch-relaxation-gfx1250.ll index f8655a702180e..f465e3c505c02 100644 --- a/llvm/test/CodeGen/AMDGPU/branch-relaxation-gfx1250.ll +++ b/llvm/test/CodeGen/AMDGPU/branch-relaxation-gfx1250.ll @@ -280,7 +280,7 @@ bb0: br i1 %tmp, label %bb2, label %bb3 bb2: - store volatile i32 17, ptr addrspace(1) undef + store volatile i32 17, ptr addrspace(1) poison br label %bb4 bb3: @@ -375,7 +375,7 @@ bb0: br i1 %cmp0, label %bb2, label %bb1 bb1: - %val = load volatile i32, ptr addrspace(4) undef + %val = load volatile i32, ptr addrspace(4) poison %cmp1 = icmp eq i32 %val, 3 br i1 %cmp1, label %bb3, label %bb2 @@ -512,7 +512,7 @@ loop_body: br label %loop ret: - store volatile i32 7, ptr addrspace(1) undef + store volatile i32 7, ptr addrspace(1) poison ret void } @@ -622,7 +622,7 @@ bb14: ; preds = %bb13, %bb9 br label %bb19 bb19: ; preds = %bb14, %bb13, %bb9 - %tmp20 = phi i32 [ undef, %bb9 ], [ undef, %bb13 ], [ %tmp18, %bb14 ] + %tmp20 = phi i32 [ poison, %bb9 ], [ poison, %bb13 ], [ %tmp18, %bb14 ] %tmp21 = getelementptr inbounds i32, ptr addrspace(1) %arg, i64 %arg5 store i32 %tmp20, ptr addrspace(1) %tmp21, align 4 ret void diff --git a/llvm/test/CodeGen/AMDGPU/flat-saddr-atomics.ll b/llvm/test/CodeGen/AMDGPU/flat-saddr-atomics.ll index eefc7811d42b6..357234080235a 100644 --- a/llvm/test/CodeGen/AMDGPU/flat-saddr-atomics.ll +++ b/llvm/test/CodeGen/AMDGPU/flat-saddr-atomics.ll @@ -263,7 +263,7 @@ define amdgpu_ps float @flat_xchg_saddr_i32_rtn_neg2048(ptr inreg %sbase, i32 %v ; Uniformity edge cases ; -------------------------------------------------------------------------------- -@ptr.in.lds = internal addrspace(3) global ptr undef +@ptr.in.lds = internal addrspace(3) global ptr poison ; Base pointer is uniform, but also in VGPRs define amdgpu_ps float @flat_xchg_saddr_uniform_ptr_in_vgprs_rtn(i32 %voffset, i32 %data) { diff --git a/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll b/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll index 32888d2acf1cd..3d0e2875e91a2 100644 --- a/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll +++ b/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll @@ -54,7 +54,7 @@ define amdgpu_ps void @flat_store_saddr_i8_zext_vgpr_offset_neg2048(ptr inreg %s ; Uniformity edge cases ; -------------------------------------------------------------------------------- -@ptr.in.lds = internal addrspace(3) global ptr undef +@ptr.in.lds = internal addrspace(3) global ptr poison ; Base pointer is uniform, but also in VGPRs define amdgpu_ps void @flat_store_saddr_uniform_ptr_in_vgprs(i32 %voffset, i8 %data) { diff --git a/llvm/test/CodeGen/AMDGPU/scheduler-rp-calc-one-successor-two-predecessors-bug.ll b/llvm/test/CodeGen/AMDGPU/scheduler-rp-calc-one-successor-two-predecessors-bug.ll index 118c47e680709..cac1fe9605a17 100644 --- a/llvm/test/CodeGen/AMDGPU/scheduler-rp-calc-one-successor-two-predecessors-bug.ll +++ b/llvm/test/CodeGen/AMDGPU/scheduler-rp-calc-one-successor-two-predecessors-bug.ll @@ -46,7 +46,7 @@ define amdgpu_ps void @_amdgpu_ps_main(float %arg) { ; GFX900-NEXT: s_mov_b64 exec, 0 ; GFX900-NEXT: s_waitcnt vmcnt(0) ; GFX900-NEXT: v_mov_b32_e32 v1, 0 -; GFX900-NEXT: v_mov_b32_e32 v2, 0 +; GFX900-NEXT: v_mov_b32_e32 v2, v1 ; GFX900-NEXT: .LBB0_5: ; %bb6 ; GFX900-NEXT: s_or_b64 exec, exec, s[0:1] ; GFX900-NEXT: s_waitcnt vmcnt(0) @@ -75,7 +75,7 @@ bb5: bb6: %i7 = phi float [ 0.000000e+00, %bb5 ], [ %i3, %bb1 ] %i8 = phi float [ 0.000000e+00, %bb5 ], [ 1.000000e+00, %bb1 ] - %i9 = phi float [ undef, %bb5 ], [ %i4, %bb1 ] + %i9 = phi float [ poison, %bb5 ], [ %i4, %bb1 ] %i10 = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 0.000000e+00, float %i7) %i11 = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %i8, float %i9) call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 0, <2 x half> %i10, <2 x half> %i11, i1 false, i1 false) diff --git a/llvm/test/CodeGen/AMDGPU/tuple-allocation-failure.ll b/llvm/test/CodeGen/AMDGPU/tuple-allocation-failure.ll index d80ec6bd34945..8f8e2c0ba52fc 100644 --- a/llvm/test/CodeGen/AMDGPU/tuple-allocation-failure.ll +++ b/llvm/test/CodeGen/AMDGPU/tuple-allocation-failure.ll @@ -655,7 +655,7 @@ bb: br label %bb5 bb5: ; preds = %bb5.backedge, %bb - %tmp4.i.sroa.0.0 = phi <9 x double> [ undef, %bb ], [ %tmp4.i.sroa.0.1, %bb5.backedge ] + %tmp4.i.sroa.0.0 = phi <9 x double> [ poison, %bb ], [ %tmp4.i.sroa.0.1, %bb5.backedge ] %tmp14.1.i = load i32, ptr inttoptr (i64 128 to ptr), align 128 store i32 0, ptr addrspace(5) null, align 4 %tmp14.2.i = load i32, ptr inttoptr (i64 128 to ptr), align 128 From 4c605e91244976fc7b746cfe8c0a90231b468ef7 Mon Sep 17 00:00:00 2001 From: "Deric C." Date: Thu, 6 Nov 2025 11:09:05 -0800 Subject: [PATCH 33/71] [HLSL] [DirectX] Invert the result of `firstbithigh` (#166419) Fixes #145752 This PR inverts the result of `firstbithigh` when targeting DirectX by subtracting it from integer bitwidth - 1 to match the result from DXC. The result is not inverted if `firstbithigh` returned -1 or when targeting a backend other than DirectX. --- .../lib/Headers/hlsl/hlsl_alias_intrinsics.h | 72 -------- .../lib/Headers/hlsl/hlsl_intrinsic_helpers.h | 12 ++ clang/lib/Headers/hlsl/hlsl_intrinsics.h | 61 +++++++ .../CodeGenHLSL/builtins/firstbithigh.hlsl | 163 ++++++++++++++---- .../BuiltIns/firstbithigh-errors.hlsl | 2 +- 5 files changed, 205 insertions(+), 105 deletions(-) diff --git a/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h index 208776eb7840e..2e2703de18cb1 100644 --- a/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h @@ -1073,78 +1073,6 @@ float3 f16tof32(uint3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_f16tof32) float4 f16tof32(uint4); -//===----------------------------------------------------------------------===// -// firstbithigh builtins -//===----------------------------------------------------------------------===// - -/// \fn T firstbithigh(T Val) -/// \brief Returns the location of the first set bit starting from the highest -/// order bit and working downward, per component. -/// \param Val the input value. - -#ifdef __HLSL_ENABLE_16_BIT -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(int16_t); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(int16_t2); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(int16_t3); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(int16_t4); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(uint16_t); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(uint16_t2); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(uint16_t3); -_HLSL_AVAILABILITY(shadermodel, 6.2) -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(uint16_t4); -#endif - -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(int); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(int2); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(int3); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(int4); - -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(uint); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(uint2); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(uint3); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(uint4); - -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(int64_t); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(int64_t2); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(int64_t3); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(int64_t4); - -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint firstbithigh(uint64_t); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint2 firstbithigh(uint64_t2); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint3 firstbithigh(uint64_t3); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh) -uint4 firstbithigh(uint64_t4); - //===----------------------------------------------------------------------===// // firstbitlow builtins //===----------------------------------------------------------------------===// diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h b/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h index c877234479ad1..3d8fe7ea701a6 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h @@ -148,6 +148,18 @@ template constexpr T ldexp_impl(T X, T Exp) { return exp2(Exp) * X; } +template +constexpr K firstbithigh_impl(T X) { + K FBH = __builtin_hlsl_elementwise_firstbithigh(X); +#if defined(__DIRECTX__) + // The firstbithigh DXIL ops count bits from the wrong side, so we need to + // invert it for DirectX. + K Inversion = (BitWidth - 1) - FBH; + FBH = select(FBH == -1, FBH, Inversion); +#endif + return FBH; +} + } // namespace __detail } // namespace hlsl diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 5ba5bfb9abde0..33ed14328ee8a 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -261,6 +261,67 @@ faceforward(__detail::HLSL_FIXED_VECTOR N, return __detail::faceforward_impl(N, I, Ng); } +//===----------------------------------------------------------------------===// +// firstbithigh builtins +//===----------------------------------------------------------------------===// + +/// \fn T firstbithigh(T Val) +/// \brief Returns the location of the first set bit starting from the lowest +/// order bit and working upward, per component. +/// \param Val the input value. + +#ifdef __HLSL_ENABLE_16_BIT + +template +_HLSL_AVAILABILITY(shadermodel, 6.2) +const inline __detail::enable_if_t<__detail::is_same::value || + __detail::is_same::value, + uint> firstbithigh(T X) { + return __detail::firstbithigh_impl(X); +} + +template +_HLSL_AVAILABILITY(shadermodel, 6.2) +const + inline __detail::enable_if_t<__detail::is_same::value || + __detail::is_same::value, + vector> firstbithigh(vector X) { + return __detail::firstbithigh_impl, vector, 16>(X); +} + +#endif + +template +const inline __detail::enable_if_t< + __detail::is_same::value || __detail::is_same::value, uint> +firstbithigh(T X) { + return __detail::firstbithigh_impl(X); +} + +template +const inline __detail::enable_if_t<__detail::is_same::value || + __detail::is_same::value, + vector> +firstbithigh(vector X) { + return __detail::firstbithigh_impl, vector, 32>(X); +} + +template +const inline __detail::enable_if_t<__detail::is_same::value || + __detail::is_same::value, + uint> +firstbithigh(T X) { + return __detail::firstbithigh_impl(X); +} + +template +const inline __detail::enable_if_t<__detail::is_same::value || + __detail::is_same::value, + vector> +firstbithigh(vector X) { + return __detail::firstbithigh_impl, vector, 64>(X); +} + //===----------------------------------------------------------------------===// // fmod builtins //===----------------------------------------------------------------------===// diff --git a/clang/test/CodeGenHLSL/builtins/firstbithigh.hlsl b/clang/test/CodeGenHLSL/builtins/firstbithigh.hlsl index 368d652a6f779..51b0f81bea06a 100644 --- a/clang/test/CodeGenHLSL/builtins/firstbithigh.hlsl +++ b/clang/test/CodeGenHLSL/builtins/firstbithigh.hlsl @@ -1,161 +1,260 @@ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ -// RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type -fnative-int16-type \ -// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s -DTARGET=dx +// RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type \ +// RUN: -fnative-int16-type -emit-llvm -O1 -o - | FileCheck %s -DTARGET=dx \ +// RUN: --check-prefixes=CHECK,DXCHECK // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ -// RUN: spirv-unknown-vulkan-compute %s -fnative-half-type -fnative-int16-type \ -// RUN: -emit-llvm -disable-llvm-passes \ -// RUN: -o - | FileCheck %s -DTARGET=spv +// RUN: spirv-unknown-vulkan-compute %s -fnative-half-type \ +// RUN: -fnative-int16-type -emit-llvm -O1 -o - | FileCheck %s -DTARGET=spv #ifdef __HLSL_ENABLE_16_BIT // CHECK-LABEL: test_firstbithigh_ushort -// CHECK: call i32 @llvm.[[TARGET]].firstbituhigh.i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbituhigh.i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 15, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_ushort(uint16_t p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ushort2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_ushort2(uint16_t2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ushort3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_ushort3(uint16_t3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ushort4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_ushort4(uint16_t4 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_short -// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbitshigh.i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 15, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_short(int16_t p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_short2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_short2(int16_t2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_short3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_short3(int16_t3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_short4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i16 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i16 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 15), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_short4(int16_t4 p0) { return firstbithigh(p0); } #endif // __HLSL_ENABLE_16_BIT // CHECK-LABEL: test_firstbithigh_uint -// CHECK: call i32 @llvm.[[TARGET]].firstbituhigh.i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbituhigh.i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_uint(uint p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_uint2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_uint2(uint2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_uint3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_uint3(uint3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_uint4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_uint4(uint4 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ulong -// CHECK: call i32 @llvm.[[TARGET]].firstbituhigh.i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbituhigh.i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 63, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_ulong(uint64_t p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ulong2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_ulong2(uint64_t2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ulong3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_ulong3(uint64_t3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_ulong4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_ulong4(uint64_t4 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_int -// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbitshigh.i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_int(int p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_int2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_int2(int2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_int3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_int3(int3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_int4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i32 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i32 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_int4(int4 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_long -// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}i32 @llvm.[[TARGET]].firstbitshigh.i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub i32 63, [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[FBH]], -1 +// DXCHECK-NEXT: select i1 %cmp.i, i32 -1, i32 [[SUB]] +// CHECK-NEXT: ret i32 uint test_firstbithigh_long(int64_t p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_long2 -// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <2 x i1> %cmp.i, <2 x i32> splat (i32 -1), <2 x i32> [[SUB]] +// CHECK-NEXT: ret <2 x i32> uint2 test_firstbithigh_long2(int64_t2 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_long3 -// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <3 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <3 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <3 x i1> %cmp.i, <3 x i32> splat (i32 -1), <3 x i32> [[SUB]] +// CHECK-NEXT: ret <3 x i32> uint3 test_firstbithigh_long3(int64_t3 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_long4 -// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i64 +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i64 +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 63), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: ret <4 x i32> uint4 test_firstbithigh_long4(int64_t4 p0) { return firstbithigh(p0); } // CHECK-LABEL: test_firstbithigh_upcast -// CHECK: [[FBH:%.*]] = call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i32(<4 x i32> %{{.*}}) -// CHECK: [[CONV:%.*]] = zext <4 x i32> [[FBH]] to <4 x i64> -// CHECK: ret <4 x i64> [[CONV]] +// CHECK: [[FBH:%.*]] = tail call {{.*}}<4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i32(<4 x i32> %{{.*}}) +// DXCHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 31), [[FBH]] +// DXCHECK-NEXT: [[ICMP:%.*]] = icmp eq <4 x i32> [[FBH]], splat (i32 -1) +// DXCHECK-NEXT: select <4 x i1> %cmp.i, <4 x i32> splat (i32 -1), <4 x i32> [[SUB]] +// CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> {{.*}} to <4 x i64> +// CHECK-NEXT: ret <4 x i64> [[ZEXT]] uint64_t4 test_firstbithigh_upcast(uint4 p0) { return firstbithigh(p0); } diff --git a/clang/test/SemaHLSL/BuiltIns/firstbithigh-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/firstbithigh-errors.hlsl index f99e606fc6562..1f70186c78ad9 100644 --- a/clang/test/SemaHLSL/BuiltIns/firstbithigh-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/firstbithigh-errors.hlsl @@ -12,7 +12,7 @@ int test_too_many_arg(int p0) { double test_int_builtin(double p0) { return firstbithigh(p0); - // expected-error@-1 {{call to 'firstbithigh' is ambiguous}} + // expected-error@-1 {{no matching function for call to 'firstbithigh'}} } double2 test_int_builtin_2(double2 p0) { From 96806a7ec35f0e46132801c201ef53969f09ca81 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Thu, 6 Nov 2025 10:46:53 -0800 Subject: [PATCH 34/71] [SLP]Gather copyable node, if its parent is copyable, but this node is still used outside of the block only If the current node is a copyable node and its parent is copyable too and still current node is only used outside, better to cancel scheduling for such node, because otherwise there might be wrong def-use chain built during vectorization. Fixes #166775 --- .../Transforms/Vectorize/SLPVectorizer.cpp | 9 +++++ .../X86/copyable-child-node-used-outside.ll | 37 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/copyable-child-node-used-outside.ll diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index bf3f52c51b64c..df835a077f2a0 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -20996,6 +20996,15 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef VL, BoUpSLP *SLP, return false; })) return std::nullopt; + if (S.areInstructionsWithCopyableElements() && EI && EI.UserTE->hasState() && + EI.UserTE->hasCopyableElements() && + EI.UserTE->getMainOp()->getParent() == S.getMainOp()->getParent() && + all_of(VL, [&](Value *V) { + if (S.isCopyableElement(V)) + return true; + return isUsedOutsideBlock(V); + })) + return std::nullopt; bool HasCopyables = S.areInstructionsWithCopyableElements(); if (((!HasCopyables && doesNotNeedToSchedule(VL)) || all_of(VL, [&](Value *V) { return S.isNonSchedulable(V); }))) { diff --git a/llvm/test/Transforms/SLPVectorizer/X86/copyable-child-node-used-outside.ll b/llvm/test/Transforms/SLPVectorizer/X86/copyable-child-node-used-outside.ll new file mode 100644 index 0000000000000..65975199e46b8 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/copyable-child-node-used-outside.ll @@ -0,0 +1,37 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -passes=slp-vectorizer -S -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +define <4 x i32> @test() { +; CHECK-LABEL: define <4 x i32> @test() { +; CHECK-NEXT: [[BB:.*:]] +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 0 to i32 +; CHECK-NEXT: br label %[[BB1:.*]] +; CHECK: [[BB1]]: +; CHECK-NEXT: [[OR:%.*]] = or i32 [[TRUNC]], 0 +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 [[TRUNC]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[TMP0]], i32 0, i32 1 +; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> +; CHECK-NEXT: [[TMP3:%.*]] = or <4 x i32> [[TMP2]], zeroinitializer +; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[OR]] to i64 +; CHECK-NEXT: br label %[[BB3:.*]] +; CHECK: [[BB3]]: +; CHECK-NEXT: ret <4 x i32> [[TMP3]] +; +bb: + %trunc = trunc i64 0 to i32 + br label %bb1 + +bb1: + %or = or i32 %trunc, 0 + %zext = zext i32 %or to i64 + %and = and i32 0, 0 + %or2 = or i32 %trunc, 0 + br label %bb3 + +bb3: + %0 = insertelement <4 x i32> zeroinitializer, i32 %trunc, i32 0 + %1 = insertelement <4 x i32> %0, i32 %and, i32 1 + %2 = insertelement <4 x i32> %1, i32 %or2, i32 2 + %3 = insertelement <4 x i32> %2, i32 %or, i32 3 + ret <4 x i32> %3 +} From b82c7e7819b3ef405838a82c6fda537d37a21dbf Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 6 Nov 2025 14:20:16 -0500 Subject: [PATCH 35/71] [C2y] Claim conformance to WG14 N3525 (#166824) The paper is ensuring that a static_assert operand can not be deferred until runtime; it must accept an integer constant expression which is resolved at compile time. Note, Clang extends what it considers to be a valid integer constant expression, so this also verifies the expected extension diagnostics. --- clang/test/C/C2y/n3525.c | 30 ++++++++++++++++++++++++++++++ clang/www/c_status.html | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 clang/test/C/C2y/n3525.c diff --git a/clang/test/C/C2y/n3525.c b/clang/test/C/C2y/n3525.c new file mode 100644 index 0000000000000..428df23c79ba2 --- /dev/null +++ b/clang/test/C/C2y/n3525.c @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -verify -std=c2y -Wall -pedantic %s +// RUN: %clang_cc1 -verify -std=c23 -Wall -pedantic %s + +/* WG14 N3525: Yes + * static_assert without UB + * + * Ensures that a static_assert declaration cannot defer to runtime; it must + * take an integer constant expression that is resolved at compile time. + * + * Note: implementations are free to extend what is a valid integer constant + * expression, and Clang (and GCC) does so. So this test is validating that + * we quietly accept a pasing assertion, loudly reject a failing assertion, and + * issue a pedantic diagnostic for the extension case. + */ + +static_assert(1); // Okay + +static_assert(0); // expected-error {{static assertion failed}} + +extern int a; +static_assert(1 || a); // expected-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}} + +static_assert(a); // expected-error {{static assertion expression is not an integral constant expression}} +static_assert(0 || a); // expected-error {{static assertion expression is not an integral constant expression}} + +// Note, there is no CodeGen test for this; we have existing tests for the ICE +// extension, so the pedantic warning is sufficient to verify we're not +// emitting code which reads 'a' in '1 || a' because of the folding, and +// there's no way to generate code for reading 'a' in '0 || a' because of the +// error. diff --git a/clang/www/c_status.html b/clang/www/c_status.html index 80a52f791dfcf..2c1f6f4140a91 100644 --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -344,7 +344,7 @@

C2y implementation status

static_assert without UB N3525 - Unknown + Yes Allow calling static inline within extern inline From 4a7d3dfca0ef3ef12e9fcaa7d7603433947c6252 Mon Sep 17 00:00:00 2001 From: jiang1997 Date: Fri, 7 Nov 2025 03:33:47 +0800 Subject: [PATCH 36/71] [mlir] Introduce AlignmentAttrOpInterface to expose MaybeAlign (#161440) Introduce a common interface for operations with alignment attributes across MemRef, Vector, and SPIRV dialects. The interface exposes getMaybeAlign() to retrieve alignment as llvm::MaybeAlign. This is the second part of the PRs addressing issue #155677. Co-authored-by: Erick Ochoa Lopez --- mlir/include/mlir/Dialect/MemRef/IR/MemRef.h | 1 + .../mlir/Dialect/MemRef/IR/MemRefOps.td | 18 +++-- .../SPIRV/IR/SPIRVCooperativeMatrixOps.td | 6 +- .../mlir/Dialect/SPIRV/IR/SPIRVMemoryOps.td | 8 ++- mlir/include/mlir/Dialect/SPIRV/IR/SPIRVOps.h | 1 + .../mlir/Dialect/Vector/IR/VectorOps.h | 1 + .../mlir/Dialect/Vector/IR/VectorOps.td | 35 +++++++--- .../mlir/Interfaces/AlignmentAttrInterface.h | 21 ++++++ .../mlir/Interfaces/AlignmentAttrInterface.td | 65 +++++++++++++++++++ mlir/include/mlir/Interfaces/CMakeLists.txt | 1 + .../lib/Interfaces/AlignmentAttrInterface.cpp | 13 ++++ mlir/lib/Interfaces/CMakeLists.txt | 2 + mlir/test/Dialect/MemRef/invalid.mlir | 16 +++++ 13 files changed, 168 insertions(+), 20 deletions(-) create mode 100644 mlir/include/mlir/Interfaces/AlignmentAttrInterface.h create mode 100644 mlir/include/mlir/Interfaces/AlignmentAttrInterface.td create mode 100644 mlir/lib/Interfaces/AlignmentAttrInterface.cpp diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRef.h b/mlir/include/mlir/Dialect/MemRef/IR/MemRef.h index 69447f74ec403..b7abcdea10a2a 100644 --- a/mlir/include/mlir/Dialect/MemRef/IR/MemRef.h +++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRef.h @@ -13,6 +13,7 @@ #include "mlir/Dialect/Arith/IR/Arith.h" #include "mlir/Dialect/Utils/ReshapeOpsUtils.h" #include "mlir/IR/Dialect.h" +#include "mlir/Interfaces/AlignmentAttrInterface.h" #include "mlir/Interfaces/CallInterfaces.h" #include "mlir/Interfaces/CastInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td index e00f3c1526005..8965302a58c5d 100644 --- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td +++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td @@ -11,6 +11,7 @@ include "mlir/Dialect/Arith/IR/ArithBase.td" include "mlir/Dialect/MemRef/IR/MemRefBase.td" +include "mlir/Interfaces/AlignmentAttrInterface.td" include "mlir/Interfaces/CastInterfaces.td" include "mlir/Interfaces/ControlFlowInterfaces.td" include "mlir/Interfaces/InferIntRangeInterface.td" @@ -65,15 +66,15 @@ class AllocLikeOp traits = []> : MemRef_Op ], traits)> { let arguments = (ins Variadic:$dynamicSizes, // The symbolic operands (the ones in square brackets) // bind to the symbols of the memref's layout map. Variadic:$symbolOperands, - ConfinedAttr, - [IntMinValue<0>]>:$alignment); + OptionalAttr>:$alignment); let results = (outs Res]>:$memref); @@ -269,7 +270,8 @@ def MemRef_AllocOp : AllocLikeOp<"alloc", DefaultResource, [ //===----------------------------------------------------------------------===// -def MemRef_ReallocOp : MemRef_Op<"realloc"> { +def MemRef_ReallocOp : MemRef_Op<"realloc", + [DeclareOpInterfaceMethods]> { let summary = "memory reallocation operation"; let description = [{ The `realloc` operation changes the size of a memory region. The memory @@ -335,8 +337,7 @@ def MemRef_ReallocOp : MemRef_Op<"realloc"> { let arguments = (ins Arg, "", [MemFreeAt<0, FullEffect>]>:$source, Optional:$dynamicResultSize, - ConfinedAttr, - [IntMinValue<0>]>:$alignment); + OptionalAttr>:$alignment); let results = (outs Res, "", [MemAlloc { +def MemRef_GlobalOp : MemRef_Op<"global", [Symbol, + DeclareOpInterfaceMethods]> { let summary = "declare or define a global memref variable"; let description = [{ The `memref.global` operation declares or defines a named global memref @@ -1235,6 +1237,7 @@ def LoadOp : MemRef_Op<"load", "memref", "result", "::llvm::cast($_self).getElementType()">, MemRefsNormalizable, + DeclareOpInterfaceMethods, DeclareOpInterfaceMethods, DeclareOpInterfaceMethods, DeclareOpInterfaceMethods]> { @@ -2010,6 +2013,7 @@ def MemRef_StoreOp : MemRef_Op<"store", "memref", "value", "::llvm::cast($_self).getElementType()">, MemRefsNormalizable, + DeclareOpInterfaceMethods, DeclareOpInterfaceMethods, DeclareOpInterfaceMethods, DeclareOpInterfaceMethods]> { diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCooperativeMatrixOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCooperativeMatrixOps.td index 827ac901d22de..e8124b8b0bed9 100644 --- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCooperativeMatrixOps.td +++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCooperativeMatrixOps.td @@ -16,6 +16,8 @@ #ifndef MLIR_DIALECT_SPIRV_IR_COOPERATIVE_MATRIX_OPS #define MLIR_DIALECT_SPIRV_IR_COOPERATIVE_MATRIX_OPS +include "mlir/Interfaces/AlignmentAttrInterface.td" + //===----------------------------------------------------------------------===// // SPV_KHR_cooperative_matrix extension ops. //===----------------------------------------------------------------------===// @@ -62,7 +64,7 @@ def SPIRV_KHRCooperativeMatrixLengthOp : // ----- -def SPIRV_KHRCooperativeMatrixLoadOp : SPIRV_KhrVendorOp<"CooperativeMatrixLoad", []> { +def SPIRV_KHRCooperativeMatrixLoadOp : SPIRV_KhrVendorOp<"CooperativeMatrixLoad", [DeclareOpInterfaceMethods]> { let summary = "Loads a cooperative matrix through a pointer"; let description = [{ @@ -148,7 +150,7 @@ def SPIRV_KHRCooperativeMatrixLoadOp : SPIRV_KhrVendorOp<"CooperativeMatrixLoad" // ----- -def SPIRV_KHRCooperativeMatrixStoreOp : SPIRV_KhrVendorOp<"CooperativeMatrixStore", []> { +def SPIRV_KHRCooperativeMatrixStoreOp : SPIRV_KhrVendorOp<"CooperativeMatrixStore", [DeclareOpInterfaceMethods]> { let summary = "Stores a cooperative matrix through a pointer"; let description = [{ diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVMemoryOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVMemoryOps.td index 6108decdb9706..0b3d70f80bed4 100644 --- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVMemoryOps.td +++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVMemoryOps.td @@ -15,6 +15,8 @@ #define MLIR_DIALECT_SPIRV_IR_MEMORY_OPS include "mlir/Dialect/SPIRV/IR/SPIRVBase.td" +include "mlir/Interfaces/AlignmentAttrInterface.td" + // ----- @@ -79,7 +81,7 @@ def SPIRV_AccessChainOp : SPIRV_Op<"AccessChain", [Pure]> { // ----- -def SPIRV_CopyMemoryOp : SPIRV_Op<"CopyMemory", []> { +def SPIRV_CopyMemoryOp : SPIRV_Op<"CopyMemory", [DeclareOpInterfaceMethods]> { let summary = [{ Copy from the memory pointed to by Source to the memory pointed to by Target. Both operands must be non-void pointers and having the same @@ -182,7 +184,7 @@ def SPIRV_InBoundsPtrAccessChainOp : SPIRV_Op<"InBoundsPtrAccessChain", [Pure]> // ----- -def SPIRV_LoadOp : SPIRV_Op<"Load", []> { +def SPIRV_LoadOp : SPIRV_Op<"Load", [DeclareOpInterfaceMethods]> { let summary = "Load through a pointer."; let description = [{ @@ -310,7 +312,7 @@ def SPIRV_PtrAccessChainOp : SPIRV_Op<"PtrAccessChain", [Pure]> { // ----- -def SPIRV_StoreOp : SPIRV_Op<"Store", []> { +def SPIRV_StoreOp : SPIRV_Op<"Store", [DeclareOpInterfaceMethods]> { let summary = "Store through a pointer."; let description = [{ diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVOps.h b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVOps.h index 2676e921c73fb..0e1f6e79a3670 100644 --- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVOps.h +++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVOps.h @@ -20,6 +20,7 @@ #include "mlir/Dialect/SPIRV/Interfaces/SPIRVImageInterfaces.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/OpImplementation.h" +#include "mlir/Interfaces/AlignmentAttrInterface.h" #include "mlir/Interfaces/CallInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/FunctionInterfaces.h" diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.h b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.h index bbf55f5d507e3..b3a0653b90765 100644 --- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.h +++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.h @@ -23,6 +23,7 @@ #include "mlir/IR/Dialect.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/PatternMatch.h" +#include "mlir/Interfaces/AlignmentAttrInterface.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/DestinationStyleOpInterface.h" #include "mlir/Interfaces/IndexingMapOpInterface.h" diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td index 6e15b1e7df606..43172ff2082df 100644 --- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td +++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td @@ -19,6 +19,7 @@ include "mlir/Dialect/Vector/Interfaces/MaskableOpInterface.td" include "mlir/Dialect/Vector/Interfaces/MaskingOpInterface.td" include "mlir/Dialect/Vector/IR/Vector.td" include "mlir/Dialect/Vector/IR/VectorAttributes.td" +include "mlir/Interfaces/AlignmentAttrInterface.td" include "mlir/Interfaces/ControlFlowInterfaces.td" include "mlir/Interfaces/DestinationStyleOpInterface.td" include "mlir/Interfaces/IndexingMapOpInterface.td" @@ -1653,7 +1654,8 @@ def Vector_TransferWriteOp : def Vector_LoadOp : Vector_Op<"load", [ DeclareOpInterfaceMethods, - DeclareOpInterfaceMethods + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods ]> { let summary = "reads an n-D slice of memory into an n-D vector"; let description = [{ @@ -1770,7 +1772,8 @@ def Vector_LoadOp : Vector_Op<"load", [ def Vector_StoreOp : Vector_Op<"store", [ DeclareOpInterfaceMethods, - DeclareOpInterfaceMethods + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods ]> { let summary = "writes an n-D vector to an n-D slice of memory"; let description = [{ @@ -1875,7 +1878,10 @@ def Vector_StoreOp : Vector_Op<"store", [ } def Vector_MaskedLoadOp : - Vector_Op<"maskedload", [DeclareOpInterfaceMethods]>, + Vector_Op<"maskedload", [ + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods + ]>, Arguments<(ins Arg:$base, Variadic:$indices, VectorOfNonZeroRankOf<[I1]>:$mask, @@ -1967,7 +1973,10 @@ def Vector_MaskedLoadOp : } def Vector_MaskedStoreOp : - Vector_Op<"maskedstore", [DeclareOpInterfaceMethods]>, + Vector_Op<"maskedstore", [ + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods + ]>, Arguments<(ins Arg:$base, Variadic:$indices, VectorOfNonZeroRankOf<[I1]>:$mask, @@ -2048,7 +2057,8 @@ def Vector_GatherOp : Vector_Op<"gather", [ DeclareOpInterfaceMethods, DeclareOpInterfaceMethods, - DeclareOpInterfaceMethods + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods ]>, Arguments<(ins Arg, "", [MemRead]>:$base, Variadic:$offsets, @@ -2151,7 +2161,10 @@ def Vector_GatherOp : } def Vector_ScatterOp : - Vector_Op<"scatter", [DeclareOpInterfaceMethods]>, + Vector_Op<"scatter", [ + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods + ]>, Arguments<(ins Arg:$base, Variadic:$offsets, VectorOfNonZeroRankOf<[AnyInteger, Index]>:$indices, @@ -2236,7 +2249,10 @@ def Vector_ScatterOp : } def Vector_ExpandLoadOp : - Vector_Op<"expandload", [DeclareOpInterfaceMethods]>, + Vector_Op<"expandload", [ + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods + ]>, Arguments<(ins Arg:$base, Variadic:$indices, FixedVectorOfNonZeroRankOf<[I1]>:$mask, @@ -2324,7 +2340,10 @@ def Vector_ExpandLoadOp : } def Vector_CompressStoreOp : - Vector_Op<"compressstore", [DeclareOpInterfaceMethods]>, + Vector_Op<"compressstore", [ + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods + ]>, Arguments<(ins Arg:$base, Variadic:$indices, FixedVectorOfNonZeroRankOf<[I1]>:$mask, diff --git a/mlir/include/mlir/Interfaces/AlignmentAttrInterface.h b/mlir/include/mlir/Interfaces/AlignmentAttrInterface.h new file mode 100644 index 0000000000000..5b52c22d4a824 --- /dev/null +++ b/mlir/include/mlir/Interfaces/AlignmentAttrInterface.h @@ -0,0 +1,21 @@ +//===- AlignmentAttrInterface.h - Alignment attribute interface -*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_H +#define MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_H + +#include "mlir/IR/OpDefinition.h" +#include "llvm/Support/Alignment.h" + +namespace mlir { +class MLIRContext; +} // namespace mlir + +#include "mlir/Interfaces/AlignmentAttrInterface.h.inc" + +#endif // MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_H diff --git a/mlir/include/mlir/Interfaces/AlignmentAttrInterface.td b/mlir/include/mlir/Interfaces/AlignmentAttrInterface.td new file mode 100644 index 0000000000000..931af6990f40a --- /dev/null +++ b/mlir/include/mlir/Interfaces/AlignmentAttrInterface.td @@ -0,0 +1,65 @@ +//===- AlignmentAttrInterface.td - Alignment attribute interface -*- tablegen -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines an interface for operations that expose an optional +// alignment attribute. +// +//===----------------------------------------------------------------------===// + +#ifndef MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_TD +#define MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_TD + +include "mlir/IR/OpBase.td" + +def AlignmentAttrOpInterface : OpInterface<"AlignmentAttrOpInterface"> { + let description = [{ + An interface for operations that carry an optional alignment attribute and + want to expose it as an `llvm::MaybeAlign` helper. + }]; + + let cppNamespace = "::mlir"; + + let methods = [ + InterfaceMethod<[{ + Returns the alignment encoded on the operation as an `llvm::MaybeAlign`. + Operations providing a differently named accessor can override the + default implementation. + }], + "::llvm::MaybeAlign", + "getMaybeAlign", + (ins), + [{ + // Defensive: trait implementations are expected to validate power-of-two + // alignments, but we still guard against accidental misuse. + auto alignmentOpt = $_op.getAlignment(); + if (!alignmentOpt || *alignmentOpt <= 0) + return ::llvm::MaybeAlign(); + uint64_t value = static_cast(*alignmentOpt); + if (!::llvm::isPowerOf2_64(value)) + return ::llvm::MaybeAlign(); + return ::llvm::MaybeAlign(value); + }] + > + ]; + + let extraTraitClassDeclaration = [{ + ::llvm::MaybeAlign getMaybeAlign() { + // Defensive: trait implementations are expected to validate power-of-two + // alignments, but we still guard against accidental misuse. + auto alignmentOpt = (*static_cast(this)).getAlignment(); + if (!alignmentOpt || *alignmentOpt <= 0) + return ::llvm::MaybeAlign(); + uint64_t value = static_cast(*alignmentOpt); + if (!::llvm::isPowerOf2_64(value)) + return ::llvm::MaybeAlign(); + return ::llvm::MaybeAlign(value); + } + }]; +} + +#endif // MLIR_INTERFACES_ALIGNMENTATTRINTERFACE_TD diff --git a/mlir/include/mlir/Interfaces/CMakeLists.txt b/mlir/include/mlir/Interfaces/CMakeLists.txt index 72ed046a1ba5d..eb96a68861116 100644 --- a/mlir/include/mlir/Interfaces/CMakeLists.txt +++ b/mlir/include/mlir/Interfaces/CMakeLists.txt @@ -1,3 +1,4 @@ +add_mlir_interface(AlignmentAttrInterface) add_mlir_interface(CallInterfaces) add_mlir_interface(CastInterfaces) add_mlir_interface(ControlFlowInterfaces) diff --git a/mlir/lib/Interfaces/AlignmentAttrInterface.cpp b/mlir/lib/Interfaces/AlignmentAttrInterface.cpp new file mode 100644 index 0000000000000..fe985adb5e79a --- /dev/null +++ b/mlir/lib/Interfaces/AlignmentAttrInterface.cpp @@ -0,0 +1,13 @@ +//===- AlignmentAttrInterface.cpp -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "mlir/Interfaces/AlignmentAttrInterface.h" + +using namespace mlir; + +#include "mlir/Interfaces/AlignmentAttrInterface.cpp.inc" diff --git a/mlir/lib/Interfaces/CMakeLists.txt b/mlir/lib/Interfaces/CMakeLists.txt index f96af02db0be7..ad3e2b61be418 100644 --- a/mlir/lib/Interfaces/CMakeLists.txt +++ b/mlir/lib/Interfaces/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_OPTIONAL_SOURCES + AlignmentAttrInterface.cpp CallInterfaces.cpp CastInterfaces.cpp ControlFlowInterfaces.cpp @@ -41,6 +42,7 @@ function(add_mlir_interface_library name) endfunction(add_mlir_interface_library) +add_mlir_interface_library(AlignmentAttrInterface) add_mlir_interface_library(CallInterfaces) add_mlir_interface_library(CastInterfaces) add_mlir_interface_library(ControlFlowInterfaces) diff --git a/mlir/test/Dialect/MemRef/invalid.mlir b/mlir/test/Dialect/MemRef/invalid.mlir index 5ff292058ccc1..d10651f363711 100644 --- a/mlir/test/Dialect/MemRef/invalid.mlir +++ b/mlir/test/Dialect/MemRef/invalid.mlir @@ -992,6 +992,22 @@ func.func @invalid_store_alignment(%memref: memref<4xi32>, %val: i32) { // ----- +func.func @invalid_alloc_alignment() { + // expected-error @below {{'memref.alloc' op attribute 'alignment' failed to satisfy constraint: 64-bit signless integer attribute whose value is positive and whose value is a power of two > 0}} + %0 = memref.alloc() {alignment = 3} : memref<4xf32> + return +} + +// ----- + +func.func @invalid_realloc_alignment(%src: memref<4xf32>) { + // expected-error @below {{'memref.realloc' op attribute 'alignment' failed to satisfy constraint: 64-bit signless integer attribute whose value is positive and whose value is a power of two > 0}} + %0 = memref.realloc %src {alignment = 7} : memref<4xf32> to memref<8xf32> + return +} + +// ----- + func.func @test_alloc_memref_map_rank_mismatch() { ^bb0: // expected-error@+1 {{memref layout mismatch between rank and affine map: 2 != 1}} From 71cb0bb8932e8a377c9bbce0b8618feb3764b844 Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Thu, 6 Nov 2025 11:37:42 -0800 Subject: [PATCH 37/71] [lldb/Target] Add SyntheticFrameProvider class (#166664) This patch introduces a new way to reconstruct the thread stackframe list. New `SyntheticFrameProvider` classes can lazy fetch a StackFrame at index using a provided StackFrameList. In can either be the real unwinder StackFrameList or we could also chain SyntheticFrameProviders to each others. This is the foundation work to implement ScriptedFrameProviders, which will come in a follow-up patch. Signed-off-by: Med Ismail Bennani Signed-off-by: Med Ismail Bennani --- lldb/include/lldb/Core/PluginManager.h | 18 ++ .../lldb/Target/SyntheticFrameProvider.h | 156 ++++++++++++++++++ lldb/include/lldb/lldb-forward.h | 3 + lldb/include/lldb/lldb-private-interfaces.h | 9 + lldb/source/Core/PluginManager.cpp | 55 ++++++ lldb/source/Target/CMakeLists.txt | 1 + lldb/source/Target/SyntheticFrameProvider.cpp | 100 +++++++++++ 7 files changed, 342 insertions(+) create mode 100644 lldb/include/lldb/Target/SyntheticFrameProvider.h create mode 100644 lldb/source/Target/SyntheticFrameProvider.cpp diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index aa60b7c6693ca..ab2ca58a88ddd 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -356,6 +356,24 @@ class PluginManager { GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, Debugger &debugger); + // SyntheticFrameProvider + static bool + RegisterPlugin(llvm::StringRef name, llvm::StringRef description, + SyntheticFrameProviderCreateInstance create_native_callback, + ScriptedFrameProviderCreateInstance create_scripted_callback); + + static bool + UnregisterPlugin(SyntheticFrameProviderCreateInstance create_callback); + + static bool + UnregisterPlugin(ScriptedFrameProviderCreateInstance create_callback); + + static SyntheticFrameProviderCreateInstance + GetSyntheticFrameProviderCreateCallbackForPluginName(llvm::StringRef name); + + static ScriptedFrameProviderCreateInstance + GetScriptedFrameProviderCreateCallbackAtIndex(uint32_t idx); + // StructuredDataPlugin /// Register a StructuredDataPlugin class along with optional diff --git a/lldb/include/lldb/Target/SyntheticFrameProvider.h b/lldb/include/lldb/Target/SyntheticFrameProvider.h new file mode 100644 index 0000000000000..61a492f356ece --- /dev/null +++ b/lldb/include/lldb/Target/SyntheticFrameProvider.h @@ -0,0 +1,156 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_TARGET_SYNTHETICFRAMEPROVIDER_H +#define LLDB_TARGET_SYNTHETICFRAMEPROVIDER_H + +#include "lldb/Core/PluginInterface.h" +#include "lldb/Target/StackFrameList.h" +#include "lldb/Target/ThreadSpec.h" +#include "lldb/Utility/ScriptedMetadata.h" +#include "lldb/Utility/Status.h" +#include "lldb/lldb-forward.h" +#include "llvm/Support/Error.h" + +#include +#include + +namespace lldb_private { + +/// This struct contains the metadata needed to instantiate a frame provider +/// and optional filters to control which threads it applies to. +struct SyntheticFrameProviderDescriptor { + /// Metadata for instantiating the provider (e.g. script class name and args). + lldb::ScriptedMetadataSP scripted_metadata_sp; + + /// Optional list of thread specifications to which this provider applies. + /// If empty, the provider applies to all threads. A thread matches if it + /// satisfies ANY of the specs in this vector (OR logic). + std::vector thread_specs; + + SyntheticFrameProviderDescriptor() = default; + + SyntheticFrameProviderDescriptor(lldb::ScriptedMetadataSP metadata_sp) + : scripted_metadata_sp(metadata_sp) {} + + SyntheticFrameProviderDescriptor(lldb::ScriptedMetadataSP metadata_sp, + const std::vector &specs) + : scripted_metadata_sp(metadata_sp), thread_specs(specs) {} + + /// Get the name of this descriptor (the scripted class name). + llvm::StringRef GetName() const { + return scripted_metadata_sp ? scripted_metadata_sp->GetClassName() : ""; + } + + /// Check if this descriptor applies to the given thread. + bool AppliesToThread(Thread &thread) const { + // If no thread specs specified, applies to all threads. + if (thread_specs.empty()) + return true; + + // Check if the thread matches any of the specs (OR logic). + for (const auto &spec : thread_specs) { + if (spec.ThreadPassesBasicTests(thread)) + return true; + } + return false; + } + + /// Check if this descriptor has valid metadata for script-based providers. + bool IsValid() const { return scripted_metadata_sp != nullptr; } + + void Dump(Stream *s) const; +}; + +/// Base class for all synthetic frame providers. +/// +/// Synthetic frame providers allow modifying or replacing the stack frames +/// shown for a thread. This is useful for: +/// - Providing frames for custom calling conventions or languages. +/// - Reconstructing missing frames from crash dumps or core files. +/// - Adding diagnostic or synthetic frames for debugging. +/// - Visualizing state machines or async execution contexts. +class SyntheticFrameProvider : public PluginInterface { +public: + /// Try to create a SyntheticFrameProvider instance for the given input + /// frames and descriptor. + /// + /// This method iterates through all registered SyntheticFrameProvider + /// plugins and returns the first one that can handle the given descriptor. + /// + /// \param[in] input_frames + /// The input stack frame list that this provider will transform. + /// This could be real unwound frames or output from another provider. + /// + /// \param[in] descriptor + /// The descriptor containing metadata for the provider. + /// + /// \return + /// A shared pointer to a SyntheticFrameProvider if one could be created, + /// otherwise an \a llvm::Error. + static llvm::Expected + CreateInstance(lldb::StackFrameListSP input_frames, + const SyntheticFrameProviderDescriptor &descriptor); + + /// Try to create a SyntheticFrameProvider instance for the given input + /// frames using a specific C++ plugin. + /// + /// This method directly invokes a specific SyntheticFrameProvider plugin + /// by name, bypassing the descriptor-based plugin iteration. This is useful + /// for C++ plugins that don't require scripted metadata. + /// + /// \param[in] input_frames + /// The input stack frame list that this provider will transform. + /// This could be real unwound frames or output from another provider. + /// + /// \param[in] plugin_name + /// The name of the plugin to use for creating the provider. + /// + /// \param[in] thread_specs + /// Optional list of thread specifications to which this provider applies. + /// If empty, the provider applies to all threads. + /// + /// \return + /// A shared pointer to a SyntheticFrameProvider if one could be created, + /// otherwise an \a llvm::Error. + static llvm::Expected + CreateInstance(lldb::StackFrameListSP input_frames, + llvm::StringRef plugin_name, + const std::vector &thread_specs = {}); + + ~SyntheticFrameProvider() override; + + /// Get a single stack frame at the specified index. + /// + /// This method is called lazily - frames are only created when requested. + /// The provider can access its input frames via GetInputFrames() if needed. + /// + /// \param[in] idx + /// The index of the frame to create. + /// + /// \return + /// An Expected containing the StackFrameSP if successful. Returns an + /// error when the index is beyond the last frame to signal the end of + /// the frame list. + virtual llvm::Expected GetFrameAtIndex(uint32_t idx) = 0; + + /// Get the thread associated with this provider. + Thread &GetThread() { return m_input_frames->GetThread(); } + + /// Get the input frames that this provider transforms. + lldb::StackFrameListSP GetInputFrames() const { return m_input_frames; } + +protected: + SyntheticFrameProvider(lldb::StackFrameListSP input_frames); + + lldb::StackFrameListSP m_input_frames; +}; + +} // namespace lldb_private + +#endif // LLDB_TARGET_SYNTHETICFRAMEPROVIDER_H diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index af5656b3dcad1..7af7cd8947531 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -235,6 +235,7 @@ class SymbolVendor; class Symtab; class SyntheticChildren; class SyntheticChildrenFrontEnd; +class SyntheticFrameProvider; class SystemRuntime; class Progress; class Target; @@ -411,6 +412,8 @@ typedef std::shared_ptr typedef std::shared_ptr ScriptInterpreterSP; typedef std::shared_ptr ScriptedFrameInterfaceSP; +typedef std::shared_ptr + SyntheticFrameProviderSP; typedef std::shared_ptr ScriptedMetadataSP; typedef std::unique_ptr ScriptedPlatformInterfaceUP; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 249b25c251ac2..2fe3af7c62e00 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -25,6 +25,7 @@ class Value; namespace lldb_private { class ScriptedInterfaceUsages; +struct SyntheticFrameProviderDescriptor; typedef lldb::ABISP (*ABICreateInstance)(lldb::ProcessSP process_sp, const ArchSpec &arch); typedef std::unique_ptr (*ArchitectureCreateInstance)( @@ -86,6 +87,14 @@ typedef lldb::RegisterTypeBuilderSP (*RegisterTypeBuilderCreateInstance)( Target &target); typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)( Debugger &debugger); +typedef llvm::Expected ( + *ScriptedFrameProviderCreateInstance)( + lldb::StackFrameListSP input_frames, + const lldb_private::SyntheticFrameProviderDescriptor &descriptor); +typedef llvm::Expected ( + *SyntheticFrameProviderCreateInstance)( + lldb::StackFrameListSP input_frames, + const std::vector &thread_specs); typedef SymbolFile *(*SymbolFileCreateInstance)(lldb::ObjectFileSP objfile_sp); typedef SymbolVendor *(*SymbolVendorCreateInstance)( const lldb::ModuleSP &module_sp, diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 588736715f817..4e3563cf419fe 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -1300,6 +1300,61 @@ PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, return none_instance(debugger); } +#pragma mark SyntheticFrameProvider + +typedef PluginInstance + SyntheticFrameProviderInstance; +typedef PluginInstance + ScriptedFrameProviderInstance; +typedef PluginInstances + SyntheticFrameProviderInstances; +typedef PluginInstances + ScriptedFrameProviderInstances; + +static SyntheticFrameProviderInstances &GetSyntheticFrameProviderInstances() { + static SyntheticFrameProviderInstances g_instances; + return g_instances; +} + +static ScriptedFrameProviderInstances &GetScriptedFrameProviderInstances() { + static ScriptedFrameProviderInstances g_instances; + return g_instances; +} + +bool PluginManager::RegisterPlugin( + llvm::StringRef name, llvm::StringRef description, + SyntheticFrameProviderCreateInstance create_native_callback, + ScriptedFrameProviderCreateInstance create_scripted_callback) { + if (create_native_callback) + return GetSyntheticFrameProviderInstances().RegisterPlugin( + name, description, create_native_callback); + else if (create_scripted_callback) + return GetScriptedFrameProviderInstances().RegisterPlugin( + name, description, create_scripted_callback); + return false; +} + +bool PluginManager::UnregisterPlugin( + SyntheticFrameProviderCreateInstance create_callback) { + return GetSyntheticFrameProviderInstances().UnregisterPlugin(create_callback); +} + +bool PluginManager::UnregisterPlugin( + ScriptedFrameProviderCreateInstance create_callback) { + return GetScriptedFrameProviderInstances().UnregisterPlugin(create_callback); +} + +SyntheticFrameProviderCreateInstance +PluginManager::GetSyntheticFrameProviderCreateCallbackForPluginName( + llvm::StringRef name) { + return GetSyntheticFrameProviderInstances().GetCallbackForName(name); +} + +ScriptedFrameProviderCreateInstance +PluginManager::GetScriptedFrameProviderCreateCallbackAtIndex(uint32_t idx) { + return GetScriptedFrameProviderInstances().GetCallbackAtIndex(idx); +} + #pragma mark StructuredDataPlugin struct StructuredDataPluginInstance diff --git a/lldb/source/Target/CMakeLists.txt b/lldb/source/Target/CMakeLists.txt index 8e6d51efad1f3..cff59049cdce5 100644 --- a/lldb/source/Target/CMakeLists.txt +++ b/lldb/source/Target/CMakeLists.txt @@ -38,6 +38,7 @@ add_lldb_library(lldbTarget RegisterNumber.cpp RemoteAwarePlatform.cpp ScriptedThreadPlan.cpp + SyntheticFrameProvider.cpp SectionLoadHistory.cpp SectionLoadList.cpp StackFrame.cpp diff --git a/lldb/source/Target/SyntheticFrameProvider.cpp b/lldb/source/Target/SyntheticFrameProvider.cpp new file mode 100644 index 0000000000000..241ce82c39be3 --- /dev/null +++ b/lldb/source/Target/SyntheticFrameProvider.cpp @@ -0,0 +1,100 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Target/SyntheticFrameProvider.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Target/Thread.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" +#include "lldb/Utility/Status.h" + +using namespace lldb; +using namespace lldb_private; + +SyntheticFrameProvider::SyntheticFrameProvider(StackFrameListSP input_frames) + : m_input_frames(std::move(input_frames)) {} + +SyntheticFrameProvider::~SyntheticFrameProvider() = default; + +void SyntheticFrameProviderDescriptor::Dump(Stream *s) const { + if (!s) + return; + + s->Printf(" Name: %s\n", GetName().str().c_str()); + + // Show thread filter information. + if (thread_specs.empty()) { + s->PutCString(" Thread Filter: (applies to all threads)\n"); + } else { + s->Printf(" Thread Filter: %zu specification(s)\n", thread_specs.size()); + for (size_t i = 0; i < thread_specs.size(); ++i) { + const ThreadSpec &spec = thread_specs[i]; + s->Printf(" [%zu] ", i); + spec.GetDescription(s, lldb::eDescriptionLevelVerbose); + s->PutChar('\n'); + } + } +} + +llvm::Expected SyntheticFrameProvider::CreateInstance( + StackFrameListSP input_frames, + const SyntheticFrameProviderDescriptor &descriptor) { + if (!input_frames) + return llvm::createStringError( + "cannot create synthetic frame provider: invalid input frames"); + + // Iterate through all registered ScriptedFrameProvider plugins. + ScriptedFrameProviderCreateInstance create_callback = nullptr; + for (uint32_t idx = 0; + (create_callback = + PluginManager::GetScriptedFrameProviderCreateCallbackAtIndex( + idx)) != nullptr; + ++idx) { + auto provider_or_err = create_callback(input_frames, descriptor); + if (!provider_or_err) { + LLDB_LOG_ERROR(GetLog(LLDBLog::Target), provider_or_err.takeError(), + "Failed to create synthetic frame provider: {0}"); + continue; + } + + if (auto frame_provider_up = std::move(*provider_or_err)) + return std::move(frame_provider_up); + } + + return llvm::createStringError( + "cannot create synthetic frame provider: no suitable plugin found"); +} + +llvm::Expected SyntheticFrameProvider::CreateInstance( + StackFrameListSP input_frames, llvm::StringRef plugin_name, + const std::vector &thread_specs) { + if (!input_frames) + return llvm::createStringError( + "cannot create synthetic frame provider: invalid input frames"); + + // Look up the specific C++ plugin by name. + SyntheticFrameProviderCreateInstance create_callback = + PluginManager::GetSyntheticFrameProviderCreateCallbackForPluginName( + plugin_name); + + if (!create_callback) + return llvm::createStringError( + "cannot create synthetic frame provider: C++ plugin '%s' not found", + plugin_name.str().c_str()); + + auto provider_or_err = create_callback(input_frames, thread_specs); + if (!provider_or_err) + return provider_or_err.takeError(); + + if (auto frame_provider_sp = std::move(*provider_or_err)) + return std::move(frame_provider_sp); + + return llvm::createStringError( + "cannot create synthetic frame provider: C++ plugin '%s' returned null", + plugin_name.str().c_str()); +} From f1bf0b02ae259d31d2d67750e10d5efcc56d08c5 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Thu, 6 Nov 2025 11:38:15 -0800 Subject: [PATCH 38/71] [lldb] Make it so not finding and SDK doesn't look like an error (#166676) There may be valid reasons for not being able to find an SDK. Right now, it's printed as an error, which is causing confusion for users that interpret the error as something fatal, and not something that can be ignored. rdar://155346799 --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp | 2 +- .../Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp index 4cfb0a81dc6e4..887748b9e9c85 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -90,7 +90,7 @@ void PlatformAppleSimulator::GetStatus(Stream &strm) { if (!sdk.empty()) strm << " SDK Path: \"" << sdk << "\"\n"; else - strm << " SDK Path: error: unable to locate SDK\n"; + strm << " SDK Path: \n"; #if defined(__APPLE__) // This will get called by subclasses, so just output status on the current diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp index b83d07b19235c..7b524d27b5221 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp @@ -53,7 +53,7 @@ void PlatformRemoteDarwinDevice::GetStatus(Stream &strm) { if (sdk_directory) strm.Printf(" SDK Path: \"%s\"\n", sdk_directory); else - strm.PutCString(" SDK Path: error: unable to locate SDK\n"); + strm.PutCString(" SDK Path: \n"); const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); for (uint32_t i = 0; i < num_sdk_infos; ++i) { From d2f75f2fe3261264bb4692368aab64aaafb30f08 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov Date: Thu, 6 Nov 2025 09:39:18 -1000 Subject: [PATCH 39/71] [clang] SFINAE context refactor (#164703) This teases the SFINAE handling bits out of the CodeSynthesisContext, and moves that functionality into SFINAETrap and a new class. There is also a small performance benefit here: image --- clang/include/clang/Sema/Sema.h | 131 ++++++------- clang/lib/Sema/Sema.cpp | 42 ++-- clang/lib/Sema/SemaAMDGPU.cpp | 2 + clang/lib/Sema/SemaConcept.cpp | 58 +++--- clang/lib/Sema/SemaExpr.cpp | 16 +- clang/lib/Sema/SemaTemplate.cpp | 30 +-- clang/lib/Sema/SemaTemplateDeduction.cpp | 130 +++++-------- clang/lib/Sema/SemaTemplateDeductionGuide.cpp | 1 + clang/lib/Sema/SemaTemplateInstantiate.cpp | 182 ++++-------------- .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 9 +- clang/lib/Sema/SemaTemplateVariadic.cpp | 11 +- clang/lib/Sema/TreeTransform.h | 20 +- clang/test/SemaCXX/attr-mode-tmpl.cpp | 2 +- clang/test/SemaCXX/cxx23-assume.cpp | 13 +- clang/test/SemaTemplate/temp_arg_nontype.cpp | 3 +- .../SemaTemplate/temp_arg_nontype_cxx11.cpp | 2 +- 16 files changed, 264 insertions(+), 388 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index eb8d7d1112016..0470645a9e7ad 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11309,9 +11309,6 @@ class Sema final : public SemaBase { InventedParameterInfos.end()); } - /// The number of SFINAE diagnostics that have been trapped. - unsigned NumSFINAEErrors; - ArrayRef getFunctionScopes() const { return llvm::ArrayRef(FunctionScopes.begin() + FunctionScopesStart, FunctionScopes.end()); @@ -12385,49 +12382,65 @@ class Sema final : public SemaBase { ///@{ public: - /// When true, access checking violations are treated as SFINAE - /// failures rather than hard errors. - bool AccessCheckingSFINAE; + class SFINAETrap; + + struct SFINAEContextBase { + SFINAEContextBase(Sema &S, SFINAETrap *Cur) + : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {} + + protected: + Sema &S; + ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; } + + private: + SFINAETrap *Prev; + }; + + struct NonSFINAEContext : SFINAEContextBase { + NonSFINAEContext(Sema &S) : SFINAEContextBase(S, nullptr) {} + }; /// RAII class used to determine whether SFINAE has /// trapped any errors that occur during template argument /// deduction. - class SFINAETrap { - Sema &SemaRef; - unsigned PrevSFINAEErrors; - bool PrevInNonInstantiationSFINAEContext; - bool PrevAccessCheckingSFINAE; - bool PrevLastDiagnosticIgnored; + class SFINAETrap : SFINAEContextBase { + bool HasErrorOcurred = false; + bool WithAccessChecking = false; + bool PrevLastDiagnosticIgnored = + S.getDiagnostics().isLastDiagnosticIgnored(); + sema::TemplateDeductionInfo *DeductionInfo = nullptr; + + SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info, + bool WithAccessChecking) + : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking), + DeductionInfo(Info) {} public: - /// \param ForValidityCheck If true, discard all diagnostics (from the + /// \param WithAccessChecking If true, discard all diagnostics (from the /// immediate context) instead of adding them to the currently active - /// \ref TemplateDeductionInfo (as returned by \ref isSFINAEContext). - explicit SFINAETrap(Sema &SemaRef, bool ForValidityCheck = false) - : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors), - PrevInNonInstantiationSFINAEContext( - SemaRef.InNonInstantiationSFINAEContext), - PrevAccessCheckingSFINAE(SemaRef.AccessCheckingSFINAE), - PrevLastDiagnosticIgnored( - SemaRef.getDiagnostics().isLastDiagnosticIgnored()) { - if (ForValidityCheck || !SemaRef.isSFINAEContext()) - SemaRef.InNonInstantiationSFINAEContext = true; - SemaRef.AccessCheckingSFINAE = ForValidityCheck; - } + /// \ref TemplateDeductionInfo. + explicit SFINAETrap(Sema &S, bool WithAccessChecking = false) + : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {} + + SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info) + : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {} ~SFINAETrap() { - SemaRef.NumSFINAEErrors = PrevSFINAEErrors; - SemaRef.InNonInstantiationSFINAEContext = - PrevInNonInstantiationSFINAEContext; - SemaRef.AccessCheckingSFINAE = PrevAccessCheckingSFINAE; - SemaRef.getDiagnostics().setLastDiagnosticIgnored( - PrevLastDiagnosticIgnored); + S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored); } - /// Determine whether any SFINAE errors have been trapped. - bool hasErrorOccurred() const { - return SemaRef.NumSFINAEErrors > PrevSFINAEErrors; + SFINAETrap(const SFINAETrap &) = delete; + SFINAETrap &operator=(const SFINAETrap &) = delete; + + sema::TemplateDeductionInfo *getDeductionInfo() const { + return DeductionInfo; } + + /// Determine whether any SFINAE errors have been trapped. + bool hasErrorOccurred() const { return HasErrorOcurred; } + void setErrorOccurred() { HasErrorOcurred = true; } + + bool withAccessChecking() const { return WithAccessChecking; } }; /// RAII class used to indicate that we are performing provisional @@ -13148,9 +13161,6 @@ class Sema final : public SemaBase { PartialOrderingTTP, } Kind; - /// Was the enclosing context a non-instantiation SFINAE context? - bool SavedInNonInstantiationSFINAEContext; - /// Whether we're substituting into constraints. bool InConstraintSubstitution; @@ -13195,22 +13205,15 @@ class Sema final : public SemaBase { return {TemplateArgs, NumTemplateArgs}; } - /// The template deduction info object associated with the - /// substitution or checking of explicit or deduced template arguments. - sema::TemplateDeductionInfo *DeductionInfo; - /// The source range that covers the construct that cause /// the instantiation, e.g., the template-id that causes a class /// template instantiation. SourceRange InstantiationRange; CodeSynthesisContext() - : Kind(TemplateInstantiation), - SavedInNonInstantiationSFINAEContext(false), - InConstraintSubstitution(false), + : Kind(TemplateInstantiation), InConstraintSubstitution(false), InParameterMappingSubstitution(false), Entity(nullptr), - Template(nullptr), TemplateArgs(nullptr), NumTemplateArgs(0), - DeductionInfo(nullptr) {} + Template(nullptr), TemplateArgs(nullptr), NumTemplateArgs(0) {} /// Determines whether this template is an actual instantiation /// that should be counted toward the maximum instantiation depth. @@ -13262,7 +13265,6 @@ class Sema final : public SemaBase { FunctionTemplateDecl *FunctionTemplate, ArrayRef TemplateArgs, CodeSynthesisContext::SynthesisKind Kind, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange = SourceRange()); /// Note that we are instantiating as part of template @@ -13270,7 +13272,6 @@ class Sema final : public SemaBase { InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template, ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange = SourceRange()); /// Note that we are instantiating as part of template @@ -13279,7 +13280,6 @@ class Sema final : public SemaBase { InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, ClassTemplatePartialSpecializationDecl *PartialSpec, ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange = SourceRange()); /// Note that we are instantiating as part of template @@ -13288,7 +13288,6 @@ class Sema final : public SemaBase { InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, VarTemplatePartialSpecializationDecl *PartialSpec, ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange = SourceRange()); /// Note that we are instantiating a default argument for a function @@ -13334,7 +13333,6 @@ class Sema final : public SemaBase { /// concept. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, ConstraintSubstitution, NamedDecl *Template, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange); struct ConstraintNormalization {}; @@ -13354,7 +13352,6 @@ class Sema final : public SemaBase { /// a requirement of a requires expression. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, concepts::Requirement *Req, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange = SourceRange()); /// \brief Note that we are checking the satisfaction of the constraint @@ -13366,7 +13363,6 @@ class Sema final : public SemaBase { /// \brief Note that we are checking a requires clause. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, const RequiresExpr *E, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange); struct BuildingDeductionGuidesTag {}; @@ -13399,8 +13395,7 @@ class Sema final : public SemaBase { SourceLocation PointOfInstantiation, SourceRange InstantiationRange, Decl *Entity, NamedDecl *Template = nullptr, - ArrayRef TemplateArgs = {}, - sema::TemplateDeductionInfo *DeductionInfo = nullptr); + ArrayRef TemplateArgs = {}); InstantiatingTemplate(const InstantiatingTemplate &) = delete; @@ -13541,12 +13536,7 @@ class Sema final : public SemaBase { /// recent visible declaration of that namespace. llvm::DenseMap VisibleNamespaceCache; - /// Whether we are in a SFINAE context that is not associated with - /// template instantiation. - /// - /// This is used when setting up a SFINAE trap (\c see SFINAETrap) outside - /// of a template instantiation or template argument deduction. - bool InNonInstantiationSFINAEContext; + SFINAETrap *CurrentSFINAEContext = nullptr; /// The number of \p CodeSynthesisContexts that are not template /// instantiations and, therefore, should not be counted as part of the @@ -13617,15 +13607,13 @@ class Sema final : public SemaBase { PrintInstantiationStack(getDefaultDiagFunc()); } - /// Determines whether we are currently in a context where - /// template argument substitution failures are not considered - /// errors. - /// - /// \returns An empty \c Optional if we're not in a SFINAE context. - /// Otherwise, contains a pointer that, if non-NULL, contains the nearest - /// template-deduction context object, which can be used to capture - /// diagnostics that will be suppressed. - std::optional isSFINAEContext() const; + /// Returns a pointer to the current SFINAE context, if any. + [[nodiscard]] SFINAETrap *getSFINAEContext() const { + return CurrentSFINAEContext; + } + [[nodiscard]] bool isSFINAEContext() const { + return CurrentSFINAEContext != nullptr; + } /// Perform substitution on the type T with a given set of template /// arguments. @@ -14637,7 +14625,8 @@ class Sema final : public SemaBase { ArrayRef Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, - bool &RetainExpansion, UnsignedOrNone &NumExpansions); + bool &RetainExpansion, UnsignedOrNone &NumExpansions, + bool Diagnose = true); /// Determine the number of arguments in the given pack expansion /// type. diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 23bf7f217a01a..46addea232b03 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -321,9 +321,8 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, static_cast(ComparisonCategoryType::Last) + 1), StdSourceLocationImplDecl(nullptr), CXXTypeInfoDecl(nullptr), GlobalNewDeleteDeclared(false), DisableTypoCorrection(false), - TyposCorrected(0), IsBuildingRecoveryCallExpr(false), NumSFINAEErrors(0), - AccessCheckingSFINAE(false), CurrentInstantiationScope(nullptr), - InNonInstantiationSFINAEContext(false), NonInstantiationEntries(0), + TyposCorrected(0), IsBuildingRecoveryCallExpr(false), + CurrentInstantiationScope(nullptr), NonInstantiationEntries(0), ArgPackSubstIndex(std::nullopt), SatisfactionCache(Context) { assert(pp.TUKind == TUKind); TUScope = nullptr; @@ -670,7 +669,9 @@ void Sema::addExternalSource(IntrusiveRefCntPtr E) { void Sema::PrintStats() const { llvm::errs() << "\n*** Semantic Analysis Stats:\n"; - llvm::errs() << NumSFINAEErrors << " SFINAE diagnostics trapped.\n"; + if (SFINAETrap *Trap = getSFINAEContext()) + llvm::errs() << int(Trap->hasErrorOccurred()) + << " SFINAE diagnostics trapped.\n"; BumpAlloc.PrintStats(); AnalysisWarnings.PrintStats(); @@ -1681,7 +1682,8 @@ void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) { // issue I am not seeing yet), then there should at least be a clarifying // comment somewhere. Diagnostic DiagInfo(&Diags, DB); - if (std::optional Info = isSFINAEContext()) { + if (SFINAETrap *Trap = getSFINAEContext()) { + sema::TemplateDeductionInfo *Info = Trap->getDeductionInfo(); switch (DiagnosticIDs::getDiagnosticSFINAEResponse(DiagInfo.getID())) { case DiagnosticIDs::SFINAE_Report: // We'll report the diagnostic below. @@ -1690,37 +1692,37 @@ void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) { case DiagnosticIDs::SFINAE_SubstitutionFailure: // Count this failure so that we know that template argument deduction // has failed. - ++NumSFINAEErrors; + Trap->setErrorOccurred(); // Make a copy of this suppressed diagnostic and store it with the // template-deduction information. - if (*Info && !(*Info)->hasSFINAEDiagnostic()) { - (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(), - PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); - } + if (Info && !Info->hasSFINAEDiagnostic()) + Info->addSFINAEDiagnostic( + DiagInfo.getLocation(), + PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); Diags.setLastDiagnosticIgnored(true); return; case DiagnosticIDs::SFINAE_AccessControl: { // Per C++ Core Issue 1170, access control is part of SFINAE. - // Additionally, the AccessCheckingSFINAE flag can be used to temporarily + // Additionally, the WithAccessChecking flag can be used to temporarily // make access control a part of SFINAE for the purposes of checking // type traits. - if (!AccessCheckingSFINAE && !getLangOpts().CPlusPlus11) + if (!Trap->withAccessChecking() && !getLangOpts().CPlusPlus11) break; SourceLocation Loc = DiagInfo.getLocation(); // Suppress this diagnostic. - ++NumSFINAEErrors; + Trap->setErrorOccurred(); // Make a copy of this suppressed diagnostic and store it with the // template-deduction information. - if (*Info && !(*Info)->hasSFINAEDiagnostic()) { - (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(), - PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); - } + if (Info && !Info->hasSFINAEDiagnostic()) + Info->addSFINAEDiagnostic( + DiagInfo.getLocation(), + PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); Diags.setLastDiagnosticIgnored(true); @@ -1740,13 +1742,13 @@ void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) { return; // Make a copy of this suppressed diagnostic and store it with the // template-deduction information; - if (*Info) { - (*Info)->addSuppressedDiagnostic( + if (Info) { + Info->addSuppressedDiagnostic( DiagInfo.getLocation(), PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); if (!Diags.getDiagnosticIDs()->isNote(DiagID)) PrintContextStack([Info](SourceLocation Loc, PartialDiagnostic PD) { - (*Info)->addSuppressedDiagnostic(Loc, std::move(PD)); + Info->addSuppressedDiagnostic(Loc, std::move(PD)); }); } diff --git a/clang/lib/Sema/SemaAMDGPU.cpp b/clang/lib/Sema/SemaAMDGPU.cpp index 139c4abc040df..cece22092bb14 100644 --- a/clang/lib/Sema/SemaAMDGPU.cpp +++ b/clang/lib/Sema/SemaAMDGPU.cpp @@ -558,6 +558,8 @@ AMDGPUMaxNumWorkGroupsAttr *SemaAMDGPU::CreateAMDGPUMaxNumWorkGroupsAttr( const AttributeCommonInfo &CI, Expr *XExpr, Expr *YExpr, Expr *ZExpr) { ASTContext &Context = getASTContext(); AMDGPUMaxNumWorkGroupsAttr TmpAttr(Context, CI, XExpr, YExpr, ZExpr); + assert(!SemaRef.isSFINAEContext() && + "Can't produce SFINAE diagnostic pointing to temporary attribute"); if (checkAMDGPUMaxNumWorkGroupsArguments(SemaRef, XExpr, YExpr, ZExpr, TmpAttr)) diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index fb4d0b4582684..883e3410a35e0 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -526,12 +526,12 @@ ExprResult ConstraintSatisfactionChecker::EvaluateAtomicConstraint( S, AtomicExpr->getBeginLoc(), Sema::InstantiatingTemplate::ConstraintSubstitution{}, // FIXME: improve const-correctness of InstantiatingTemplate - const_cast(Template), Info, AtomicExpr->getSourceRange()); + const_cast(Template), AtomicExpr->getSourceRange()); if (Inst.isInvalid()) return ExprError(); // We do not want error diagnostics escaping here. - Sema::SFINAETrap Trap(S); + Sema::SFINAETrap Trap(S, Info); SubstitutedExpression = S.SubstConstraintExpr(const_cast(AtomicExpr), MLTAL); @@ -599,16 +599,15 @@ ConstraintSatisfactionChecker::SubstitutionInTemplateArguments( return MultiLevelTemplateArgumentList(); TemplateDeductionInfo Info(Constraint.getBeginLoc()); + Sema::SFINAETrap Trap(S, Info); Sema::InstantiatingTemplate Inst( S, Constraint.getBeginLoc(), Sema::InstantiatingTemplate::ConstraintSubstitution{}, // FIXME: improve const-correctness of InstantiatingTemplate - const_cast(Template), Info, Constraint.getSourceRange()); + const_cast(Template), Constraint.getSourceRange()); if (Inst.isInvalid()) return std::nullopt; - Sema::SFINAETrap Trap(S); - TemplateArgumentListInfo SubstArgs; Sema::ArgPackSubstIndexRAII SubstIndex( S, Constraint.getPackSubstitutionIndex() @@ -778,9 +777,6 @@ ConstraintSatisfactionChecker::EvaluateFoldExpandedConstraintSize( const FoldExpandedConstraint &FE, const MultiLevelTemplateArgumentList &MLTAL) { - // We should ignore errors in the presence of packs of different size. - Sema::SFINAETrap Trap(S); - Expr *Pattern = const_cast(FE.getPattern()); SmallVector Unexpanded; @@ -792,18 +788,12 @@ ConstraintSatisfactionChecker::EvaluateFoldExpandedConstraintSize( if (S.CheckParameterPacksForExpansion( Pattern->getExprLoc(), Pattern->getSourceRange(), Unexpanded, MLTAL, /*FailOnPackProducingTemplates=*/false, Expand, RetainExpansion, - NumExpansions) || + NumExpansions, /*Diagnose=*/false) || !Expand || RetainExpansion) return std::nullopt; - if (NumExpansions && S.getLangOpts().BracketDepth < *NumExpansions) { - S.Diag(Pattern->getExprLoc(), - clang::diag::err_fold_expression_limit_exceeded) - << *NumExpansions << S.getLangOpts().BracketDepth - << Pattern->getSourceRange(); - S.Diag(Pattern->getExprLoc(), diag::note_bracket_depth); + if (NumExpansions && S.getLangOpts().BracketDepth < *NumExpansions) return std::nullopt; - } return NumExpansions; } @@ -921,7 +911,6 @@ ExprResult ConstraintSatisfactionChecker::EvaluateSlow( return ExprError(); } - Sema::SFINAETrap Trap(S); Sema::ArgPackSubstIndexRAII SubstIndex( S, Constraint.getPackSubstitutionIndex() ? Constraint.getPackSubstitutionIndex() @@ -930,9 +919,10 @@ ExprResult ConstraintSatisfactionChecker::EvaluateSlow( const ASTTemplateArgumentListInfo *Ori = ConceptId->getTemplateArgsAsWritten(); TemplateDeductionInfo Info(TemplateNameLoc); - Sema::InstantiatingTemplate _( + Sema::SFINAETrap Trap(S, Info); + Sema::InstantiatingTemplate _2( S, TemplateNameLoc, Sema::InstantiatingTemplate::ConstraintSubstitution{}, - const_cast(Template), Info, Constraint.getSourceRange()); + const_cast(Template), Constraint.getSourceRange()); TemplateArgumentListInfo OutArgs(Ori->LAngleLoc, Ori->RAngleLoc); if (S.SubstTemplateArguments(Ori->arguments(), *SubstitutedArgs, OutArgs) || @@ -1142,13 +1132,21 @@ static bool CheckConstraintSatisfaction( if (TemplateArgsLists.getNumLevels() != 0) Args = TemplateArgsLists.getInnermost(); - std::optional SynthesisContext; - if (!TopLevelConceptId) { - SynthesisContext.emplace(S, TemplateIDRange.getBegin(), - Sema::InstantiatingTemplate::ConstraintsCheck{}, - const_cast(Template), Args, + struct SynthesisContextPair { + Sema::InstantiatingTemplate Inst; + Sema::NonSFINAEContext NSC; + SynthesisContextPair(Sema &S, NamedDecl *Template, + ArrayRef TemplateArgs, + SourceRange InstantiationRange) + : Inst(S, InstantiationRange.getBegin(), + Sema::InstantiatingTemplate::ConstraintsCheck{}, Template, + TemplateArgs, InstantiationRange), + NSC(S) {} + }; + std::optional SynthesisContext; + if (!TopLevelConceptId) + SynthesisContext.emplace(S, const_cast(Template), Args, TemplateIDRange); - } const NormalizedConstraint *C = S.getNormalizedAssociatedConstraints(Template, AssociatedConstraints); @@ -1478,8 +1476,7 @@ static const Expr *SubstituteConstraintExpressionWithoutSatisfaction( if (MLTAL.getNumSubstitutedLevels() == 0) return ConstrExpr; - Sema::SFINAETrap SFINAE(S); - + Sema::NonSFINAEContext _(S); Sema::InstantiatingTemplate Inst( S, DeclInfo.getLocation(), Sema::InstantiatingTemplate::ConstraintNormalization{}, @@ -1554,7 +1551,7 @@ static const Expr *SubstituteConstraintExpressionWithoutSatisfaction( Sema::ReuseLambdaContextDecl); ExprResult SubstConstr = S.SubstConstraintExprWithoutSatisfaction( const_cast(ConstrExpr), MLTAL); - if (SFINAE.hasErrorOccurred() || !SubstConstr.isUsable()) + if (!SubstConstr.isUsable()) return nullptr; return SubstConstr.get(); } @@ -2104,6 +2101,7 @@ bool SubstituteParameterMappings::substitute( InstLocBegin = SR.getBegin(); InstLocEnd = SR.getEnd(); } + Sema::NonSFINAEContext _(SemaRef); Sema::InstantiatingTemplate Inst( SemaRef, InstLocBegin, Sema::InstantiatingTemplate::ParameterMappingSubstitution{}, @@ -2171,6 +2169,7 @@ bool SubstituteParameterMappings::substitute(ConceptIdConstraint &CC) { InstLocBegin = SR.getBegin(); InstLocEnd = SR.getEnd(); } + Sema::NonSFINAEContext _(SemaRef); // This is useful for name lookup across modules; see Sema::getLookupModules. Sema::InstantiatingTemplate Inst( SemaRef, InstLocBegin, @@ -2311,6 +2310,7 @@ NormalizedConstraint *NormalizedConstraint::fromConstraintExpr( } else if (auto *CSE = dyn_cast(E)) { NormalizedConstraint *SubNF; { + Sema::NonSFINAEContext _(S); Sema::InstantiatingTemplate Inst( S, CSE->getExprLoc(), Sema::InstantiatingTemplate::ConstraintNormalization{}, @@ -2546,8 +2546,6 @@ bool Sema::MaybeEmitAmbiguousAtomicConstraintsDiagnostic( }; { - // The subsumption checks might cause diagnostics - SFINAETrap Trap(*this); auto *Normalized1 = getNormalizedAssociatedConstraints(D1, AC1); if (!Normalized1) return false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index a50c27610dc96..3eb935c833b87 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -12653,10 +12653,10 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, // This is a gcc extension compatibility comparison. // In a SFINAE context, we treat this as a hard error to maintain // conformance with the C++ standard. - diagnoseFunctionPointerToVoidComparison( - *this, Loc, LHS, RHS, /*isError*/ (bool)isSFINAEContext()); + bool IsError = isSFINAEContext(); + diagnoseFunctionPointerToVoidComparison(*this, Loc, LHS, RHS, IsError); - if (isSFINAEContext()) + if (IsError) return QualType(); RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast); @@ -14598,11 +14598,11 @@ QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) { unsigned AddressOfError = AO_No_Error; if (lval == Expr::LV_ClassTemporary || lval == Expr::LV_ArrayTemporary) { - bool sfinae = (bool)isSFINAEContext(); - Diag(OpLoc, isSFINAEContext() ? diag::err_typecheck_addrof_temporary - : diag::ext_typecheck_addrof_temporary) - << op->getType() << op->getSourceRange(); - if (sfinae) + bool IsError = isSFINAEContext(); + Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary + : diag::ext_typecheck_addrof_temporary) + << op->getType() << op->getSourceRange(); + if (IsError) return QualType(); // Materialize the temporary as an lvalue so that we can take its address. OrigOp = op = diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 983a7842ef450..4a9e1bc93b918 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3846,13 +3846,14 @@ QualType Sema::CheckTemplateIdType(ElaboratedTypeKeyword Keyword, // within enable_if in a SFINAE context, dig out the specific // enable_if condition that failed and present that instead. if (isEnableIfAliasTemplate(AliasTemplate)) { - if (auto DeductionInfo = isSFINAEContext()) { - if (*DeductionInfo && - (*DeductionInfo)->hasSFINAEDiagnostic() && - (*DeductionInfo)->peekSFINAEDiagnostic().second.getDiagID() == - diag::err_typename_nested_not_found_enable_if && - TemplateArgs[0].getArgument().getKind() - == TemplateArgument::Expression) { + if (SFINAETrap *Trap = getSFINAEContext(); + TemplateDeductionInfo *DeductionInfo = + Trap ? Trap->getDeductionInfo() : nullptr) { + if (DeductionInfo->hasSFINAEDiagnostic() && + DeductionInfo->peekSFINAEDiagnostic().second.getDiagID() == + diag::err_typename_nested_not_found_enable_if && + TemplateArgs[0].getArgument().getKind() == + TemplateArgument::Expression) { Expr *FailedCond; std::string FailedDescription; std::tie(FailedCond, FailedDescription) = @@ -3861,15 +3862,14 @@ QualType Sema::CheckTemplateIdType(ElaboratedTypeKeyword Keyword, // Remove the old SFINAE diagnostic. PartialDiagnosticAt OldDiag = {SourceLocation(), PartialDiagnostic::NullDiagnostic()}; - (*DeductionInfo)->takeSFINAEDiagnostic(OldDiag); + DeductionInfo->takeSFINAEDiagnostic(OldDiag); // Add a new SFINAE diagnostic specifying which condition // failed. - (*DeductionInfo)->addSFINAEDiagnostic( - OldDiag.first, - PDiag(diag::err_typename_nested_not_found_requirement) - << FailedDescription - << FailedCond->getSourceRange()); + DeductionInfo->addSFINAEDiagnostic( + OldDiag.first, + PDiag(diag::err_typename_nested_not_found_requirement) + << FailedDescription << FailedCond->getSourceRange()); } } } @@ -3955,6 +3955,7 @@ QualType Sema::CheckTemplateIdType(ElaboratedTypeKeyword Keyword, if (Decl->getSpecializationKind() == TSK_Undeclared && ClassTemplate->getTemplatedDecl()->hasAttrs()) { + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, TemplateLoc, Decl); if (!Inst.isInvalid()) { MultiLevelTemplateArgumentList TemplateArgLists(Template, @@ -5565,12 +5566,11 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &ArgLoc, auto checkExpr = [&](Expr *E) -> Expr * { TemplateArgument SugaredResult, CanonicalResult; - unsigned CurSFINAEErrors = NumSFINAEErrors; ExprResult Res = CheckTemplateArgument( NTTP, NTTPType, E, SugaredResult, CanonicalResult, /*StrictCheck=*/CTAI.MatchingTTP || CTAI.PartialOrdering, CTAK); // If the current template argument causes an error, give up now. - if (Res.isInvalid() || CurSFINAEErrors < NumSFINAEErrors) + if (Res.isInvalid()) return nullptr; CTAI.SugaredConverted.push_back(SugaredResult); CTAI.CanonicalConverted.push_back(CanonicalResult); diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 6964242b39d6e..a287319cc4f88 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -3239,10 +3239,6 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction( ArrayRef Ps, ArrayRef As, SmallVectorImpl &Deduced, TemplateDeductionInfo &Info, bool CopyDeducedArgs) { - // Unevaluated SFINAE context. - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::Unevaluated); - Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(Entity)); // C++ [temp.deduct.type]p2: @@ -3380,10 +3376,6 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction( Sema &S, TemplateDecl *TD, SmallVectorImpl &Deduced, TemplateDeductionInfo &Info) { - // Unevaluated SFINAE context. - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::Unevaluated); - Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(TD)); // C++ [temp.deduct.type]p2: @@ -3423,7 +3415,7 @@ DeduceTemplateArguments(Sema &S, T *Partial, // Unevaluated SFINAE context. EnterExpressionEvaluationContext Unevaluated( S, Sema::ExpressionEvaluationContext::Unevaluated); - Sema::SFINAETrap Trap(S); + Sema::SFINAETrap Trap(S, Info); // This deduction has no relation to any outer instantiation we might be // performing. @@ -3441,8 +3433,7 @@ DeduceTemplateArguments(Sema &S, T *Partial, return Result; SmallVector DeducedArgs(Deduced.begin(), Deduced.end()); - Sema::InstantiatingTemplate Inst(S, Info.getLocation(), Partial, DeducedArgs, - Info); + Sema::InstantiatingTemplate Inst(S, Info.getLocation(), Partial, DeducedArgs); if (Inst.isInvalid()) return TemplateDeductionResult::InstantiationDepth; @@ -3497,7 +3488,7 @@ Sema::DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType, // Unevaluated SFINAE context. EnterExpressionEvaluationContext Unevaluated( *this, Sema::ExpressionEvaluationContext::Unevaluated); - SFINAETrap Trap(*this); + SFINAETrap Trap(*this, Info); // This deduction has no relation to any outer instantiation we might be // performing. @@ -3514,7 +3505,7 @@ Sema::DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType, } SmallVector DeducedArgs(Deduced.begin(), Deduced.end()); - InstantiatingTemplate Inst(*this, Info.getLocation(), TD, DeducedArgs, Info); + InstantiatingTemplate Inst(*this, Info.getLocation(), TD, DeducedArgs); if (Inst.isInvalid()) return TemplateDeductionResult::InstantiationDepth; @@ -3558,6 +3549,9 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( SmallVectorImpl &Deduced, SmallVectorImpl &ParamTypes, QualType *FunctionType, TemplateDeductionInfo &Info) { + assert(isSFINAEContext()); + assert(isUnevaluatedContext()); + FunctionDecl *Function = FunctionTemplate->getTemplatedDecl(); TemplateParameterList *TemplateParams = FunctionTemplate->getTemplateParameters(); @@ -3573,11 +3567,6 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( return TemplateDeductionResult::Success; } - // Unevaluated SFINAE context. - EnterExpressionEvaluationContext Unevaluated( - *this, Sema::ExpressionEvaluationContext::Unevaluated); - SFINAETrap Trap(*this); - // C++ [temp.arg.explicit]p3: // Template arguments that are present shall be specified in the // declaration order of their corresponding template-parameters. The @@ -3590,7 +3579,7 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( SmallVector DeducedArgs; InstantiatingTemplate Inst( *this, Info.getLocation(), FunctionTemplate, DeducedArgs, - CodeSynthesisContext::ExplicitTemplateArgumentSubstitution, Info); + CodeSynthesisContext::ExplicitTemplateArgumentSubstitution); if (Inst.isInvalid()) return TemplateDeductionResult::InstantiationDepth; @@ -3598,8 +3587,7 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( if (CheckTemplateArgumentList(FunctionTemplate, SourceLocation(), ExplicitTemplateArgs, /*DefaultArgs=*/{}, /*PartialTemplateArgs=*/true, CTAI, - /*UpdateArgsWithConversions=*/false) || - Trap.hasErrorOccurred()) { + /*UpdateArgsWithConversions=*/false)) { unsigned Index = CTAI.SugaredConverted.size(); if (Index >= TemplateParams->size()) return TemplateDeductionResult::SubstitutionFailure; @@ -3688,7 +3676,7 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( ResultType = SubstType(Proto->getReturnType(), MLTAL, Function->getTypeSpecStartLoc(), Function->getDeclName()); - if (ResultType.isNull() || Trap.hasErrorOccurred()) + if (ResultType.isNull()) return TemplateDeductionResult::SubstitutionFailure; // CUDA: Kernel function must have 'void' return type. if (getLangOpts().CUDA) @@ -3714,7 +3702,7 @@ TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments( Function->getLocation(), Function->getDeclName(), EPI); - if (FunctionType->isNull() || Trap.hasErrorOccurred()) + if (FunctionType->isNull()) return TemplateDeductionResult::SubstitutionFailure; } @@ -3912,12 +3900,15 @@ static TemplateDeductionResult instantiateExplicitSpecifierDeferred( if (!ExplicitExpr->isValueDependent()) return TemplateDeductionResult::Success; + // By this point, FinishTemplateArgumentDeduction will have been reverted back + // to a regular non-SFINAE template instantiation context, so setup a new + // SFINAE context. Sema::InstantiatingTemplate Inst( S, Info.getLocation(), FunctionTemplate, DeducedArgs, - Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution, Info); + Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution); if (Inst.isInvalid()) return TemplateDeductionResult::InstantiationDepth; - Sema::SFINAETrap Trap(S); + Sema::SFINAETrap Trap(S, Info); const ExplicitSpecifier InstantiatedES = S.instantiateExplicitSpecifier(SubstArgs, ES); if (InstantiatedES.isInvalid() || Trap.hasErrorOccurred()) { @@ -3937,17 +3928,12 @@ TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref CheckNonDependent) { - // Unevaluated SFINAE context. - EnterExpressionEvaluationContext Unevaluated( - *this, Sema::ExpressionEvaluationContext::Unevaluated); - SFINAETrap Trap(*this); - // Enter a new template instantiation context while we instantiate the // actual function declaration. SmallVector DeducedArgs(Deduced.begin(), Deduced.end()); InstantiatingTemplate Inst( *this, Info.getLocation(), FunctionTemplate, DeducedArgs, - CodeSynthesisContext::DeducedTemplateArgumentSubstitution, Info); + CodeSynthesisContext::DeducedTemplateArgumentSubstitution); if (Inst.isInvalid()) return TemplateDeductionResult::InstantiationDepth; @@ -4030,18 +4016,9 @@ TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( // If the template argument list is owned by the function template // specialization, release it. if (Specialization->getTemplateSpecializationArgs() == - CanonicalDeducedArgumentList && - !Trap.hasErrorOccurred()) + CanonicalDeducedArgumentList) Info.takeCanonical(); - // There may have been an error that did not prevent us from constructing a - // declaration. Mark the declaration invalid and return with a substitution - // failure. - if (Trap.hasErrorOccurred()) { - Specialization->setInvalidDecl(true); - return TemplateDeductionResult::SubstitutionFailure; - } - // C++2a [temp.deduct]p5 // [...] When all template arguments have been deduced [...] all uses of // template parameters [...] are replaced with the corresponding deduced @@ -4553,6 +4530,10 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( return TemplateDeductionResult::TooManyArguments; } + EnterExpressionEvaluationContext Unevaluated( + *this, Sema::ExpressionEvaluationContext::Unevaluated); + Sema::SFINAETrap Trap(*this, Info); + // The types of the parameters from which we will perform template argument // deduction. LocalInstantiationScope InstScope(*this); @@ -4570,6 +4551,8 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( }); if (Result != TemplateDeductionResult::Success) return Result; + if (Trap.hasErrorOccurred()) + return TemplateDeductionResult::SubstitutionFailure; NumExplicitlySpecified = Deduced.size(); } else { @@ -4743,6 +4726,11 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( OnlyInitializeNonUserDefinedConversions); }); }); + if (Trap.hasErrorOccurred()) { + if (Specialization) + Specialization->setInvalidDecl(true); + return TemplateDeductionResult::SubstitutionFailure; + } return Result; } @@ -4795,6 +4783,14 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( = FunctionTemplate->getTemplateParameters(); QualType FunctionType = Function->getType(); + bool PotentiallyEvaluated = + currentEvaluationContext().isPotentiallyEvaluated(); + + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated( + *this, Sema::ExpressionEvaluationContext::Unevaluated); + SFINAETrap Trap(*this, Info); + // Substitute any explicit template arguments. LocalInstantiationScope InstScope(*this); SmallVector Deduced; @@ -4809,6 +4805,8 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( }); if (Result != TemplateDeductionResult::Success) return Result; + if (Trap.hasErrorOccurred()) + return TemplateDeductionResult::SubstitutionFailure; NumExplicitlySpecified = Deduced.size(); } @@ -4820,11 +4818,6 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( ArgFunctionType = adjustCCAndNoReturn(ArgFunctionType, FunctionType, /*AdjustExceptionSpec*/false); - // Unevaluated SFINAE context. - std::optional Unevaluated( - std::in_place, *this, Sema::ExpressionEvaluationContext::Unevaluated); - SFINAETrap Trap(*this); - Deduced.resize(TemplateParams->size()); // If the function has a deduced return type, substitute it for a dependent @@ -4865,14 +4858,12 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( DeduceReturnType(Specialization, Info.getLocation(), false)) return TemplateDeductionResult::MiscellaneousDeductionFailure; - Unevaluated = std::nullopt; // [C++26][expr.const]/p17 // An expression or conversion is immediate-escalating if it is not initially // in an immediate function context and it is [...] // a potentially-evaluated id-expression that denotes an immediate function. if (IsAddressOfFunction && getLangOpts().CPlusPlus20 && - Specialization->isImmediateEscalating() && - currentEvaluationContext().isPotentiallyEvaluated() && + Specialization->isImmediateEscalating() && PotentiallyEvaluated && CheckIfFunctionSpecializationIsImmediate(Specialization, Info.getLocation())) return TemplateDeductionResult::MiscellaneousDeductionFailure; @@ -4975,7 +4966,7 @@ TemplateDeductionResult Sema::DeduceTemplateArguments( // Unevaluated SFINAE context. EnterExpressionEvaluationContext Unevaluated( *this, Sema::ExpressionEvaluationContext::Unevaluated); - SFINAETrap Trap(*this); + SFINAETrap Trap(*this, Info); // C++ [temp.deduct.conv]p1: // Template argument deduction is done by comparing the return @@ -5614,10 +5605,6 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction( Sema &S, FunctionTemplateDecl *FTD, SmallVectorImpl &Deduced, TemplateDeductionInfo &Info, T &&CheckDeductionConsistency) { - EnterExpressionEvaluationContext Unevaluated( - S, Sema::ExpressionEvaluationContext::Unevaluated); - Sema::SFINAETrap Trap(S); - Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(FTD)); // C++26 [temp.deduct.type]p2: @@ -5645,13 +5632,7 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction( // and verify that the instantiated argument is both valid // and equivalent to the parameter. LocalInstantiationScope InstScope(S); - - if (auto TDR = CheckDeductionConsistency(S, FTD, CTAI.SugaredConverted); - TDR != TemplateDeductionResult::Success) - return TDR; - - return Trap.hasErrorOccurred() ? TemplateDeductionResult::SubstitutionFailure - : TemplateDeductionResult::Success; + return CheckDeductionConsistency(S, FTD, CTAI.SugaredConverted); } /// Determine whether the function template \p FT1 is at least as @@ -5717,9 +5698,12 @@ static bool isAtLeastAsSpecializedAs( } SmallVector DeducedArgs(Deduced.begin(), Deduced.end()); + EnterExpressionEvaluationContext Unevaluated( + S, Sema::ExpressionEvaluationContext::Unevaluated); + Sema::SFINAETrap Trap(S, Info); Sema::InstantiatingTemplate Inst( S, Info.getLocation(), FT2, DeducedArgs, - Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution, Info); + Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution); if (Inst.isInvalid()) return false; @@ -5765,7 +5749,7 @@ static bool isAtLeastAsSpecializedAs( }); }) == TemplateDeductionResult::Success; }); - if (!AtLeastAsSpecialized) + if (!AtLeastAsSpecialized || Trap.hasErrorOccurred()) return false; // C++0x [temp.deduct.partial]p11: @@ -6241,10 +6225,11 @@ static bool isAtLeastAsSpecializedAs(Sema &S, QualType T1, QualType T2, /*HasDeducedAnyParam=*/nullptr) != TemplateDeductionResult::Success) return false; - SmallVector DeducedArgs(Deduced.begin(), - Deduced.end()); - Sema::InstantiatingTemplate Inst(S, Info.getLocation(), P2, DeducedArgs, - Info); + SmallVector DeducedArgs(Deduced.begin(), Deduced.end()); + EnterExpressionEvaluationContext Unevaluated( + S, Sema::ExpressionEvaluationContext::Unevaluated); + Sema::SFINAETrap Trap(S, Info); + Sema::InstantiatingTemplate Inst(S, Info.getLocation(), P2, DeducedArgs); if (Inst.isInvalid()) return false; @@ -6252,8 +6237,6 @@ static bool isAtLeastAsSpecializedAs(Sema &S, QualType T1, QualType T2, Ps = cast(T2)->template_arguments(), As = cast(T1)->template_arguments(); - Sema::SFINAETrap Trap(S); - TemplateDeductionResult Result; S.runWithSufficientStackSpace(Info.getLocation(), [&] { Result = ::FinishTemplateArgumentDeduction( @@ -6261,14 +6244,7 @@ static bool isAtLeastAsSpecializedAs(Sema &S, QualType T1, QualType T2, /*IsPartialOrdering=*/true, Ps, As, Deduced, Info, /*CopyDeducedArgs=*/false); }); - - if (Result != TemplateDeductionResult::Success) - return false; - - if (Trap.hasErrorOccurred()) - return false; - - return true; + return Result == TemplateDeductionResult::Success && !Trap.hasErrorOccurred(); } namespace { diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp index 40811d4c42e2a..bfb10665c25b1 100644 --- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp +++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp @@ -1025,6 +1025,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef, TypeAliasTemplateDecl *AliasTemplate, FunctionTemplateDecl *F, SourceLocation Loc) { LocalInstantiationScope Scope(SemaRef); + Sema::NonSFINAEContext _1(SemaRef); Sema::InstantiatingTemplate BuildingDeductionGuides( SemaRef, AliasTemplate->getLocation(), F, Sema::InstantiatingTemplate::BuildingDeductionGuidesTag{}); diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 5fceacd0c00eb..35205f40cbcef 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -606,8 +606,7 @@ bool Sema::CodeSynthesisContext::isInstantiationRecord() const { Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, CodeSynthesisContext::SynthesisKind Kind, SourceLocation PointOfInstantiation, SourceRange InstantiationRange, - Decl *Entity, NamedDecl *Template, ArrayRef TemplateArgs, - sema::TemplateDeductionInfo *DeductionInfo) + Decl *Entity, NamedDecl *Template, ArrayRef TemplateArgs) : SemaRef(SemaRef) { // Don't allow further instantiation if a fatal error and an uncompilable // error have occurred. Any diagnostics we might have raised will not be @@ -625,7 +624,6 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( Inst.Template = Template; Inst.TemplateArgs = TemplateArgs.data(); Inst.NumTemplateArgs = TemplateArgs.size(); - Inst.DeductionInfo = DeductionInfo; Inst.InstantiationRange = InstantiationRange; Inst.InConstraintSubstitution = Inst.Kind == CodeSynthesisContext::ConstraintSubstitution; @@ -671,48 +669,40 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, FunctionTemplateDecl *FunctionTemplate, ArrayRef TemplateArgs, - CodeSynthesisContext::SynthesisKind Kind, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + CodeSynthesisContext::SynthesisKind Kind, SourceRange InstantiationRange) : InstantiatingTemplate(SemaRef, Kind, PointOfInstantiation, InstantiationRange, FunctionTemplate, nullptr, - TemplateArgs, &DeductionInfo) { + TemplateArgs) { assert(Kind == CodeSynthesisContext::ExplicitTemplateArgumentSubstitution || Kind == CodeSynthesisContext::DeducedTemplateArgumentSubstitution || Kind == CodeSynthesisContext::BuildingDeductionGuides); } Sema::InstantiatingTemplate::InstantiatingTemplate( - Sema &SemaRef, SourceLocation PointOfInstantiation, - TemplateDecl *Template, - ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template, + ArrayRef TemplateArgs, SourceRange InstantiationRange) : InstantiatingTemplate( - SemaRef, - CodeSynthesisContext::DeducedTemplateArgumentSubstitution, + SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution, PointOfInstantiation, InstantiationRange, Template, nullptr, - TemplateArgs, &DeductionInfo) {} + TemplateArgs) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, ClassTemplatePartialSpecializationDecl *PartialSpec, - ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + ArrayRef TemplateArgs, SourceRange InstantiationRange) : InstantiatingTemplate( - SemaRef, - CodeSynthesisContext::DeducedTemplateArgumentSubstitution, + SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution, PointOfInstantiation, InstantiationRange, PartialSpec, nullptr, - TemplateArgs, &DeductionInfo) {} + TemplateArgs) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, VarTemplatePartialSpecializationDecl *PartialSpec, - ArrayRef TemplateArgs, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + ArrayRef TemplateArgs, SourceRange InstantiationRange) : InstantiatingTemplate( - SemaRef, - CodeSynthesisContext::DeducedTemplateArgumentSubstitution, + SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution, PointOfInstantiation, InstantiationRange, PartialSpec, nullptr, - TemplateArgs, &DeductionInfo) {} + TemplateArgs) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, ParmVarDecl *Param, @@ -763,12 +753,11 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, - concepts::Requirement *Req, sema::TemplateDeductionInfo &DeductionInfo, - SourceRange InstantiationRange) + concepts::Requirement *Req, SourceRange InstantiationRange) : InstantiatingTemplate( SemaRef, CodeSynthesisContext::RequirementInstantiation, PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr, - /*Template=*/nullptr, /*TemplateArgs=*/{}, &DeductionInfo) {} + /*Template=*/nullptr, /*TemplateArgs=*/{}) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, @@ -781,11 +770,11 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, const RequiresExpr *RE, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + SourceRange InstantiationRange) : InstantiatingTemplate( SemaRef, CodeSynthesisContext::RequirementParameterInstantiation, PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr, - /*Template=*/nullptr, /*TemplateArgs=*/{}, &DeductionInfo) {} + /*Template=*/nullptr, /*TemplateArgs=*/{}) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, @@ -797,13 +786,11 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( TemplateArgs) {} Sema::InstantiatingTemplate::InstantiatingTemplate( - Sema &SemaRef, SourceLocation PointOfInstantiation, - ConstraintSubstitution, NamedDecl *Template, - sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + Sema &SemaRef, SourceLocation PointOfInstantiation, ConstraintSubstitution, + NamedDecl *Template, SourceRange InstantiationRange) : InstantiatingTemplate( SemaRef, CodeSynthesisContext::ConstraintSubstitution, - PointOfInstantiation, InstantiationRange, Template, nullptr, - {}, &DeductionInfo) {} + PointOfInstantiation, InstantiationRange, Template, nullptr, {}) {} Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, @@ -835,9 +822,6 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( ArgLoc, InstantiationRange, PArg) {} bool Sema::pushCodeSynthesisContext(CodeSynthesisContext Ctx) { - Ctx.SavedInNonInstantiationSFINAEContext = InNonInstantiationSFINAEContext; - InNonInstantiationSFINAEContext = false; - if (!Ctx.isInstantiationRecord()) { ++NonInstantiationEntries; } else { @@ -871,8 +855,6 @@ void Sema::popCodeSynthesisContext() { --NonInstantiationEntries; } - InNonInstantiationSFINAEContext = Active.SavedInNonInstantiationSFINAEContext; - // Name lookup no longer looks in this template's defining module. assert(CodeSynthesisContexts.size() >= CodeSynthesisContextLookupModules.size() && @@ -1282,93 +1264,6 @@ void Sema::PrintInstantiationStack(InstantiationContextDiagFuncRef DiagFunc) { } } -std::optional Sema::isSFINAEContext() const { - if (InNonInstantiationSFINAEContext) - return std::optional(nullptr); - - for (SmallVectorImpl::const_reverse_iterator - Active = CodeSynthesisContexts.rbegin(), - ActiveEnd = CodeSynthesisContexts.rend(); - Active != ActiveEnd; - ++Active) - { - switch (Active->Kind) { - case CodeSynthesisContext::TypeAliasTemplateInstantiation: - // An instantiation of an alias template may or may not be a SFINAE - // context, depending on what else is on the stack. - if (isa(Active->Entity)) - break; - [[fallthrough]]; - case CodeSynthesisContext::TemplateInstantiation: - case CodeSynthesisContext::DefaultFunctionArgumentInstantiation: - case CodeSynthesisContext::ExceptionSpecInstantiation: - case CodeSynthesisContext::ConstraintsCheck: - case CodeSynthesisContext::ParameterMappingSubstitution: - case CodeSynthesisContext::ConstraintNormalization: - case CodeSynthesisContext::NestedRequirementConstraintsCheck: - // This is a template instantiation, so there is no SFINAE. - return std::nullopt; - case CodeSynthesisContext::LambdaExpressionSubstitution: - // [temp.deduct]p9 - // A lambda-expression appearing in a function type or a template - // parameter is not considered part of the immediate context for the - // purposes of template argument deduction. - // CWG2672: A lambda-expression body is never in the immediate context. - return std::nullopt; - - case CodeSynthesisContext::DefaultTemplateArgumentInstantiation: - case CodeSynthesisContext::PriorTemplateArgumentSubstitution: - case CodeSynthesisContext::DefaultTemplateArgumentChecking: - case CodeSynthesisContext::RewritingOperatorAsSpaceship: - case CodeSynthesisContext::PartialOrderingTTP: - // A default template argument instantiation and substitution into - // template parameters with arguments for prior parameters may or may - // not be a SFINAE context; look further up the stack. - break; - - case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution: - case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: - // We're either substituting explicitly-specified template arguments, - // deduced template arguments. SFINAE applies unless we are in a lambda - // body, see [temp.deduct]p9. - case CodeSynthesisContext::ConstraintSubstitution: - case CodeSynthesisContext::RequirementInstantiation: - case CodeSynthesisContext::RequirementParameterInstantiation: - // SFINAE always applies in a constraint expression or a requirement - // in a requires expression. - assert(Active->DeductionInfo && "Missing deduction info pointer"); - return Active->DeductionInfo; - - case CodeSynthesisContext::DeclaringSpecialMember: - case CodeSynthesisContext::DeclaringImplicitEqualityComparison: - case CodeSynthesisContext::DefiningSynthesizedFunction: - case CodeSynthesisContext::InitializingStructuredBinding: - case CodeSynthesisContext::MarkingClassDllexported: - case CodeSynthesisContext::BuildingBuiltinDumpStructCall: - case CodeSynthesisContext::BuildingDeductionGuides: - // This happens in a context unrelated to template instantiation, so - // there is no SFINAE. - return std::nullopt; - - case CodeSynthesisContext::ExceptionSpecEvaluation: - // FIXME: This should not be treated as a SFINAE context, because - // we will cache an incorrect exception specification. However, clang - // bootstrap relies this! See PR31692. - break; - - case CodeSynthesisContext::Memoization: - break; - } - - // The inner context was transparent for SFINAE. If it occurred within a - // non-instantiation SFINAE context, then SFINAE applies. - if (Active->SavedInNonInstantiationSFINAEContext) - return std::optional(nullptr); - } - - return std::nullopt; -} - //===----------------------------------------------------------------------===/ // Template Instantiation for Types //===----------------------------------------------------------------------===/ @@ -2674,10 +2569,9 @@ ExprResult TemplateInstantiator::TransformRequiresTypeParams( Sema::ExtParameterInfoBuilder &PInfos) { TemplateDeductionInfo Info(KWLoc); - Sema::InstantiatingTemplate TypeInst(SemaRef, KWLoc, - RE, Info, + Sema::InstantiatingTemplate TypeInst(SemaRef, KWLoc, RE, SourceRange{KWLoc, RBraceLoc}); - Sema::SFINAETrap Trap(SemaRef); + Sema::SFINAETrap Trap(SemaRef, Info); unsigned ErrorIdx; if (getDerived().TransformFunctionTypeParams( @@ -2709,10 +2603,10 @@ TemplateInstantiator::TransformTypeRequirement(concepts::TypeRequirement *Req) { return Req; } - Sema::SFINAETrap Trap(SemaRef); TemplateDeductionInfo Info(Req->getType()->getTypeLoc().getBeginLoc()); - Sema::InstantiatingTemplate TypeInst(SemaRef, - Req->getType()->getTypeLoc().getBeginLoc(), Req, Info, + Sema::SFINAETrap Trap(SemaRef, Info); + Sema::InstantiatingTemplate TypeInst( + SemaRef, Req->getType()->getTypeLoc().getBeginLoc(), Req, Req->getType()->getTypeLoc().getSourceRange()); if (TypeInst.isInvalid()) return nullptr; @@ -2730,8 +2624,6 @@ TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) { if (!Req->isDependent() && !AlwaysRebuild()) return Req; - Sema::SFINAETrap Trap(SemaRef); - llvm::PointerUnion TransExpr; if (Req->isExprSubstitutionFailure()) @@ -2739,7 +2631,8 @@ TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) { else { Expr *E = Req->getExpr(); TemplateDeductionInfo Info(E->getBeginLoc()); - Sema::InstantiatingTemplate ExprInst(SemaRef, E->getBeginLoc(), Req, Info, + Sema::SFINAETrap Trap(SemaRef, Info); + Sema::InstantiatingTemplate ExprInst(SemaRef, E->getBeginLoc(), Req, E->getSourceRange()); if (ExprInst.isInvalid()) return nullptr; @@ -2765,8 +2658,9 @@ TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) { TemplateParameterList *OrigTPL = RetReq.getTypeConstraintTemplateParameterList(); TemplateDeductionInfo Info(OrigTPL->getTemplateLoc()); - Sema::InstantiatingTemplate TPLInst(SemaRef, OrigTPL->getTemplateLoc(), - Req, Info, OrigTPL->getSourceRange()); + Sema::SFINAETrap Trap(SemaRef, Info); + Sema::InstantiatingTemplate TPLInst(SemaRef, OrigTPL->getTemplateLoc(), Req, + OrigTPL->getSourceRange()); if (TPLInst.isInvalid()) return nullptr; TemplateParameterList *TPL = TransformTemplateParameterList(OrigTPL); @@ -2830,11 +2724,9 @@ TemplateInstantiator::TransformNestedRequirement( bool Success; Expr *NewConstraint; - TemplateDeductionInfo Info(Constraint->getBeginLoc()); { EnterExpressionEvaluationContext ContextRAII( SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); - Sema::InstantiatingTemplate ConstrInst( SemaRef, Constraint->getBeginLoc(), Req, Sema::InstantiatingTemplate::ConstraintsCheck(), @@ -2843,16 +2735,10 @@ TemplateInstantiator::TransformNestedRequirement( if (ConstrInst.isInvalid()) return nullptr; - Sema::SFINAETrap Trap(SemaRef); - Success = !SemaRef.CheckConstraintSatisfaction( Req, AssociatedConstraint(Constraint, SemaRef.ArgPackSubstIndex), TemplateArgs, Constraint->getSourceRange(), Satisfaction, /*TopLevelConceptId=*/nullptr, &NewConstraint); - - assert((!Success || !Trap.hasErrorOccurred()) && - "Substitution failures must be handled " - "by CheckConstraintSatisfaction."); } if (!Success || Satisfaction.HasSubstitutionFailure()) @@ -3306,7 +3192,7 @@ bool Sema::SubstDefaultArgument( EnterExpressionEvaluationContext EvalContext( *this, ExpressionEvaluationContext::PotentiallyEvaluated, Param); - + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, Loc, Param, TemplateArgs.getInnermost()); if (Inst.isInvalid()) return true; @@ -3594,6 +3480,7 @@ bool Sema::InstantiateClassImpl( Spec->setPointOfInstantiation(PointOfInstantiation); } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); if (Inst.isInvalid()) return true; @@ -3828,6 +3715,7 @@ bool Sema::InstantiateEnum(SourceLocation PointOfInstantiation, MSInfo->setPointOfInstantiation(PointOfInstantiation); } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); if (Inst.isInvalid()) return true; @@ -3892,6 +3780,7 @@ bool Sema::InstantiateInClassInitializer( return true; } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); if (Inst.isInvalid()) return true; @@ -3975,6 +3864,7 @@ static ActionResult getPatternForClassTemplateSpecialization( Sema &S, SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool PrimaryStrictPackMatch) { + std::optional NSC(S); Sema::InstantiatingTemplate Inst(S, PointOfInstantiation, ClassTemplateSpec); if (Inst.isInvalid()) return {/*Invalid=*/true}; @@ -4076,6 +3966,7 @@ static ActionResult getPatternForClassTemplateSpecialization( if (Ambiguous) { // Partial ordering did not produce a clear winner. Complain. Inst.Clear(); + NSC.reset(); S.Diag(PointOfInstantiation, diag::err_partial_spec_ordering_ambiguous) << ClassTemplateSpec; @@ -4507,6 +4398,7 @@ ExprResult Sema::SubstConceptTemplateArguments( TemplateArgumentListInfo SubstArgs(ArgsAsWritten->getLAngleLoc(), ArgsAsWritten->getRAngleLoc()); + NonSFINAEContext _(*this); Sema::InstantiatingTemplate Inst( *this, ArgsAsWritten->arguments().front().getSourceRange().getBegin(), Sema::InstantiatingTemplate::ConstraintNormalization{}, diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 681bfe0d8cbf8..4d58f00168298 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5316,6 +5316,7 @@ void Sema::InstantiateExceptionSpec(SourceLocation PointOfInstantiation, return; } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Decl, InstantiatingTemplate::ExceptionSpecification()); if (Inst.isInvalid()) { @@ -5383,6 +5384,7 @@ TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution || ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) { if (isa(ActiveInst.Entity)) { + SemaRef.CurrentSFINAEContext = nullptr; atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef, ActiveInst); ActiveInst.Kind = ActiveInstType::TemplateInstantiation; ActiveInst.Entity = New; @@ -5493,8 +5495,7 @@ FunctionDecl *Sema::InstantiateFunctionDeclaration( SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC) { FunctionDecl *FD = FTD->getTemplatedDecl(); - sema::TemplateDeductionInfo Info(Loc); - InstantiatingTemplate Inst(*this, Loc, FTD, Args->asArray(), CSC, Info); + InstantiatingTemplate Inst(*this, Loc, FTD, Args->asArray(), CSC); if (Inst.isInvalid()) return nullptr; @@ -5684,6 +5685,7 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, } } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Function); if (Inst.isInvalid()) return; @@ -5974,6 +5976,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation( if (FromVar->isInvalidDecl()) return nullptr; + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, FromVar); if (Inst.isInvalid()) return nullptr; @@ -6281,6 +6284,7 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, !Var->hasInit()) { // FIXME: Factor out the duplicated instantiation context setup/tear down // code here. + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Var); if (Inst.isInvalid()) return; @@ -6385,6 +6389,7 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation, return; } + NonSFINAEContext _(*this); InstantiatingTemplate Inst(*this, PointOfInstantiation, Var); if (Inst.isInvalid()) return; diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp index 0f72d6a13ae06..5b1aad3fa8470 100644 --- a/clang/lib/Sema/SemaTemplateVariadic.cpp +++ b/clang/lib/Sema/SemaTemplateVariadic.cpp @@ -844,7 +844,7 @@ bool Sema::CheckParameterPacksForExpansion( ArrayRef Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, - bool &RetainExpansion, UnsignedOrNone &NumExpansions) { + bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose) { ShouldExpand = true; RetainExpansion = false; IdentifierLoc FirstPack; @@ -874,6 +874,9 @@ bool Sema::CheckParameterPacksForExpansion( if (!FailOnPackProducingTemplates) continue; + if (!Diagnose) + return true; + // It is not yet supported in certain contexts. return Diag(PatternRange.getBegin().isValid() ? PatternRange.getBegin() : EllipsisLoc, @@ -1015,7 +1018,9 @@ bool Sema::CheckParameterPacksForExpansion( // C++0x [temp.variadic]p5: // All of the parameter packs expanded by a pack expansion shall have // the same number of arguments specified. - if (HaveFirstPack) + if (!Diagnose) + ; + else if (HaveFirstPack) Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict) << FirstPack.getIdentifierInfo() << Name << *NumExpansions << (LeastNewPackSize != NewPackSize) << LeastNewPackSize @@ -1041,6 +1046,8 @@ bool Sema::CheckParameterPacksForExpansion( if (NumExpansions && *NumExpansions < *NumPartialExpansions) { NamedDecl *PartialPack = CurrentInstantiationScope->getPartiallySubstitutedPack(); + if (!Diagnose) + return true; Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial) << PartialPack << *NumPartialExpansions << *NumExpansions << SourceRange(PartiallySubstitutedPackLoc); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index dffd7c1def8e2..de210c47b43ff 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -15824,16 +15824,20 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { Sema::ExpressionEvaluationContext::PotentiallyEvaluated, E->getCallOperator()); - Sema::CodeSynthesisContext C; - C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; - C.PointOfInstantiation = E->getBody()->getBeginLoc(); - getSema().pushCodeSynthesisContext(C); + StmtResult Body; + { + Sema::NonSFINAEContext _(getSema()); + Sema::CodeSynthesisContext C; + C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; + C.PointOfInstantiation = E->getBody()->getBeginLoc(); + getSema().pushCodeSynthesisContext(C); - // Instantiate the body of the lambda expression. - StmtResult Body = - Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); + // Instantiate the body of the lambda expression. + Body = Invalid ? StmtError() + : getDerived().TransformLambdaBody(E, E->getBody()); - getSema().popCodeSynthesisContext(); + getSema().popCodeSynthesisContext(); + } // ActOnLambda* will pop the function scope for us. FuncScopeCleanup.disable(); diff --git a/clang/test/SemaCXX/attr-mode-tmpl.cpp b/clang/test/SemaCXX/attr-mode-tmpl.cpp index f665b1ba49123..3a1da3b358af4 100644 --- a/clang/test/SemaCXX/attr-mode-tmpl.cpp +++ b/clang/test/SemaCXX/attr-mode-tmpl.cpp @@ -45,7 +45,7 @@ void CheckMachineMode() { // Check attributes on function parameters. template -void CheckParameters(T1 __attribute__((mode(SI))) paramSI, // expected-note{{ignored: substitution failure}} expected-note-re{{not viable: no known conversion from '{{.*}}' (vector of 4 '{{.*}}' values) to 'EnumType' for 2nd argument}} +void CheckParameters(T1 __attribute__((mode(SI))) paramSI, // expected-note{{ignored: substitution failure}} expected-note{{ignored: substitution failure [with T1 = int, T2 = int]: type of machine mode does not match type of base type}} T1 __attribute__((mode(V4DI))) paramV4DI, // expected-warning{{deprecated}} T2 __attribute__((mode(SF))) paramSF, T2 __attribute__((mode(V4DF))) paramV4DF) { // expected-warning{{deprecated}} diff --git a/clang/test/SemaCXX/cxx23-assume.cpp b/clang/test/SemaCXX/cxx23-assume.cpp index ce862666aa48f..a594a1a44337b 100644 --- a/clang/test/SemaCXX/cxx23-assume.cpp +++ b/clang/test/SemaCXX/cxx23-assume.cpp @@ -108,7 +108,8 @@ constexpr bool f4() { template concept C = f4(); // expected-note 3 {{in instantiation of}} // expected-note@-1 3 {{while substituting}} - // expected-error@-2 2 {{resulted in a non-constant expression}} + // expected-error@-2 {{resulted in a non-constant expression}} + // expected-note@-3 {{because substituted constraint expression is ill-formed: substitution into constraint expression resulted in a non-constant expression}} struct D { int x; @@ -130,13 +131,13 @@ constexpr int f5() requires C { return 1; } // expected-note {{while checking // expected-note@-1 {{candidate template ignored}} template -constexpr int f5() requires (!C) { return 2; } // expected-note 4 {{while checking the satisfaction}} \ - // expected-note 4 {{while substituting template arguments}} \ +constexpr int f5() requires (!C) { return 2; } // expected-note 3 {{while checking the satisfaction}} \ + // expected-note 3 {{while substituting template arguments}} \ // expected-note {{candidate template ignored}} static_assert(f5() == 1); -static_assert(f5() == 1); // expected-note 3 {{while checking constraint satisfaction}} - // expected-note@-1 3 {{while substituting deduced template arguments}} +static_assert(f5() == 1); // expected-note 2 {{while checking constraint satisfaction}} + // expected-note@-1 2 {{while substituting deduced template arguments}} // expected-error@-2 {{no matching function for call}} static_assert(f5() == 2); @@ -170,7 +171,7 @@ foo (int x, int y) // Do not crash when assumptions are unreachable. namespace gh106898 { -int foo () { +int foo () { while(1); int a = 0, b = 1; __attribute__((assume (a < b))); diff --git a/clang/test/SemaTemplate/temp_arg_nontype.cpp b/clang/test/SemaTemplate/temp_arg_nontype.cpp index 7d2a010295b47..bd0bf3cfdbc59 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype.cpp @@ -173,8 +173,7 @@ namespace pr6249 { } namespace PR6723 { - template void f(int (&a)[C]); // expected-note 3{{candidate template ignored: substitution failure [with C = '\x00']}} - // expected-note@-1 {{not viable: no known conversion from 'int[512]' to 'int (&)[0]'}} + template void f(int (&a)[C]); // expected-note 4{{candidate template ignored: substitution failure [with C = '\x00']}} void g() { int arr512[512]; f(arr512); // expected-error{{no matching function for call}} diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp index 5752cbac0291d..45bdb4c623dfe 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp @@ -43,7 +43,7 @@ void TempFunc() {} void Useage() { //expected-error@+2 {{no matching function}} - //expected-note@-4 {{candidate template ignored: invalid explicitly-specified argument for template parameter 'b'}} + //expected-note@-4 {{candidate template ignored: substitution failure [with a = 1, b = 4294967295, c = 1]: non-type template argument evaluates to -1, which cannot be narrowed to type 'unsigned int'}} TempFunc<1, -1, 1>(); } } From 71550ffb8164c1ab790ccfce622906df27f44ed7 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 6 Nov 2025 11:45:07 -0800 Subject: [PATCH 40/71] [GitHub][CI] Move PATH setting into base image for tooling containers (#166826) This eliminate some redundant code. --- .../workflows/containers/github-action-ci-tooling/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/containers/github-action-ci-tooling/Dockerfile b/.github/workflows/containers/github-action-ci-tooling/Dockerfile index 8aaa2e88f2bab..707bdb309b789 100644 --- a/.github/workflows/containers/github-action-ci-tooling/Dockerfile +++ b/.github/workflows/containers/github-action-ci-tooling/Dockerfile @@ -22,6 +22,7 @@ RUN apt-get update && \ FROM docker.io/library/ubuntu:24.04 AS base ENV LLVM_SYSROOT=/opt/llvm +ENV PATH=${LLVM_SYSROOT}/bin:${PATH} # Need nodejs for some of the GitHub actions. # Need git for git-clang-format. @@ -53,7 +54,6 @@ COPY --from=llvm-downloader /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/cla /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/git-clang-format \ ${LLVM_SYSROOT}/bin/ -ENV PATH=${LLVM_SYSROOT}/bin:${PATH} # Install dependencies for 'pr-code-format.yml' job COPY llvm/utils/git/requirements_formatting.txt requirements_formatting.txt @@ -77,7 +77,6 @@ COPY clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py ${LLVM_SYSROOT}/bin/cl RUN ln -s ${LLVM_SYSROOT}/bin/clang-${LLVM_VERSION_MAJOR} ${LLVM_SYSROOT}/bin/clang && \ ln -s ${LLVM_SYSROOT}/bin/clang ${LLVM_SYSROOT}/bin/clang++ -ENV PATH=${LLVM_SYSROOT}/bin:${PATH} RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ From 165563cf20f2e2e781a27d9981a7f5993c37a316 Mon Sep 17 00:00:00 2001 From: LLVM GN Syncbot Date: Thu, 6 Nov 2025 19:46:51 +0000 Subject: [PATCH 41/71] [gn build] Port 71cb0bb8932e --- llvm/utils/gn/secondary/lldb/source/Target/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/llvm/utils/gn/secondary/lldb/source/Target/BUILD.gn b/llvm/utils/gn/secondary/lldb/source/Target/BUILD.gn index 783eb96283596..679373d741661 100644 --- a/llvm/utils/gn/secondary/lldb/source/Target/BUILD.gn +++ b/llvm/utils/gn/secondary/lldb/source/Target/BUILD.gn @@ -72,6 +72,7 @@ static_library("Target") { "Statistics.cpp", "StopInfo.cpp", "StructuredDataPlugin.cpp", + "SyntheticFrameProvider.cpp", "SystemRuntime.cpp", "Target.cpp", "TargetList.cpp", From 4cd17eeaeb13f44e7c0783e83716c06a2b9110a3 Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Thu, 6 Nov 2025 11:54:17 -0800 Subject: [PATCH 42/71] [lldb/Interpreter] Implement ScriptedFrameProvider{,Python}Interface (#166662) This patch implements the base and python interface for the ScriptedFrameProvider class. This is necessary to call python APIs from the ScriptedFrameProvider that will come in a follow-up. Signed-off-by: Med Ismail Bennani Signed-off-by: Med Ismail Bennani --- lldb/bindings/python/CMakeLists.txt | 1 + lldb/bindings/python/python-swigsafecast.swig | 5 + lldb/bindings/python/python-wrapper.swig | 12 ++ .../templates/scripted_frame_provider.py | 113 ++++++++++++++++++ lldb/include/lldb/API/SBFrameList.h | 14 +++ .../ScriptedFrameProviderInterface.h | 30 +++++ .../lldb/Interpreter/ScriptInterpreter.h | 10 ++ lldb/include/lldb/lldb-forward.h | 3 + lldb/source/Interpreter/ScriptInterpreter.cpp | 5 + .../Plugins/Process/scripted/ScriptedFrame.h | 1 - .../Python/Interfaces/CMakeLists.txt | 1 + .../ScriptInterpreterPythonInterfaces.h | 1 + .../ScriptedFrameProviderPythonInterface.cpp | 57 +++++++++ .../ScriptedFrameProviderPythonInterface.h | 44 +++++++ .../Interfaces/ScriptedPythonInterface.cpp | 17 +++ .../Interfaces/ScriptedPythonInterface.h | 13 ++ .../Python/SWIGPythonBridge.h | 2 + .../Python/ScriptInterpreterPython.cpp | 5 + .../Python/ScriptInterpreterPythonImpl.h | 3 + .../Python/PythonTestSuite.cpp | 10 ++ 20 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 lldb/examples/python/templates/scripted_frame_provider.py create mode 100644 lldb/include/lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.cpp create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.h diff --git a/lldb/bindings/python/CMakeLists.txt b/lldb/bindings/python/CMakeLists.txt index ef6def3f26872..28a8af8f06319 100644 --- a/lldb/bindings/python/CMakeLists.txt +++ b/lldb/bindings/python/CMakeLists.txt @@ -107,6 +107,7 @@ function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_tar "plugins" FILES "${LLDB_SOURCE_DIR}/examples/python/templates/parsed_cmd.py" + "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_frame_provider.py" "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_process.py" "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_platform.py" "${LLDB_SOURCE_DIR}/examples/python/templates/operating_system.py" diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index 3ea24f1a31414..a86dc44ce4106 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -37,6 +37,11 @@ PythonObject SWIGBridge::ToSWIGWrapper(lldb::ThreadPlanSP thread_plan_sp) { SWIGTYPE_p_lldb__SBThreadPlan); } +PythonObject SWIGBridge::ToSWIGWrapper(lldb::StackFrameListSP frames_sp) { + return ToSWIGHelper(new lldb::SBFrameList(std::move(frames_sp)), + SWIGTYPE_p_lldb__SBFrameList); +} + PythonObject SWIGBridge::ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp) { return ToSWIGHelper(new lldb::SBBreakpoint(std::move(breakpoint_sp)), SWIGTYPE_p_lldb__SBBreakpoint); diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig index e7acba5b95d89..3a0995e84f643 100644 --- a/lldb/bindings/python/python-wrapper.swig +++ b/lldb/bindings/python/python-wrapper.swig @@ -556,6 +556,18 @@ void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBExecutionContext(PyOb return sb_ptr; } +void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBFrameList(PyObject *data) { + lldb::SBFrameList *sb_ptr = NULL; + + int valid_cast = SWIG_ConvertPtr(data, (void **)&sb_ptr, + SWIGTYPE_p_lldb__SBFrameList, 0); + + if (valid_cast == -1) + return NULL; + + return sb_ptr; +} + bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommand( const char *python_function_name, const char *session_dictionary_name, lldb::DebuggerSP debugger, const char *args, diff --git a/lldb/examples/python/templates/scripted_frame_provider.py b/lldb/examples/python/templates/scripted_frame_provider.py new file mode 100644 index 0000000000000..20f4d76d188c2 --- /dev/null +++ b/lldb/examples/python/templates/scripted_frame_provider.py @@ -0,0 +1,113 @@ +from abc import ABCMeta, abstractmethod + +import lldb + + +class ScriptedFrameProvider(metaclass=ABCMeta): + """ + The base class for a scripted frame provider. + + A scripted frame provider allows you to provide custom stack frames for a + thread, which can be used to augment or replace the standard unwinding + mechanism. This is useful for: + + - Providing frames for custom calling conventions or languages + - Reconstructing missing frames from crash dumps or core files + - Adding diagnostic or synthetic frames for debugging + - Visualizing state machines or async execution contexts + + Most of the base class methods are `@abstractmethod` that need to be + overwritten by the inheriting class. + + Example usage: + + .. code-block:: python + + # Attach a frame provider to a thread + thread = process.GetSelectedThread() + error = thread.SetScriptedFrameProvider( + "my_module.MyFrameProvider", + lldb.SBStructuredData() + ) + """ + + @abstractmethod + def __init__(self, input_frames, args): + """Construct a scripted frame provider. + + Args: + input_frames (lldb.SBFrameList): The frame list to use as input. + This allows you to access frames by index. The frames are + materialized lazily as you access them. + args (lldb.SBStructuredData): A Dictionary holding arbitrary + key/value pairs used by the scripted frame provider. + """ + self.input_frames = None + self.args = None + self.thread = None + self.target = None + self.process = None + + if isinstance(input_frames, lldb.SBFrameList) and input_frames.IsValid(): + self.input_frames = input_frames + self.thread = input_frames.GetThread() + if self.thread and self.thread.IsValid(): + self.process = self.thread.GetProcess() + if self.process and self.process.IsValid(): + self.target = self.process.GetTarget() + + if isinstance(args, lldb.SBStructuredData) and args.IsValid(): + self.args = args + + @abstractmethod + def get_frame_at_index(self, index): + """Get a single stack frame at the given index. + + This method is called lazily when a specific frame is needed in the + thread's backtrace (e.g., via the 'bt' command). Each frame is + requested individually as needed. + + Args: + index (int): The frame index to retrieve (0 for youngest/top frame). + + Returns: + Dict or None: A frame dictionary describing the stack frame, or None + if no frame exists at this index. The dictionary should contain: + + Required fields: + - idx (int): The synthetic frame index (0 for youngest/top frame) + - pc (int): The program counter address for the synthetic frame + + Alternatively, you can return: + - A ScriptedFrame object for full control over frame behavior + - An integer representing an input frame index to reuse + - None to indicate no more frames exist + + Example: + + .. code-block:: python + + def get_frame_at_index(self, index): + # Return None when there are no more frames + if index >= self.total_frames: + return None + + # Re-use an input frame by returning its index + if self.should_use_input_frame(index): + return index # Returns input frame at this index + + # Or create a custom frame dictionary + if index == 0: + return { + "idx": 0, + "pc": 0x100001234, + } + + return None + + Note: + The frames are indexed from 0 (youngest/top) to N (oldest/bottom). + This method will be called repeatedly with increasing indices until + None is returned. + """ + pass diff --git a/lldb/include/lldb/API/SBFrameList.h b/lldb/include/lldb/API/SBFrameList.h index dba1c1de5d191..0039ffb1f863f 100644 --- a/lldb/include/lldb/API/SBFrameList.h +++ b/lldb/include/lldb/API/SBFrameList.h @@ -11,6 +11,16 @@ #include "lldb/API/SBDefines.h" +namespace lldb_private { +class ScriptInterpreter; +namespace python { +class SWIGBridge; +} +namespace lua { +class SWIGBridge; +} +} // namespace lldb_private + namespace lldb { /// Represents a list of SBFrame objects. @@ -66,6 +76,10 @@ class LLDB_API SBFrameList { protected: friend class SBThread; + friend class lldb_private::python::SWIGBridge; + friend class lldb_private::lua::SWIGBridge; + friend class lldb_private::ScriptInterpreter; + private: SBFrameList(const lldb::StackFrameListSP &frame_list_sp); diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h new file mode 100644 index 0000000000000..2d9f713676f90 --- /dev/null +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDFRAMEPROVIDERINTERFACE_H +#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDFRAMEPROVIDERINTERFACE_H + +#include "lldb/lldb-private.h" + +#include "ScriptedInterface.h" + +namespace lldb_private { +class ScriptedFrameProviderInterface : public ScriptedInterface { +public: + virtual llvm::Expected + CreatePluginObject(llvm::StringRef class_name, + lldb::StackFrameListSP input_frames, + StructuredData::DictionarySP args_sp) = 0; + + virtual StructuredData::ObjectSP GetFrameAtIndex(uint32_t index) { + return {}; + } +}; +} // namespace lldb_private + +#endif // LLDB_INTERPRETER_INTERFACES_SCRIPTEDFRAMEPROVIDERINTERFACE_H diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index edb80dc66aca7..7fed4940b85bf 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -16,6 +16,7 @@ #include "lldb/API/SBError.h" #include "lldb/API/SBEvent.h" #include "lldb/API/SBExecutionContext.h" +#include "lldb/API/SBFrameList.h" #include "lldb/API/SBLaunchInfo.h" #include "lldb/API/SBMemoryRegionInfo.h" #include "lldb/API/SBStream.h" @@ -28,6 +29,7 @@ #include "lldb/Host/StreamFile.h" #include "lldb/Interpreter/Interfaces/OperatingSystemInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedFrameInterface.h" +#include "lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedThreadInterface.h" @@ -537,6 +539,11 @@ class ScriptInterpreter : public PluginInterface { return {}; } + virtual lldb::ScriptedFrameProviderInterfaceSP + CreateScriptedFrameProviderInterface() { + return {}; + } + virtual lldb::ScriptedThreadPlanInterfaceSP CreateScriptedThreadPlanInterface() { return {}; @@ -596,6 +603,9 @@ class ScriptInterpreter : public PluginInterface { lldb::ExecutionContextRefSP GetOpaqueTypeFromSBExecutionContext( const lldb::SBExecutionContext &exe_ctx) const; + lldb::StackFrameListSP + GetOpaqueTypeFromSBFrameList(const lldb::SBFrameList &exe_ctx) const; + protected: Debugger &m_debugger; lldb::ScriptLanguage m_script_lang; diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index 7af7cd8947531..8b8d081ca2113 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -188,6 +188,7 @@ class Scalar; class ScriptInterpreter; class ScriptInterpreterLocker; class ScriptedFrameInterface; +class ScriptedFrameProviderInterface; class ScriptedMetadata; class ScriptedBreakpointInterface; class ScriptedPlatformInterface; @@ -412,6 +413,8 @@ typedef std::shared_ptr typedef std::shared_ptr ScriptInterpreterSP; typedef std::shared_ptr ScriptedFrameInterfaceSP; +typedef std::shared_ptr + ScriptedFrameProviderInterfaceSP; typedef std::shared_ptr SyntheticFrameProviderSP; typedef std::shared_ptr ScriptedMetadataSP; diff --git a/lldb/source/Interpreter/ScriptInterpreter.cpp b/lldb/source/Interpreter/ScriptInterpreter.cpp index ca768db1199c1..211868b51facb 100644 --- a/lldb/source/Interpreter/ScriptInterpreter.cpp +++ b/lldb/source/Interpreter/ScriptInterpreter.cpp @@ -150,6 +150,11 @@ ScriptInterpreter::GetOpaqueTypeFromSBExecutionContext( return exe_ctx.m_exe_ctx_sp; } +lldb::StackFrameListSP ScriptInterpreter::GetOpaqueTypeFromSBFrameList( + const lldb::SBFrameList &frame_list) const { + return frame_list.m_opaque_sp; +} + lldb::ScriptLanguage ScriptInterpreter::StringToLanguage(const llvm::StringRef &language) { if (language.equals_insensitive(LanguageToString(eScriptLanguageNone))) diff --git a/lldb/source/Plugins/Process/scripted/ScriptedFrame.h b/lldb/source/Plugins/Process/scripted/ScriptedFrame.h index 6e01e2fd7653e..b6b77c4a7d160 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedFrame.h +++ b/lldb/source/Plugins/Process/scripted/ScriptedFrame.h @@ -9,7 +9,6 @@ #ifndef LLDB_SOURCE_PLUGINS_SCRIPTED_FRAME_H #define LLDB_SOURCE_PLUGINS_SCRIPTED_FRAME_H -#include "Plugins/Process/Utility/RegisterContextMemory.h" #include "ScriptedThread.h" #include "lldb/Interpreter/ScriptInterpreter.h" #include "lldb/Target/DynamicRegisterInfo.h" diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt index 09103573b89c5..50569cdefaafa 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt @@ -23,6 +23,7 @@ add_lldb_library(lldbPluginScriptInterpreterPythonInterfaces PLUGIN OperatingSystemPythonInterface.cpp ScriptInterpreterPythonInterfaces.cpp ScriptedFramePythonInterface.cpp + ScriptedFrameProviderPythonInterface.cpp ScriptedPlatformPythonInterface.cpp ScriptedProcessPythonInterface.cpp ScriptedPythonInterface.cpp diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.h index 3814f46615078..b2a347951d0f2 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.h @@ -17,6 +17,7 @@ #include "OperatingSystemPythonInterface.h" #include "ScriptedBreakpointPythonInterface.h" +#include "ScriptedFrameProviderPythonInterface.h" #include "ScriptedFramePythonInterface.h" #include "ScriptedPlatformPythonInterface.h" #include "ScriptedProcessPythonInterface.h" diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.cpp new file mode 100644 index 0000000000000..b866bf332b7b6 --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.cpp @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/Config.h" +#include "lldb/Target/Thread.h" +#include "lldb/Utility/Log.h" +#include "lldb/lldb-enumerations.h" + +#if LLDB_ENABLE_PYTHON + +// LLDB Python header must be included first +#include "../lldb-python.h" + +#include "../SWIGPythonBridge.h" +#include "../ScriptInterpreterPythonImpl.h" +#include "ScriptedFrameProviderPythonInterface.h" +#include + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::python; +using Locker = ScriptInterpreterPythonImpl::Locker; + +ScriptedFrameProviderPythonInterface::ScriptedFrameProviderPythonInterface( + ScriptInterpreterPythonImpl &interpreter) + : ScriptedFrameProviderInterface(), ScriptedPythonInterface(interpreter) {} + +llvm::Expected +ScriptedFrameProviderPythonInterface::CreatePluginObject( + const llvm::StringRef class_name, lldb::StackFrameListSP input_frames, + StructuredData::DictionarySP args_sp) { + if (!input_frames) + return llvm::createStringError("Invalid frame list"); + + StructuredDataImpl sd_impl(args_sp); + return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr, + input_frames, sd_impl); +} + +StructuredData::ObjectSP +ScriptedFrameProviderPythonInterface::GetFrameAtIndex(uint32_t index) { + Status error; + StructuredData::ObjectSP obj = Dispatch("get_frame_at_index", error, index); + + if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, + error)) + return {}; + + return obj; +} + +#endif diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.h new file mode 100644 index 0000000000000..fd163984028d3 --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H +#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H + +#include "lldb/Host/Config.h" + +#if LLDB_ENABLE_PYTHON + +#include "ScriptedPythonInterface.h" +#include "lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h" +#include + +namespace lldb_private { +class ScriptedFrameProviderPythonInterface + : public ScriptedFrameProviderInterface, + public ScriptedPythonInterface { +public: + ScriptedFrameProviderPythonInterface( + ScriptInterpreterPythonImpl &interpreter); + + llvm::Expected + CreatePluginObject(llvm::StringRef class_name, + lldb::StackFrameListSP input_frames, + StructuredData::DictionarySP args_sp) override; + + llvm::SmallVector + GetAbstractMethodRequirements() const override { + return llvm::SmallVector( + {{"get_frame_at_index"}}); + } + + StructuredData::ObjectSP GetFrameAtIndex(uint32_t index) override; +}; +} // namespace lldb_private + +#endif // LLDB_ENABLE_PYTHON +#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp index 4fdf2b12a5500..af2e0b5df4d22 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp @@ -243,4 +243,21 @@ ScriptedPythonInterface::ExtractValueFromPythonObject( return static_cast(unsigned_val); } +template <> +lldb::StackFrameListSP +ScriptedPythonInterface::ExtractValueFromPythonObject( + python::PythonObject &p, Status &error) { + + lldb::SBFrameList *sb_frame_list = reinterpret_cast( + python::LLDBSWIGPython_CastPyObjectToSBFrameList(p.get())); + + if (!sb_frame_list) { + error = Status::FromErrorStringWithFormat( + "couldn't cast lldb::SBFrameList to lldb::StackFrameListSP."); + return {}; + } + + return m_interpreter.GetOpaqueTypeFromSBFrameList(*sb_frame_list); +} + #endif diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h index 2335b2ef0f171..ec1dd9910d8a6 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h @@ -444,6 +444,14 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { return python::SWIGBridge::ToSWIGWrapper(arg); } + python::PythonObject Transform(lldb::ThreadSP arg) { + return python::SWIGBridge::ToSWIGWrapper(arg); + } + + python::PythonObject Transform(lldb::StackFrameListSP arg) { + return python::SWIGBridge::ToSWIGWrapper(arg); + } + python::PythonObject Transform(lldb::ThreadPlanSP arg) { return python::SWIGBridge::ToSWIGWrapper(arg); } @@ -628,6 +636,11 @@ lldb::DescriptionLevel ScriptedPythonInterface::ExtractValueFromPythonObject( python::PythonObject &p, Status &error); +template <> +lldb::StackFrameListSP +ScriptedPythonInterface::ExtractValueFromPythonObject( + python::PythonObject &p, Status &error); + } // namespace lldb_private #endif // LLDB_ENABLE_PYTHON diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h index 27f5d2ee471c0..2c971262fc34e 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h @@ -93,6 +93,7 @@ class SWIGBridge { static PythonObject ToSWIGWrapper(const StructuredDataImpl &data_impl); static PythonObject ToSWIGWrapper(lldb::ThreadSP thread_sp); static PythonObject ToSWIGWrapper(lldb::StackFrameSP frame_sp); + static PythonObject ToSWIGWrapper(lldb::StackFrameListSP frames_sp); static PythonObject ToSWIGWrapper(lldb::DebuggerSP debugger_sp); static PythonObject ToSWIGWrapper(lldb::WatchpointSP watchpoint_sp); static PythonObject ToSWIGWrapper(lldb::BreakpointLocationSP bp_loc_sp); @@ -269,6 +270,7 @@ void *LLDBSWIGPython_CastPyObjectToSBSymbolContext(PyObject *data); void *LLDBSWIGPython_CastPyObjectToSBValue(PyObject *data); void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(PyObject *data); void *LLDBSWIGPython_CastPyObjectToSBExecutionContext(PyObject *data); +void *LLDBSWIGPython_CastPyObjectToSBFrameList(PyObject *data); } // namespace python } // namespace lldb_private diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index d257a08a2c62c..3493fa9fef635 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -1526,6 +1526,11 @@ ScriptInterpreterPythonImpl::CreateScriptedFrameInterface() { return std::make_shared(*this); } +ScriptedFrameProviderInterfaceSP +ScriptInterpreterPythonImpl::CreateScriptedFrameProviderInterface() { + return std::make_shared(*this); +} + ScriptedThreadPlanInterfaceSP ScriptInterpreterPythonImpl::CreateScriptedThreadPlanInterface() { return std::make_shared(*this); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h index 00ae59c1c4241..ad2ddd2219e8a 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h @@ -101,6 +101,9 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython { lldb::ScriptedFrameInterfaceSP CreateScriptedFrameInterface() override; + lldb::ScriptedFrameProviderInterfaceSP + CreateScriptedFrameProviderInterface() override; + lldb::ScriptedThreadPlanInterfaceSP CreateScriptedThreadPlanInterface() override; diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp index 3d0e2d8a62482..a63b740d9472f 100644 --- a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -161,6 +161,11 @@ void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBExecutionContext( return nullptr; } +void * +lldb_private::python::LLDBSWIGPython_CastPyObjectToSBFrameList(PyObject *data) { + return nullptr; +} + lldb::ValueObjectSP lldb_private::python::SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue( void *data) { @@ -329,6 +334,11 @@ lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessSP) { return python::PythonObject(); } +python::PythonObject +lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::StackFrameListSP) { + return python::PythonObject(); +} + python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( const lldb_private::StructuredDataImpl &) { return python::PythonObject(); From 316236b1c05a81bcc9b29d3d8a6a9143f0930a5d Mon Sep 17 00:00:00 2001 From: "Oleksandr T." Date: Thu, 6 Nov 2025 21:56:34 +0200 Subject: [PATCH 43/71] [Clang] fix false-positive lambda shadow diagnostics in explicit object member functions (#165919) Fixes #163731 --- This PR addresses false-positive shadow diagnostics for lambdas inside explicit object member functions ```cpp struct S { int x; void m(this S &self) { auto lambda = [](int x) { return x; }; // ok } }; ``` --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Sema/SemaDecl.cpp | 11 +++++----- clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 26 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ae21c69b2d3c5..34c0d73d4a129 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -447,6 +447,7 @@ Bug Fixes in This Version - Fixed a failed assertion with empty filename in ``#embed`` directive. (#GH162951) - Fixed a crash triggered by unterminated ``__has_embed``. (#GH162953) - Accept empty enumerations in MSVC-compatible C mode. (#GH114402) +- Fixed false-positive shadow diagnostics for lambdas in explicit object member functions. (#GH163731) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index fc3aabf5741ca..086dd8ba1c670 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -8492,12 +8492,11 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, DeclContext *NewDC = D->getDeclContext(); if (FieldDecl *FD = dyn_cast(ShadowedDecl)) { - if (CXXMethodDecl *MD = dyn_cast(NewDC)) { - // Fields are not shadowed by variables in C++ static methods. - if (MD->isStatic()) - return; - - if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction()) + if (const auto *MD = + dyn_cast(getFunctionLevelDeclContext())) { + // Fields aren't shadowed in C++ static members or in member functions + // with an explicit object parameter. + if (MD->isStatic() || MD->isExplicitObjectMemberFunction()) return; } // Fields shadowed by constructor parameters are a special case. Usually diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp index 76866c4269474..9ce0c5a7434f5 100644 --- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp +++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp @@ -11,3 +11,29 @@ struct Foo { } }; } // namespace GH95707 + +namespace GH163731 { +struct S1 { + int a; + void m(this S1 &self) { + auto lambda = [](int a) { return a; }; + } +}; + +struct S2 { + int a; + void m(this S2 &self) { + int a = 1; // expected-note {{previous declaration is here}} + auto lambda = [](int a) { // expected-warning {{declaration shadows a local variable}} + return a; + }; + } +}; + +struct S3 { + int a; + void m(this S3 &self) { + auto lambda = [self](int a) { return a + self.a; }; + } +}; +} From 8d0df57340bee4eabe82c1c9c6604cefa4b5c299 Mon Sep 17 00:00:00 2001 From: Fateme Hosseini Date: Thu, 6 Nov 2025 14:02:15 -0600 Subject: [PATCH 44/71] [Hexagon] Improve QFP Optimizer (#166647) This patch enhances HexagonQFPOptimizer in multiple ways: 1. Refactor the code for better readability and maintainability. 2. Optimize vabs,vneg and vilog2 converts The three instruction mentioned can be optimized like below: ```v1.sf = v0.qf32 v2.qf = vneg v1.sf``` to ```v2.qf = vneg v0.qf32``` This optimization eliminates one conversion and is applicable to both qf32 and qf16 types. 3. Enable vsub fusion with mixed arguments Previously, QFPOptimizer did not fuse partial qfloat operands with vsub. This update allows selective use of vsub_hf_mix, vsub_sf_mix, vsub_qf16_mix, and vsub_qf32_mix when appropriate. It also enables QFP simplifications involving vector pair subregisters. Example scenario in a machine basic block targeting Hexagon: ```v1.qf32 = ... // result of a vadd v2.sf = v1.qf32 v3.qf32 = vmpy(v2.sf, v2.sf)``` 4. Remove redundant conversions Under certain conditions, we previously bailed out before removing qf-to-sf/hf conversions. This patch removes that bailout, enabling more aggressive elimination of unnecessary conversions. 5. Don't optimize equals feeding into multiply: Removing converts feeding into multiply loses precision. This patch avoids optimizing multiplies along with giving the users an option to enable this by a flag. Patch By: Fateme Hosseini Co-authored-by: Kaushik Kulkarni Co-authored-by: Santanu Das --- llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp | 13 + llvm/lib/Target/Hexagon/HexagonInstrInfo.h | 1 + .../Target/Hexagon/HexagonQFPOptimizer.cpp | 145 +++++-- .../CodeGen/Hexagon/autohvx/xqf-fixup-qfp1.ll | 372 ++++++++++++++++++ .../CodeGen/Hexagon/hvx-vsub-qf-sf-mix.ll | 60 +++ .../CodeGen/Hexagon/qfpopt-rem-conv-add.ll | 4 +- llvm/test/CodeGen/Hexagon/vect-qfp.mir | 202 ++++++++++ .../CodeGen/Hexagon/vect/vect-qfp-unary.mir | 97 +++++ 8 files changed, 860 insertions(+), 34 deletions(-) create mode 100644 llvm/test/CodeGen/Hexagon/autohvx/xqf-fixup-qfp1.ll create mode 100644 llvm/test/CodeGen/Hexagon/hvx-vsub-qf-sf-mix.ll create mode 100644 llvm/test/CodeGen/Hexagon/vect-qfp.mir create mode 100644 llvm/test/CodeGen/Hexagon/vect/vect-qfp-unary.mir diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp index 47726d6447ad8..55bafdea234fd 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -4753,6 +4753,19 @@ bool HexagonInstrInfo::getBundleNoShuf(const MachineInstr &MIB) const { return (Operand.isImm() && (Operand.getImm() & memShufDisabledMask) != 0); } +bool HexagonInstrInfo::isQFPMul(const MachineInstr *MI) const { + return (MI->getOpcode() == Hexagon::V6_vmpy_qf16_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf16_mix_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf32_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf32_mix_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf32_sf || + MI->getOpcode() == Hexagon::V6_vmpy_qf16_mix_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf16 || + MI->getOpcode() == Hexagon::V6_vmpy_qf32_mix_hf || + MI->getOpcode() == Hexagon::V6_vmpy_qf32_qf16 || + MI->getOpcode() == Hexagon::V6_vmpy_qf32); +} + // Addressing mode relations. short HexagonInstrInfo::changeAddrMode_abs_io(short Opc) const { return Opc >= 0 ? Hexagon::changeAddrMode_abs_io(Opc) : Opc; diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h index c17e5277ae2e7..48adf82833f51 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h @@ -532,6 +532,7 @@ class HexagonInstrInfo : public HexagonGenInstrInfo { } MCInst getNop() const override; + bool isQFPMul(const MachineInstr *MF) const; }; /// \brief Create RegSubRegPair from a register MachineOperand diff --git a/llvm/lib/Target/Hexagon/HexagonQFPOptimizer.cpp b/llvm/lib/Target/Hexagon/HexagonQFPOptimizer.cpp index f29a739cb5c07..8801f698effe5 100644 --- a/llvm/lib/Target/Hexagon/HexagonQFPOptimizer.cpp +++ b/llvm/lib/Target/Hexagon/HexagonQFPOptimizer.cpp @@ -58,7 +58,7 @@ // are PHI inst. // //===----------------------------------------------------------------------===// -#include + #define HEXAGON_QFP_OPTIMIZER "QFP optimizer pass" #include "Hexagon.h" @@ -86,6 +86,9 @@ using namespace llvm; cl::opt DisableQFOptimizer("disable-qfp-opt", cl::init(false), cl::desc("Disable optimization of Qfloat operations.")); +cl::opt DisableQFOptForMul( + "disable-qfp-opt-mul", cl::init(true), + cl::desc("Disable optimization of Qfloat operations for multiply.")); namespace { const std::map QFPInstMap{ @@ -101,11 +104,21 @@ const std::map QFPInstMap{ {Hexagon::V6_vmpy_qf16_mix_hf, Hexagon::V6_vmpy_qf16}, {Hexagon::V6_vmpy_qf32_hf, Hexagon::V6_vmpy_qf32_mix_hf}, {Hexagon::V6_vmpy_qf32_mix_hf, Hexagon::V6_vmpy_qf32_qf16}, - {Hexagon::V6_vmpy_qf32_sf, Hexagon::V6_vmpy_qf32}}; + {Hexagon::V6_vmpy_qf32_sf, Hexagon::V6_vmpy_qf32}, + {Hexagon::V6_vilog2_sf, Hexagon::V6_vilog2_qf32}, + {Hexagon::V6_vilog2_hf, Hexagon::V6_vilog2_qf16}, + {Hexagon::V6_vabs_qf32_sf, Hexagon::V6_vabs_qf32_qf32}, + {Hexagon::V6_vabs_qf16_hf, Hexagon::V6_vabs_qf16_qf16}, + {Hexagon::V6_vneg_qf32_sf, Hexagon::V6_vneg_qf32_qf32}, + {Hexagon::V6_vneg_qf16_hf, Hexagon::V6_vneg_qf16_qf16}}; } // namespace -namespace { +namespace llvm { +FunctionPass *createHexagonQFPOptimizer(); +void initializeHexagonQFPOptimizerPass(PassRegistry &); +} // namespace llvm +namespace { struct HexagonQFPOptimizer : public MachineFunctionPass { public: static char ID; @@ -116,6 +129,10 @@ struct HexagonQFPOptimizer : public MachineFunctionPass { bool optimizeQfp(MachineInstr *MI, MachineBasicBlock *MBB); + bool optimizeQfpTwoOp(MachineInstr *MI, MachineBasicBlock *MBB); + + bool optimizeQfpOneOp(MachineInstr *MI, MachineBasicBlock *MBB); + StringRef getPassName() const override { return HEXAGON_QFP_OPTIMIZER; } void getAnalysisUsage(AnalysisUsage &AU) const override { @@ -142,19 +159,69 @@ FunctionPass *llvm::createHexagonQFPOptimizer() { bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, MachineBasicBlock *MBB) { - // Early exit: - // - if instruction is invalid or has too few operands (QFP ops need 2 sources - // + 1 dest), - // - or does not have a transformation mapping. - if (MI->getNumOperands() < 3) + if (MI->getNumOperands() == 2) + return optimizeQfpOneOp(MI, MBB); + else if (MI->getNumOperands() == 3) + return optimizeQfpTwoOp(MI, MBB); + else return false; +} + +bool HexagonQFPOptimizer::optimizeQfpOneOp(MachineInstr *MI, + MachineBasicBlock *MBB) { + + unsigned Op0F = 0; auto It = QFPInstMap.find(MI->getOpcode()); if (It == QFPInstMap.end()) return false; + unsigned short InstTy = It->second; + // Get the reachind defs of MI + MachineInstr *DefMI = MRI->getVRegDef(MI->getOperand(1).getReg()); + MachineOperand &Res = MI->getOperand(0); + if (!Res.isReg()) + return false; + + LLVM_DEBUG(dbgs() << "\n[Reaching Defs of operands]: "; DefMI->dump()); + MachineInstr *ReachDefDef = nullptr; + + // Get the reaching def of the reaching def to check for W reg def + if (DefMI->getNumOperands() > 1 && DefMI->getOperand(1).isReg() && + DefMI->getOperand(1).getReg().isVirtual()) + ReachDefDef = MRI->getVRegDef(DefMI->getOperand(1).getReg()); + unsigned ReachDefOp = DefMI->getOpcode(); + MachineInstrBuilder MIB; + + // Check if the reaching def is a conversion + if (ReachDefOp == Hexagon::V6_vconv_sf_qf32 || + ReachDefOp == Hexagon::V6_vconv_hf_qf16) { + + // Return if the reaching def of reaching def is W type + if (ReachDefDef && MRI->getRegClass(ReachDefDef->getOperand(0).getReg()) == + &Hexagon::HvxWRRegClass) + return false; + + // Analyze the use operands of the conversion to get their KILL status + MachineOperand &SrcOp = DefMI->getOperand(1); + Op0F = getKillRegState(SrcOp.isKill()); + SrcOp.setIsKill(false); + MIB = BuildMI(*MBB, MI, MI->getDebugLoc(), HII->get(InstTy), Res.getReg()) + .addReg(SrcOp.getReg(), Op0F, SrcOp.getSubReg()); + LLVM_DEBUG(dbgs() << "\n[Inserting]: "; MIB.getInstr()->dump()); + return true; + } + return false; +} + +bool HexagonQFPOptimizer::optimizeQfpTwoOp(MachineInstr *MI, + MachineBasicBlock *MBB) { unsigned Op0F = 0; unsigned Op1F = 0; + auto It = QFPInstMap.find(MI->getOpcode()); + if (It == QFPInstMap.end()) + return false; + unsigned short InstTy = It->second; // Get the reaching defs of MI, DefMI1 and DefMI2 MachineInstr *DefMI1 = nullptr; MachineInstr *DefMI2 = nullptr; @@ -167,6 +234,9 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, return false; MachineOperand &Res = MI->getOperand(0); + if (!Res.isReg()) + return false; + MachineInstr *Inst1 = nullptr; MachineInstr *Inst2 = nullptr; LLVM_DEBUG(dbgs() << "\n[Reaching Defs of operands]: "; DefMI1->dump(); @@ -185,7 +255,8 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, unsigned Def2OP = DefMI2->getOpcode(); MachineInstrBuilder MIB; - // Case 1: Both reaching defs of MI are qf to sf/hf conversions + + // Check if the both the reaching defs of MI are qf to sf/hf conversions if ((Def1OP == Hexagon::V6_vconv_sf_qf32 && Def2OP == Hexagon::V6_vconv_sf_qf32) || (Def1OP == Hexagon::V6_vconv_hf_qf16 && @@ -226,7 +297,7 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, LLVM_DEBUG(dbgs() << "\n[Inserting]: "; MIB.getInstr()->dump()); return true; - // Case 2: Left operand is conversion to sf/hf + // Check if left operand's reaching def is a conversion to sf/hf } else if (((Def1OP == Hexagon::V6_vconv_sf_qf32 && Def2OP != Hexagon::V6_vconv_sf_qf32) || (Def1OP == Hexagon::V6_vconv_hf_qf16 && @@ -250,7 +321,7 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, LLVM_DEBUG(dbgs() << "\n[Inserting]: "; MIB.getInstr()->dump()); return true; - // Case 2: Left operand is conversion to sf/hf + // Check if right operand's reaching def is a conversion to sf/hf } else if (((Def1OP != Hexagon::V6_vconv_sf_qf32 && Def2OP == Hexagon::V6_vconv_sf_qf32) || (Def1OP != Hexagon::V6_vconv_hf_qf16 && @@ -258,13 +329,6 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, !DefMI1->isPHI() && (MI->getOpcode() != Hexagon::V6_vmpy_qf32_sf)) { // The second operand of original instruction is converted. - // In "mix" instructions, "qf" operand is always the first operand. - - // Caveat: vsub is not commutative w.r.t operands. - if (InstTy == Hexagon::V6_vsub_qf16_mix || - InstTy == Hexagon::V6_vsub_qf32_mix) - return false; - if (Inst2 && MRI->getRegClass(Inst2->getOperand(0).getReg()) == &Hexagon::HvxWRRegClass) return false; @@ -275,10 +339,26 @@ bool HexagonQFPOptimizer::optimizeQfp(MachineInstr *MI, Op1F = getKillRegState(Src2.isKill()); Src2.setIsKill(false); Op0F = getKillRegState(Src1.isKill()); - MIB = BuildMI(*MBB, MI, MI->getDebugLoc(), HII->get(InstTy), Res.getReg()) - .addReg(Src2.getReg(), Op1F, - Src2.getSubReg()) // Notice the operands are flipped. - .addReg(Src1.getReg(), Op0F, Src1.getSubReg()); + if (InstTy == Hexagon::V6_vsub_qf16_mix || + InstTy == Hexagon::V6_vsub_qf32_mix) { + if (!HST->useHVXV81Ops()) + // vsub_(hf|sf)_mix insts are only avlbl on hvx81+ + return false; + // vsub is not commutative w.r.t. operands -> treat it as a special case + // to choose the correct mix instruction. + if (Def2OP == Hexagon::V6_vconv_sf_qf32) + InstTy = Hexagon::V6_vsub_sf_mix; + else if (Def2OP == Hexagon::V6_vconv_hf_qf16) + InstTy = Hexagon::V6_vsub_hf_mix; + MIB = BuildMI(*MBB, MI, MI->getDebugLoc(), HII->get(InstTy), Res.getReg()) + .addReg(Src1.getReg(), Op0F, Src1.getSubReg()) + .addReg(Src2.getReg(), Op1F, Src2.getSubReg()); + } else { + MIB = BuildMI(*MBB, MI, MI->getDebugLoc(), HII->get(InstTy), Res.getReg()) + .addReg(Src2.getReg(), Op1F, + Src2.getSubReg()) // Notice the operands are flipped. + .addReg(Src1.getReg(), Op0F, Src1.getSubReg()); + } LLVM_DEBUG(dbgs() << "\n[Inserting]: "; MIB.getInstr()->dump()); return true; } @@ -309,15 +389,18 @@ bool HexagonQFPOptimizer::runOnMachineFunction(MachineFunction &MF) { while (MII != MBBI->instr_end()) { MachineInstr *MI = &*MII; ++MII; // As MI might be removed. - - if (QFPInstMap.count(MI->getOpcode()) && - MI->getOpcode() != Hexagon::V6_vconv_sf_qf32 && - MI->getOpcode() != Hexagon::V6_vconv_hf_qf16) { - LLVM_DEBUG(dbgs() << "\n###Analyzing for removal: "; MI->dump()); - if (optimizeQfp(MI, MBB)) { - MI->eraseFromParent(); - LLVM_DEBUG(dbgs() << "\t....Removing...."); - Changed = true; + if (QFPInstMap.count(MI->getOpcode())) { + auto OpC = MI->getOpcode(); + if (DisableQFOptForMul && HII->isQFPMul(MI)) + continue; + if (OpC != Hexagon::V6_vconv_sf_qf32 && + OpC != Hexagon::V6_vconv_hf_qf16) { + LLVM_DEBUG(dbgs() << "\n###Analyzing for removal: "; MI->dump()); + if (optimizeQfp(MI, MBB)) { + MI->eraseFromParent(); + LLVM_DEBUG(dbgs() << "\t....Removing...."); + Changed = true; + } } } } diff --git a/llvm/test/CodeGen/Hexagon/autohvx/xqf-fixup-qfp1.ll b/llvm/test/CodeGen/Hexagon/autohvx/xqf-fixup-qfp1.ll new file mode 100644 index 0000000000000..9625a605910c2 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/autohvx/xqf-fixup-qfp1.ll @@ -0,0 +1,372 @@ +; REQUIRES: hexagon-registered-target, silver +; This tests correct handling of register spills and fills of +; qf operands during register allocation. + +; RUN: llc -mcpu=hexagonv79 -mattr=+hvx-length128b,+hvxv79,+hvx-ieee-fp,+hvx-qfloat,-long-calls -debug-only=handle-qfp %s 2>&1 -o - | FileCheck %s --check-prefixes V79-81,V79 +; RUN: llc -mcpu=hexagonv81 -mattr=+hvx-length128b,+hvxv81,+hvx-ieee-fp,+hvx-qfloat,-long-calls -debug-only=handle-qfp %s 2>&1 -o - | FileCheck %s --check-prefixes V79-81,V81 + +; V79-81: Finding uses of: renamable $w{{[0-9]+}} = V6_vmpy_qf32_hf +; V79-81: Inserting after conv: [[VREG0:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG0]] +; V79-81-NEXT: Inserting after conv: [[VREG1:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG1]] +; V79-81: Finding uses of: renamable $w{{[0-9]+}} = V6_vmpy_qf32_hf +; V79-81: Inserting after conv: [[VREG2:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG2]] +; V79-81-NEXT: Inserting after conv: [[VREG3:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG3]] +; V79-81: Finding uses of: renamable $w{{[0-9]+}} = V6_vmpy_qf32_hf +; V79-81-DAG: Inserting after conv: [[VREG4:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG4]] +; V79-81-DAG: Inserting after conv: [[VREG5:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable [[VREG5]] +; V79-81-DAG: Inserting new instruction: $v{{[0-9]+}} = V6_vadd_sf killed renamable [[VREG2]], killed renamable [[VREG0]] +; V79-81-DAG: Inserting new instruction: $v{{[0-9]+}} = V6_vsub_sf killed renamable $v{{[0-9]+}}, killed renamable $v{{[0-9]+}} +; +; V79-81: Analyzing convert instruction: renamable [[VREG6:\$v[0-9]+]] = V6_vconv_hf_qf32 killed renamable $w{{[0-9]+}} +; V79: Inserting new instruction: [[VREG30:\$v[0-9]+]] = V6_vd0 +; V79-NEXT: Inserting new instruction: [[VREG7:\$v[0-9]+]] = V6_vadd_sf killed renamable [[VREG7]], killed [[VREG30]] +; V79: Inserting new instruction: [[VREG30]] = V6_vd0 +; V79-NEXT: Inserting new instruction: [[VREG8:\$v[0-9]+]] = V6_vadd_sf killed renamable [[VREG8]], killed [[VREG30]] +; V81: Inserting new instruction: [[VREG7:\$v[0-9]+]] = V6_vconv_qf32_sf killed renamable [[VREG7]] +; V81: Inserting new instruction: [[VREG8:\$v[0-9]+]] = V6_vconv_qf32_sf killed renamable [[VREG8]] + +; V79-81: Analyzing convert instruction: renamable [[VREG9:\$v[0-9]+]] = V6_vconv_sf_qf32 killed renamable $v{{[0-9]+}} +; V79: Inserting new instruction: [[VREG30]] = V6_vd0 +; V79-NEXT: Inserting new instruction: [[VREG10:\$v[0-9]+]] = V6_vadd_sf killed renamable [[VREG10]], killed [[VREG30]] +; V81: Inserting new instruction: [[VREG8:\$v[0-9]+]] = V6_vconv_qf32_sf killed renamable [[VREG8]] + +target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" +target triple = "hexagon" + +@.str.1 = private unnamed_addr constant [9 x i8] c"0x%08lx \00", align 1 +@.str.3 = private unnamed_addr constant [173 x i8] c"/prj/qct/llvm/devops/aether/hexbuild/test_trees/MASTER/test/regress/features/hexagon/arch_v68/hvx_ieee_fp/hvx_ieee_fp_test.c:126 0 && \22ERROR: Failed to acquire HVX unit.\\n\22\00", align 1 +@__func__.main = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@.str.5 = private unnamed_addr constant [33 x i8] c"half -3 converted to vhf = %.2f\0A\00", align 1 +@.str.6 = private unnamed_addr constant [35 x i8] c"uhalf 32k converted to vhf = %.2f\0A\00", align 1 +@.str.7 = private unnamed_addr constant [32 x i8] c"sf 0.5 converted to vhf = %.2f\0A\00", align 1 +@.str.8 = private unnamed_addr constant [32 x i8] c"vhf 4.0 conveted to ubyte = %d\0A\00", align 1 +@.str.9 = private unnamed_addr constant [32 x i8] c"vhf 2.0 conveted to uhalf = %d\0A\00", align 1 +@.str.10 = private unnamed_addr constant [30 x i8] c"byte 4 conveted to hf = %.2f\0A\00", align 1 +@.str.11 = private unnamed_addr constant [31 x i8] c"ubyte 4 conveted to hf = %.2f\0A\00", align 1 +@.str.12 = private unnamed_addr constant [27 x i8] c"hf -3 conveted to sf = %f\0A\00", align 1 +@.str.13 = private unnamed_addr constant [31 x i8] c"vhf 4.0 conveted to byte = %d\0A\00", align 1 +@.str.14 = private unnamed_addr constant [31 x i8] c"vhf 4.0 conveted to half = %d\0A\00", align 1 +@.str.16 = private unnamed_addr constant [33 x i8] c"max of hf 2.0 and hf 4.0 = %.2f\0A\00", align 1 +@.str.17 = private unnamed_addr constant [33 x i8] c"min of hf 2.0 and hf 4.0 = %.2f\0A\00", align 1 +@.str.18 = private unnamed_addr constant [32 x i8] c"max of sf 0.5 and sf 0.25 = %f\0A\00", align 1 +@.str.19 = private unnamed_addr constant [32 x i8] c"min of sf 0.5 and sf 0.25 = %f\0A\00", align 1 +@.str.21 = private unnamed_addr constant [25 x i8] c"negate of hf 4.0 = %.2f\0A\00", align 1 +@.str.22 = private unnamed_addr constant [23 x i8] c"abs of hf -6.0 = %.2f\0A\00", align 1 +@.str.23 = private unnamed_addr constant [23 x i8] c"negate of sf 0.5 = %f\0A\00", align 1 +@.str.24 = private unnamed_addr constant [22 x i8] c"abs of sf -0.25 = %f\0A\00", align 1 +@.str.26 = private unnamed_addr constant [32 x i8] c"hf add of 4.0 and -6.0 = %.2f\0A\00", align 1 +@.str.27 = private unnamed_addr constant [32 x i8] c"hf sub of 4.0 and -6.0 = %.2f\0A\00", align 1 +@.str.28 = private unnamed_addr constant [31 x i8] c"sf add of 0.5 and -0.25 = %f\0A\00", align 1 +@.str.29 = private unnamed_addr constant [31 x i8] c"sf sub of 0.5 and -0.25 = %f\0A\00", align 1 +@.str.30 = private unnamed_addr constant [36 x i8] c"sf add of hf 4.0 and hf -6.0 = %f\0A\00", align 1 +@.str.31 = private unnamed_addr constant [36 x i8] c"sf sub of hf 4.0 and hf -6.0 = %f\0A\00", align 1 +@.str.33 = private unnamed_addr constant [32 x i8] c"hf mpy of 4.0 and -6.0 = %.2f\0A\00", align 1 +@.str.34 = private unnamed_addr constant [35 x i8] c"hf accmpy of 4.0 and -6.0 = %.2f\0A\00", align 1 +@.str.35 = private unnamed_addr constant [36 x i8] c"sf mpy of hf 4.0 and hf -6.0 = %f\0A\00", align 1 +@.str.36 = private unnamed_addr constant [39 x i8] c"sf accmpy of hf 4.0 and hf -6.0 = %f\0A\00", align 1 +@.str.37 = private unnamed_addr constant [31 x i8] c"sf mpy of 0.5 and -0.25 = %f\0A\00", align 1 +@.str.39 = private unnamed_addr constant [25 x i8] c"w copy from sf 0.5 = %f\0A\00", align 1 +@str = private unnamed_addr constant [35 x i8] c"ERROR: Failed to acquire HVX unit.\00", align 1 +@str.40 = private unnamed_addr constant [25 x i8] c"\0AConversion intructions\0A\00", align 1 +@str.41 = private unnamed_addr constant [23 x i8] c"\0AMin/Max instructions\0A\00", align 1 +@str.42 = private unnamed_addr constant [23 x i8] c"\0Aabs/neg instructions\0A\00", align 1 +@str.43 = private unnamed_addr constant [23 x i8] c"\0Aadd/sub instructions\0A\00", align 1 +@str.44 = private unnamed_addr constant [24 x i8] c"\0Amultiply instructions\0A\00", align 1 +@str.45 = private unnamed_addr constant [19 x i8] c"\0Acopy instruction\0A\00", align 1 + +declare dso_local void @print_vector_words(<32 x i32> noundef %x) local_unnamed_addr #0 + +; Function Attrs: nofree nounwind optsize +declare dso_local noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #0 + +; Function Attrs: nounwind optsize +define dso_local i32 @main(i32 noundef %argc, ptr nocapture noundef readnone %argv) local_unnamed_addr #1 { +entry: + %call = tail call i32 @acquire_vector_unit(i8 noundef zeroext 0) #6 + %tobool.not = icmp eq i32 %call, 0 + br i1 %tobool.not, label %if.then, label %if.end + +if.then: ; preds = %entry + %puts = tail call i32 @puts(ptr nonnull dereferenceable(1) @str) + tail call void @_Assert(ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.main) #7 + unreachable + +if.end: ; preds = %entry + tail call void @set_double_vector_mode() #6 + %0 = tail call <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32 16384) + %1 = tail call <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32 17408) + %2 = tail call <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32 -14848) + %3 = tail call <32 x i32> @llvm.hexagon.V6.lvsplatw.128B(i32 1056964608) + %4 = tail call <32 x i32> @llvm.hexagon.V6.lvsplatw.128B(i32 1048576000) + %5 = tail call <32 x i32> @llvm.hexagon.V6.lvsplatw.128B(i32 -1098907648) + %6 = tail call <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32 -3) + %7 = tail call <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32 32768) + %puts147 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.40) + %8 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.hf.h.128B(<32 x i32> %6) + %bc.i = bitcast <32 x i32> %8 to <64 x half> + %9 = extractelement <64 x half> %bc.i, i64 0 + %conv = fpext half %9 to double + %call12 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %conv) #6 + %10 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.hf.uh.128B(<32 x i32> %7) + %bc.i153 = bitcast <32 x i32> %10 to <64 x half> + %11 = extractelement <64 x half> %bc.i153, i64 0 + %conv14 = fpext half %11 to double + %call15 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6, double noundef %conv14) #6 + %12 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.hf.sf.128B(<32 x i32> %3, <32 x i32> %3) + %bc.i155 = bitcast <32 x i32> %12 to <64 x half> + %13 = extractelement <64 x half> %bc.i155, i64 0 + %conv17 = fpext half %13 to double + %call18 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %conv17) #6 + %14 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.ub.hf.128B(<32 x i32> %1, <32 x i32> %1) + %15 = bitcast <32 x i32> %14 to <128 x i8> + %conv.i = extractelement <128 x i8> %15, i64 0 + %conv20 = zext i8 %conv.i to i32 + %call21 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8, i32 noundef %conv20) #6 + %16 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.uh.hf.128B(<32 x i32> %0) + %17 = bitcast <32 x i32> %16 to <64 x i16> + %conv.i157 = extractelement <64 x i16> %17, i64 0 + %conv23 = sext i16 %conv.i157 to i32 + %call24 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9, i32 noundef %conv23) #6 + %18 = tail call <64 x i32> @llvm.hexagon.V6.vcvt.hf.b.128B(<32 x i32> %14) + %bc.i158 = bitcast <64 x i32> %18 to <128 x half> + %19 = extractelement <128 x half> %bc.i158, i64 0 + %conv26 = fpext half %19 to double + %call27 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10, double noundef %conv26) #6 + %20 = tail call <64 x i32> @llvm.hexagon.V6.vcvt.hf.ub.128B(<32 x i32> %14) + %bc.i159 = bitcast <64 x i32> %20 to <128 x half> + %21 = extractelement <128 x half> %bc.i159, i64 0 + %conv29 = fpext half %21 to double + %call30 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %conv29) #6 + %22 = tail call <64 x i32> @llvm.hexagon.V6.vcvt.sf.hf.128B(<32 x i32> %8) + %bc.i161 = bitcast <64 x i32> %22 to <64 x float> + %23 = extractelement <64 x float> %bc.i161, i64 0 + %conv32 = fpext float %23 to double + %call33 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %conv32) #6 + %24 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.b.hf.128B(<32 x i32> %1, <32 x i32> %1) + %25 = bitcast <32 x i32> %24 to <128 x i8> + %conv.i162 = extractelement <128 x i8> %25, i64 0 + %conv35 = zext i8 %conv.i162 to i32 + %call36 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, i32 noundef %conv35) #6 + %26 = tail call <32 x i32> @llvm.hexagon.V6.vcvt.h.hf.128B(<32 x i32> %1) + %27 = bitcast <32 x i32> %26 to <64 x i16> + %conv.i163 = extractelement <64 x i16> %27, i64 0 + %conv38 = sext i16 %conv.i163 to i32 + %call39 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, i32 noundef %conv38) #6 + %28 = tail call <32 x i32> @llvm.hexagon.V6.vfmax.hf.128B(<32 x i32> %0, <32 x i32> %1) + %puts148 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.41) + %bc.i164 = bitcast <32 x i32> %28 to <64 x half> + %29 = extractelement <64 x half> %bc.i164, i64 0 + %conv42 = fpext half %29 to double + %call43 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %conv42) #6 + %30 = tail call <32 x i32> @llvm.hexagon.V6.vfmin.hf.128B(<32 x i32> %0, <32 x i32> %1) + %bc.i166 = bitcast <32 x i32> %30 to <64 x half> + %31 = extractelement <64 x half> %bc.i166, i64 0 + %conv45 = fpext half %31 to double + %call46 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, double noundef %conv45) #6 + %32 = tail call <32 x i32> @llvm.hexagon.V6.vfmax.sf.128B(<32 x i32> %3, <32 x i32> %4) + %bc.i168 = bitcast <32 x i32> %32 to <32 x float> + %33 = extractelement <32 x float> %bc.i168, i64 0 + %conv48 = fpext float %33 to double + %call49 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef %conv48) #6 + %34 = tail call <32 x i32> @llvm.hexagon.V6.vfmin.sf.128B(<32 x i32> %3, <32 x i32> %4) + %bc.i169 = bitcast <32 x i32> %34 to <32 x float> + %35 = extractelement <32 x float> %bc.i169, i64 0 + %conv51 = fpext float %35 to double + %call52 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, double noundef %conv51) #6 + %puts149 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.42) + %36 = tail call <32 x i32> @llvm.hexagon.V6.vfneg.hf.128B(<32 x i32> %1) + %bc.i170 = bitcast <32 x i32> %36 to <64 x half> + %37 = extractelement <64 x half> %bc.i170, i64 0 + %conv55 = fpext half %37 to double + %call56 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.21, double noundef %conv55) #6 + %38 = tail call <32 x i32> @llvm.hexagon.V6.vabs.hf.128B(<32 x i32> %2) + %bc.i172 = bitcast <32 x i32> %38 to <64 x half> + %39 = extractelement <64 x half> %bc.i172, i64 0 + %conv58 = fpext half %39 to double + %call59 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.22, double noundef %conv58) #6 + %40 = tail call <32 x i32> @llvm.hexagon.V6.vfneg.sf.128B(<32 x i32> %3) + %bc.i174 = bitcast <32 x i32> %40 to <32 x float> + %41 = extractelement <32 x float> %bc.i174, i64 0 + %conv61 = fpext float %41 to double + %call62 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.23, double noundef %conv61) #6 + %42 = tail call <32 x i32> @llvm.hexagon.V6.vabs.sf.128B(<32 x i32> %5) + %bc.i175 = bitcast <32 x i32> %42 to <32 x float> + %43 = extractelement <32 x float> %bc.i175, i64 0 + %conv64 = fpext float %43 to double + %call65 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.24, double noundef %conv64) #6 + %puts150 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.43) + %44 = tail call <32 x i32> @llvm.hexagon.V6.vadd.hf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i176 = bitcast <32 x i32> %44 to <64 x half> + %45 = extractelement <64 x half> %bc.i176, i64 0 + %conv68 = fpext half %45 to double + %call69 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.26, double noundef %conv68) #6 + %46 = tail call <32 x i32> @llvm.hexagon.V6.vsub.hf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i178 = bitcast <32 x i32> %46 to <64 x half> + %47 = extractelement <64 x half> %bc.i178, i64 0 + %conv71 = fpext half %47 to double + %call72 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.27, double noundef %conv71) #6 + %48 = tail call <32 x i32> @llvm.hexagon.V6.vadd.sf.sf.128B(<32 x i32> %3, <32 x i32> %5) + %bc.i180 = bitcast <32 x i32> %48 to <32 x float> + %49 = extractelement <32 x float> %bc.i180, i64 0 + %conv74 = fpext float %49 to double + %call75 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.28, double noundef %conv74) #6 + %50 = tail call <32 x i32> @llvm.hexagon.V6.vsub.sf.sf.128B(<32 x i32> %3, <32 x i32> %5) + %bc.i181 = bitcast <32 x i32> %50 to <32 x float> + %51 = extractelement <32 x float> %bc.i181, i64 0 + %conv77 = fpext float %51 to double + %call78 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %conv77) #6 + %52 = tail call <64 x i32> @llvm.hexagon.V6.vadd.sf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i182 = bitcast <64 x i32> %52 to <64 x float> + %53 = extractelement <64 x float> %bc.i182, i64 0 + %conv80 = fpext float %53 to double + %call81 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.30, double noundef %conv80) #6 + %54 = tail call <64 x i32> @llvm.hexagon.V6.vsub.sf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i183 = bitcast <64 x i32> %54 to <64 x float> + %55 = extractelement <64 x float> %bc.i183, i64 0 + %conv83 = fpext float %55 to double + %call84 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.31, double noundef %conv83) #6 + %puts151 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.44) + %56 = tail call <32 x i32> @llvm.hexagon.V6.vmpy.hf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i184 = bitcast <32 x i32> %56 to <64 x half> + %57 = extractelement <64 x half> %bc.i184, i64 0 + %conv87 = fpext half %57 to double + %call88 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, double noundef %conv87) #6 + %58 = tail call <32 x i32> @llvm.hexagon.V6.vmpy.hf.hf.acc.128B(<32 x i32> %56, <32 x i32> %1, <32 x i32> %2) + %bc.i186 = bitcast <32 x i32> %58 to <64 x half> + %59 = extractelement <64 x half> %bc.i186, i64 0 + %conv90 = fpext half %59 to double + %call91 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, double noundef %conv90) #6 + %60 = tail call <64 x i32> @llvm.hexagon.V6.vmpy.sf.hf.128B(<32 x i32> %1, <32 x i32> %2) + %bc.i188 = bitcast <64 x i32> %60 to <64 x float> + %61 = extractelement <64 x float> %bc.i188, i64 0 + %conv93 = fpext float %61 to double + %call94 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.35, double noundef %conv93) #6 + %62 = tail call <64 x i32> @llvm.hexagon.V6.vmpy.sf.hf.acc.128B(<64 x i32> %60, <32 x i32> %1, <32 x i32> %2) + %bc.i189 = bitcast <64 x i32> %62 to <64 x float> + %63 = extractelement <64 x float> %bc.i189, i64 0 + %conv96 = fpext float %63 to double + %call97 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.36, double noundef %conv96) #6 + %64 = tail call <32 x i32> @llvm.hexagon.V6.vmpy.sf.sf.128B(<32 x i32> %3, <32 x i32> %5) + %bc.i190 = bitcast <32 x i32> %64 to <32 x float> + %65 = extractelement <32 x float> %bc.i190, i64 0 + %conv99 = fpext float %65 to double + %call100 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.37, double noundef %conv99) #6 + %puts152 = tail call i32 @puts(ptr nonnull dereferenceable(1) @str.45) + %66 = tail call <32 x i32> @llvm.hexagon.V6.vassign.fp.128B(<32 x i32> %3) + %bc.i191 = bitcast <32 x i32> %66 to <32 x float> + %67 = extractelement <32 x float> %bc.i191, i64 0 + %conv103 = fpext float %67 to double + %call104 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.39, double noundef %conv103) #6 + ret i32 0 +} + +; Function Attrs: optsize +declare dso_local i32 @acquire_vector_unit(i8 noundef zeroext) local_unnamed_addr #2 + +; Function Attrs: noreturn nounwind optsize +declare dso_local void @_Assert(ptr noundef, ptr noundef) local_unnamed_addr #3 + +; Function Attrs: optsize +declare dso_local void @set_double_vector_mode(...) local_unnamed_addr #2 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.hf.h.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.hf.uh.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.hf.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.ub.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.uh.hf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vcvt.hf.b.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vcvt.hf.ub.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vcvt.sf.hf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.b.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vcvt.h.hf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfmax.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfmin.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfmax.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfmin.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfneg.hf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vabs.hf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vfneg.sf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vabs.sf.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vadd.hf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vsub.hf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vadd.sf.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vsub.sf.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vadd.sf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vsub.sf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vmpy.hf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vmpy.hf.hf.acc.128B(<32 x i32>, <32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vmpy.sf.hf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <64 x i32> @llvm.hexagon.V6.vmpy.sf.hf.acc.128B(<64 x i32>, <32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vmpy.sf.sf.128B(<32 x i32>, <32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.vassign.fp.128B(<32 x i32>) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.lvsplath.128B(i32) #4 + +; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) +declare <32 x i32> @llvm.hexagon.V6.lvsplatw.128B(i32) #4 + +; Function Attrs: nofree nounwind +declare noundef i32 @putchar(i32 noundef) local_unnamed_addr #5 + +; Function Attrs: nofree nounwind +declare noundef i32 @puts(ptr nocapture noundef readonly) local_unnamed_addr #5 diff --git a/llvm/test/CodeGen/Hexagon/hvx-vsub-qf-sf-mix.ll b/llvm/test/CodeGen/Hexagon/hvx-vsub-qf-sf-mix.ll new file mode 100644 index 0000000000000..cdb779f5c4e7d --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/hvx-vsub-qf-sf-mix.ll @@ -0,0 +1,60 @@ +;; RUN: llc --mtriple=hexagon --mcpu=hexagonv81 --mattr=+hvxv81,+hvx-length128b %s -o - | FileCheck %s + +define void @mul_and_sub_1(ptr readonly %A, ptr readonly %B, ptr readonly %C, ptr writeonly %D) { +entry: + %AVec = load <32 x float>, ptr %A, align 4 + %BVec = load <32 x float>, ptr %B, align 4 + %CVec = load <32 x float>, ptr %C, align 4 + %AtBVec = fmul <32 x float> %AVec, %BVec + + %DVec = fsub <32 x float> %CVec, %AtBVec + store <32 x float> %DVec, ptr %D, align 4 + ret void +} +;; CHECK: mul_and_sub_1 +;; CHECK: vsub(v{{[0-9]+}}.sf,v{{[0-9]+}}.qf32) + + +define void @mul_and_sub_2(ptr readonly %A, ptr readonly %B, ptr readonly %C, ptr writeonly %D) { +entry: + %AVec = load <32 x float>, ptr %A, align 4 + %BVec = load <32 x float>, ptr %B, align 4 + %CVec = load <32 x float>, ptr %C, align 4 + %AtBVec = fmul <32 x float> %AVec, %BVec + + %DVec = fsub <32 x float> %AtBVec, %CVec + store <32 x float> %DVec, ptr %D, align 4 + ret void +} +;; CHECK: mul_and_sub_2 +;; CHECK: vsub(v{{[0-9]+}}.qf32,v{{[0-9]+}}.sf) + + +define void @mul_and_sub_3(ptr readonly %A, ptr readonly %B, ptr readonly %C, ptr writeonly %D) { +entry: + %AVec = load <64 x half>, ptr %A, align 4 + %BVec = load <64 x half>, ptr %B, align 4 + %CVec = load <64 x half>, ptr %C, align 4 + %AtBVec = fmul <64 x half> %AVec, %BVec + + %DVec = fsub <64 x half> %CVec, %AtBVec + store <64 x half> %DVec, ptr %D, align 4 + ret void +} +;; CHECK: mul_and_sub_3 +;; CHECK: vsub(v{{[0-9]+}}.hf,v{{[0-9]+}}.qf16) + + +define void @mul_and_sub_4(ptr readonly %A, ptr readonly %B, ptr readonly %C, ptr writeonly %D) { +entry: + %AVec = load <64 x half>, ptr %A, align 4 + %BVec = load <64 x half>, ptr %B, align 4 + %CVec = load <64 x half>, ptr %C, align 4 + %AtBVec = fmul <64 x half> %AVec, %BVec + + %DVec = fsub <64 x half> %AtBVec, %CVec + store <64 x half> %DVec, ptr %D, align 4 + ret void +} +;; CHECK: mul_and_sub_4 +;; CHECK: vsub(v{{[0-9]+}}.qf16,v{{[0-9]+}}.hf) diff --git a/llvm/test/CodeGen/Hexagon/qfpopt-rem-conv-add.ll b/llvm/test/CodeGen/Hexagon/qfpopt-rem-conv-add.ll index c16370c3b907d..527f27e56c334 100644 --- a/llvm/test/CodeGen/Hexagon/qfpopt-rem-conv-add.ll +++ b/llvm/test/CodeGen/Hexagon/qfpopt-rem-conv-add.ll @@ -2,7 +2,7 @@ ; type as first parameter instead of a sf type without ; any conversion instruction of type sf = qf32 -; RUN: llc -mtriple=hexagon < %s -o - | FileCheck %s +; RUN: llc -mtriple=hexagon -mattr=+hvx-length128b,+hvxv75,+v75 < %s -o - | FileCheck %s ; CHECK: [[V2:v[0-9]+]] = vxor([[V2]],[[V2]]) ; CHECK: [[V0:v[0-9]+]].qf32 = vmpy([[V0]].sf,[[V2]].sf) @@ -17,5 +17,3 @@ entry: store <64 x half> %conv17.ripple.vectorized, ptr %out_ptr, align 2 ret void } - -attributes #0 = { "target-features"="+hvx-length128b,+hvxv75,+v75,-long-calls,-small-data" } diff --git a/llvm/test/CodeGen/Hexagon/vect-qfp.mir b/llvm/test/CodeGen/Hexagon/vect-qfp.mir new file mode 100644 index 0000000000000..6909591ffddf0 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/vect-qfp.mir @@ -0,0 +1,202 @@ +# RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ +# RUN: -run-pass hexagon-qfp-optimizer -disable-qfp-opt-mul=false %s -o - | FileCheck %s --check-prefix=MUL-ENABLED +# RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ +# RUN: -run-pass hexagon-qfp-optimizer %s -o - | FileCheck %s --check-prefix=DEFAULT +# MUL-ENABLED-LABEL: name: qfpAdd32 +# MUL-ENABLED: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vadd_qf32_mix +# MUL-ENABLED-NEXT: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# MUL-ENABLED-NEXT: V6_vadd_qf32 +# DEFAULT-LABEL: name: qfpAdd32 +# DEFAULT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vadd_qf32_mix +# DEFAULT-NEXT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vS32Ub_ai +# DEFAULT-NEXT: V6_vadd_qf32 +--- +name: qfpAdd32 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vadd_sf %4:hvxvr, %5:hvxvr + %7:hvxvr = V6_vconv_sf_qf32 %6:hvxvr + %8:hvxvr = V6_vadd_sf %5:hvxvr, %7:hvxvr + %9:hvxvr = V6_vconv_sf_qf32 %8:hvxvr + V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr + %10:hvxvr = V6_vadd_sf %7:hvxvr, %9:hvxvr + %11:hvxvr = V6_vconv_sf_qf32 %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr +... +# MUL-ENABLED-LABEL: name: qfpAdd16 +# MUL-ENABLED: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vadd_qf16_mix +# MUL-ENABLED-NEXT: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# MUL-ENABLED-NEXT: V6_vadd_qf16 +# DEFAULT-LABEL: name: qfpAdd16 +# DEFAULT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vadd_qf16_mix +# DEFAULT-NEXT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vS32Ub_ai +# DEFAULT-NEXT: V6_vadd_qf16 +--- +name: qfpAdd16 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vadd_hf %4:hvxvr, %5:hvxvr + %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr + %8:hvxvr = V6_vadd_hf %5:hvxvr, %7:hvxvr + %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr + V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr + %10:hvxvr = V6_vadd_hf %7:hvxvr, %9:hvxvr + %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr +... +# MUL-ENABLED-LABEL: name: qfpSub32 +# MUL-ENABLED: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vsub_qf32_mix +# MUL-ENABLED-NEXT: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# MUL-ENABLED-NEXT: V6_vsub_qf32 +# DEFAULT-LABEL: name: qfpSub32 +# DEFAULT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vsub_qf32_mix +# DEFAULT-NEXT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vS32Ub_ai +# DEFAULT-NEXT: V6_vsub_qf32 +--- +name: qfpSub32 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vsub_sf %4:hvxvr, %5:hvxvr + %7:hvxvr = V6_vconv_sf_qf32 %6:hvxvr + %8:hvxvr = V6_vsub_sf %7:hvxvr, %5:hvxvr + %9:hvxvr = V6_vconv_sf_qf32 %8:hvxvr + V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr + %10:hvxvr = V6_vsub_sf %7:hvxvr, %9:hvxvr + %11:hvxvr = V6_vconv_sf_qf32 %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr +... +# MUL-ENABLED-LABEL: name: qfpSub16 +# MUL-ENABLED: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vsub_qf16_mix +# MUL-ENABLED-NEXT: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# MUL-ENABLED-NEXT: V6_vsub_qf16 +# DEFAULT-LABEL: name: qfpSub16 +# DEFAULT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vsub_qf16_mix +# DEFAULT-NEXT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vS32Ub_ai +# DEFAULT-NEXT: V6_vsub_qf16 +--- +name: qfpSub16 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vsub_hf %4:hvxvr, %5:hvxvr + %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr + %8:hvxvr = V6_vsub_hf %7:hvxvr, %5:hvxvr + %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr + V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr + %10:hvxvr = V6_vsub_hf %7:hvxvr, %9:hvxvr + %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr +... +# MUL-ENABLED-LABEL: name: qfpMul32 +# MUL-ENABLED: V6_vmpy_qf32_sf +# MUL-ENABLED-NEXT: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vmpy_qf32_sf +# MUL-ENABLED-NEXT: V6_vconv_sf_qf32 +# MUL-ENABLED-NEXT: V6_vmpy_qf32 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# DEFAULT-LABEL: name: qfpMul32 +# DEFAULT: V6_vmpy_qf32_sf +# DEFAULT-NEXT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vmpy_qf32_sf +# DEFAULT-NEXT: V6_vconv_sf_qf32 +# DEFAULT-NEXT: V6_vmpy_qf32_sf +# DEFAULT-NEXT: V6_vS32Ub_ai +--- +name: qfpMul32 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vL32Ub_ai %2:intregs, 0 + %7:hvxvr = V6_vmpy_qf32_sf %4:hvxvr, %5:hvxvr + %8:hvxvr = V6_vconv_sf_qf32 %7:hvxvr + %9:hvxvr = V6_vmpy_qf32_sf %5:hvxvr, %6:hvxvr + %10:hvxvr = V6_vconv_sf_qf32 %9:hvxvr + %11:hvxvr = V6_vmpy_qf32_sf %8:hvxvr, %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr +... +# MUL-ENABLED-LABEL: name: qfpMul16 +# MUL-ENABLED: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vmpy_qf16_mix_hf +# MUL-ENABLED-NEXT: V6_vconv_hf_qf16 +# MUL-ENABLED-NEXT: V6_vS32Ub_ai +# MUL-ENABLED-NEXT: V6_vmpy_qf16 +# DEFAULT-LABEL: name: qfpMul16 +# DEFAULT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vmpy_qf16_hf +# DEFAULT-NEXT: V6_vconv_hf_qf16 +# DEFAULT-NEXT: V6_vS32Ub_ai +# DEFAULT-NEXT: V6_vmpy_qf16_hf +--- +name: qfpMul16 +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + %0:intregs = COPY $r0 + %1:intregs = COPY $r1 + %2:intregs = COPY $r2 + %3:intregs = COPY $r3 + %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 + %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 + %6:hvxvr = V6_vmpy_qf16_hf %4:hvxvr, %5:hvxvr + %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr + %8:hvxvr = V6_vmpy_qf16_hf %5:hvxvr, %7:hvxvr + %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr + V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr + %10:hvxvr = V6_vmpy_qf16_hf %7:hvxvr, %9:hvxvr + %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr + V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr diff --git a/llvm/test/CodeGen/Hexagon/vect/vect-qfp-unary.mir b/llvm/test/CodeGen/Hexagon/vect/vect-qfp-unary.mir new file mode 100644 index 0000000000000..482edc8dc242b --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/vect/vect-qfp-unary.mir @@ -0,0 +1,97 @@ +# RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ +# RUN: -run-pass hexagon-qfp-optimizer %s -o - | FileCheck %s + + +# CHECK: name: qfp_vilog32 +# CHECK: V6_vilog2_qf32 +--- +name: qfp_vilog32 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_sf_qf32 $v0 + $v2 = V6_vilog2_sf $v1 + V6_vS32Ub_ai $r2, 0, $v2 +... + +# CHECK-LABEL: name: qfp_vilog16 +# CHECK: V6_vilog2_qf16 +--- +name: qfp_vilog16 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_hf_qf16 $v0 + $v2 = V6_vilog2_hf $v1 + V6_vS32Ub_ai $r2, 0, $v2 +... + +# CHECK: name: qfp_vneg32 +# CHECK: V6_vneg_qf32_qf32 +--- +name: qfp_vneg32 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_sf_qf32 $v0 + $v2 = V6_vneg_qf32_sf $v1 + $v3 = V6_vconv_sf_qf32 $v2 + V6_vS32Ub_ai $r2, 0, $v3 +... + +# CHECK-LABEL: name: qfp_vneg16 +# CHECK: V6_vneg_qf16_qf16 +--- +name: qfp_vneg16 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_hf_qf16 $v0 + $v2 = V6_vneg_qf16_hf $v1 + $v3 = V6_vconv_hf_qf16 $v2 + V6_vS32Ub_ai $r2, 0, $v3 +... + +# CHECK: name: qfp_vabs32 +# CHECK: V6_vabs_qf32_qf32 +--- +name: qfp_vabs32 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_sf_qf32 $v0 + $v2 = V6_vabs_qf32_sf $v1 + $v3 = V6_vconv_sf_qf32 $v2 + V6_vS32Ub_ai $r2, 0, $v3 +... + +# CHECK-LABEL: name: qfp_vabs16 +# CHECK: V6_vabs_qf16_qf16 +--- +name: qfp_vabs16 +tracksRegLiveness: true + +body: | + bb.0: + liveins: $r0, $r1, $r2, $r3 + $v0 = V6_vL32Ub_ai $r0, 0 + $v1 = V6_vconv_hf_qf16 $v0 + $v2 = V6_vabs_qf16_hf $v1 + $v3 = V6_vconv_hf_qf16 $v2 + V6_vS32Ub_ai $r2, 0, $v3 +... From ad723f940980d94ee72084571c9fb06e46659b76 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 12:04:12 -0800 Subject: [PATCH 45/71] [LLVM] Check if LLVM_ON_UNIX is Defined This is canonical in the rest of the repository and otherwise we can end up with warnings when compiling with clang-cl on Windows that look like the following: ``` 2025-11-06T17:55:25.2412502Z C:\_work\llvm-project\llvm-project\llvm\include\llvm/Support/thread.h(37,5): warning: 'LLVM_ON_UNIX' is not defined, evaluates to 0 [-Wundef] 2025-11-06T17:55:25.2413436Z 37 | #if LLVM_ON_UNIX || _WIN32 2025-11-06T17:55:25.2413791Z | ^ 2025-11-06T17:55:25.2414625Z C:\_work\llvm-project\llvm-project\llvm\include\llvm/Support/thread.h(52,5): warning: 'LLVM_ON_UNIX' is not defined, evaluates to 0 [-Wundef] 2025-11-06T17:55:25.2415585Z 52 | #if LLVM_ON_UNIX 2025-11-06T17:55:25.2415901Z | ^ 2025-11-06T17:55:25.2416169Z 2 warnings generated. ``` Reviewers: joker-eph, pcc, cachemeifyoucan Reviewed By: cachemeifyoucan Pull Request: https://github.com/llvm/llvm-project/pull/166827 --- llvm/include/llvm/Support/thread.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/Support/thread.h b/llvm/include/llvm/Support/thread.h index ecde62d8368e7..51873e7d529bf 100644 --- a/llvm/include/llvm/Support/thread.h +++ b/llvm/include/llvm/Support/thread.h @@ -34,7 +34,7 @@ typedef PVOID HANDLE; namespace llvm { -#if LLVM_ON_UNIX || _WIN32 +#if defined(LLVM_ON_UNIX) || defined(_WIN32) /// LLVM thread following std::thread interface with added constructor to /// specify stack size. @@ -49,7 +49,7 @@ class thread { } public: -#if LLVM_ON_UNIX +#ifdef LLVM_ON_UNIX using native_handle_type = pthread_t; using id = pthread_t; using start_routine_type = void *(*)(void *); From e5ba3c6cad99eb656545fbacc15bb1f4ef76ac3b Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 12:10:04 -0800 Subject: [PATCH 46/71] [MLIR][Python] Update Nanobind Warnings List for clang-cl on Windows We recently moved over to compiling with clang-cl on Windows. This ended up causing a large increase in warnings, particularly due to how warnings are handled in nanobind. cd91d0fff9293a904704784c92c28637bfebef45 initially set -Wall -Wextra and -Wpedantic while fixing another issue, which is probably not what we want to do on third-party code. We also need to disable -Wmissing-field-initializers to get things clean in this configuration. Reviewers: makslevental, jpienaar, rkayaith Reviewed By: makslevental Pull Request: https://github.com/llvm/llvm-project/pull/166828 --- mlir/cmake/modules/AddMLIRPython.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlir/cmake/modules/AddMLIRPython.cmake b/mlir/cmake/modules/AddMLIRPython.cmake index fa6aec8a603a9..8196e2a2a3321 100644 --- a/mlir/cmake/modules/AddMLIRPython.cmake +++ b/mlir/cmake/modules/AddMLIRPython.cmake @@ -791,7 +791,6 @@ function(add_mlir_python_extension libname extname) get_property(NB_LIBRARY_TARGET_NAME TARGET ${libname} PROPERTY LINK_LIBRARIES) target_compile_options(${NB_LIBRARY_TARGET_NAME} PRIVATE - -Wall -Wextra -Wpedantic -Wno-c++98-compat-extra-semi -Wno-cast-qual -Wno-covered-switch-default @@ -799,11 +798,11 @@ function(add_mlir_python_extension libname extname) -Wno-nested-anon-types -Wno-unused-parameter -Wno-zero-length-array + -Wno-missing-field-initializers ${eh_rtti_enable}) target_compile_options(${libname} PRIVATE - -Wall -Wextra -Wpedantic -Wno-c++98-compat-extra-semi -Wno-cast-qual -Wno-covered-switch-default @@ -811,6 +810,7 @@ function(add_mlir_python_extension libname extname) -Wno-nested-anon-types -Wno-unused-parameter -Wno-zero-length-array + -Wno-missing-field-initializers ${eh_rtti_enable}) endif() From f410c97712622973ff93ae525b4f7f64d8eeb25b Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 20:11:43 +0000 Subject: [PATCH 47/71] [CI] Remove Comment about Windows Compile Jobs Limit We removed the limit a while back after moving to new infrastructure but never removed the comment. Do that now to prevent confusion. --- .ci/monolithic-windows.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/monolithic-windows.sh b/.ci/monolithic-windows.sh index 5fb8f69528e89..d1b834cc4e840 100755 --- a/.ci/monolithic-windows.sh +++ b/.ci/monolithic-windows.sh @@ -32,8 +32,6 @@ export LD=link # see https://github.com/llvm/llvm-project/pull/82393 and # https://discourse.llvm.org/t/rfc-future-of-windows-pre-commit-ci/76840/40 # for further information. -# We limit the number of parallel compile jobs to 24 control memory -# consumption and improve build reliability. cmake -S "${MONOREPO_ROOT}"/llvm -B "${BUILD_DIR}" \ -D LLVM_ENABLE_PROJECTS="${projects}" \ -G Ninja \ From e33098555132439d0ee5dfdd8fef31d7177ee68c Mon Sep 17 00:00:00 2001 From: Andrew Haberlandt Date: Thu, 6 Nov 2025 12:18:16 -0800 Subject: [PATCH 48/71] [sanitizer-common] [Darwin] Fix overlapping dyld segment addresses (#166005) This fixes two problems: - dyld itself resides within the shared cache. MemoryMappingLayout incorrectly computes the slide for dyld's segments, causing them to (appear to) overlap with other modules. This can cause symbolication issues. - The MemoryMappingLayout ranges on Darwin are not disjoint due to the fact that the LINKEDIT segments overlap for each module. We now ignore these segments to ensure the mapping is disjoint. This adds a check for disjointness, and a runtime warning if this is ever violated (as that suggests issues in the sanitizer memory mapping). There is now a test to ensure that these problems do not recur. rdar://163149325 --- .../sanitizer_procmaps_mac.cpp | 78 +++++++++++++++---- .../Darwin/asan-verify-module-map.cpp | 25 ++++++ 2 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_mac.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_mac.cpp index a5ec85ae16460..72f4bbf212f9a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_mac.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_mac.cpp @@ -45,7 +45,6 @@ struct MemoryMappedSegmentData { const char *current_load_cmd_addr; u32 lc_type; uptr base_virt_addr; - uptr addr_mask; }; template @@ -54,12 +53,58 @@ static void NextSectionLoad(LoadedModule *module, MemoryMappedSegmentData *data, const Section *sc = (const Section *)data->current_load_cmd_addr; data->current_load_cmd_addr += sizeof(Section); - uptr sec_start = (sc->addr & data->addr_mask) + data->base_virt_addr; + uptr sec_start = sc->addr + data->base_virt_addr; uptr sec_end = sec_start + sc->size; module->addAddressRange(sec_start, sec_end, /*executable=*/false, isWritable, sc->sectname); } +static bool VerifyMemoryMapping(MemoryMappingLayout* mapping) { + InternalMmapVector modules; + modules.reserve(128); // matches DumpProcessMap + mapping->DumpListOfModules(&modules); + + InternalMmapVector segments; + for (uptr i = 0; i < modules.size(); ++i) { + for (auto& range : modules[i].ranges()) { + segments.push_back(range); + } + } + + // Verify that none of the segments overlap: + // 1. Sort the segments by the start address + // 2. Check that every segment starts after the previous one ends. + Sort(segments.data(), segments.size(), + [](LoadedModule::AddressRange& a, LoadedModule::AddressRange& b) { + return a.beg < b.beg; + }); + + // To avoid spam, we only print the report message once-per-process. + static bool invalid_module_map_reported = false; + bool well_formed = true; + + for (size_t i = 1; i < segments.size(); i++) { + uptr cur_start = segments[i].beg; + uptr prev_end = segments[i - 1].end; + if (cur_start < prev_end) { + well_formed = false; + VReport(2, "Overlapping mappings: %s start = %p, %s end = %p\n", + segments[i].name, (void*)cur_start, segments[i - 1].name, + (void*)prev_end); + if (!invalid_module_map_reported) { + Report( + "WARN: Invalid dyld module map detected. This is most likely a bug " + "in the sanitizer.\n"); + Report("WARN: Backtraces may be unreliable.\n"); + invalid_module_map_reported = true; + } + } + } + + mapping->Reset(); + return well_formed; +} + void MemoryMappedSegment::AddAddressRanges(LoadedModule *module) { // Don't iterate over sections when the caller hasn't set up the // data pointer, when there are no sections, or when the segment @@ -85,6 +130,7 @@ void MemoryMappedSegment::AddAddressRanges(LoadedModule *module) { MemoryMappingLayout::MemoryMappingLayout(bool cache_enabled) { Reset(); + VerifyMemoryMapping(this); } MemoryMappingLayout::~MemoryMappingLayout() { @@ -190,6 +236,7 @@ typedef struct dyld_shared_cache_dylib_text_info extern bool _dyld_get_shared_cache_uuid(uuid_t uuid); extern const void *_dyld_get_shared_cache_range(size_t *length); +extern intptr_t _dyld_get_image_slide(const struct mach_header* mh); extern int dyld_shared_cache_iterate_text( const uuid_t cacheUuid, void (^callback)(const dyld_shared_cache_dylib_text_info *info)); @@ -258,23 +305,21 @@ static bool NextSegmentLoad(MemoryMappedSegment *segment, layout_data->current_load_cmd_count--; if (((const load_command *)lc)->cmd == kLCSegment) { const SegmentCommand* sc = (const SegmentCommand *)lc; - uptr base_virt_addr, addr_mask; - if (layout_data->current_image == kDyldImageIdx) { - base_virt_addr = (uptr)get_dyld_hdr(); - // vmaddr is masked with 0xfffff because on macOS versions < 10.12, - // it contains an absolute address rather than an offset for dyld. - // To make matters even more complicated, this absolute address - // isn't actually the absolute segment address, but the offset portion - // of the address is accurate when combined with the dyld base address, - // and the mask will give just this offset. - addr_mask = 0xfffff; - } else { + if (strncmp(sc->segname, "__LINKEDIT", sizeof("__LINKEDIT")) == 0) { + // The LINKEDIT sections are for internal linker use, and may alias + // with the LINKEDIT section for other modules. (If we included them, + // our memory map would contain overlappping sections.) + return false; + } + + uptr base_virt_addr; + if (layout_data->current_image == kDyldImageIdx) + base_virt_addr = (uptr)_dyld_get_image_slide(get_dyld_hdr()); + else base_virt_addr = (uptr)_dyld_get_image_vmaddr_slide(layout_data->current_image); - addr_mask = ~0; - } - segment->start = (sc->vmaddr & addr_mask) + base_virt_addr; + segment->start = sc->vmaddr + base_virt_addr; segment->end = segment->start + sc->vmsize; // Most callers don't need section information, so only fill this struct // when required. @@ -284,7 +329,6 @@ static bool NextSegmentLoad(MemoryMappedSegment *segment, (const char *)lc + sizeof(SegmentCommand); seg_data->lc_type = kLCSegment; seg_data->base_virt_addr = base_virt_addr; - seg_data->addr_mask = addr_mask; internal_strncpy(seg_data->name, sc->segname, ARRAY_SIZE(seg_data->name)); } diff --git a/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp b/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp new file mode 100644 index 0000000000000..7660841c72877 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp @@ -0,0 +1,25 @@ +// This test simply checks that the "Invalid dyld module map" warning is not printed +// in the output of a backtrace. + +// RUN: %clangxx_asan -DSHARED_LIB -g %s -dynamiclib -o %t.dylib +// RUN: %clangxx_asan -O0 -g %s %t.dylib -o %t.executable +// RUN: %env_asan_opts="print_module_map=2" not %run %t.executable 2>&1 | FileCheck %s -DDYLIB=%t.dylib + +// CHECK-NOT: WARN: Invalid dyld module map +// CHECK-DAG: 0x{{.*}}-0x{{.*}} [[DYLIB]] +// CHECK-DAG: 0x{{.*}}-0x{{.*}} {{.*}}libsystem + +#ifdef SHARED_LIB +extern "C" void foo(int *a) { *a = 5; } +#else +# include + +extern "C" void foo(int *a); + +int main() { + int *a = (int *)malloc(sizeof(int)); + free(a); + foo(a); + return 0; +} +#endif \ No newline at end of file From adc79324618f0e95914ac0fcb26fe0d942319cab Mon Sep 17 00:00:00 2001 From: Yuxuan Chen Date: Thu, 6 Nov 2025 10:33:44 -1000 Subject: [PATCH 49/71] [libcxx] Implement C++20 std::chrono::is_clock, std::chrono::is_clock_v (#160607) Implemented [[*time.traits.is.clock*]](https://eel.is/c++draft/time.traits.is.clock) from [P0355R7](https://wg21.link/p0355r7). This patch implements the C++20 feature `is_clock` and `is_clock_v` based on the documentation [on cppreference](https://en.cppreference.com/w/cpp/chrono/is_clock.html) Fixes #166049. --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__chrono/is_clock.h | 72 ++++++ libcxx/include/chrono | 4 + libcxx/include/module.modulemap.in | 4 + libcxx/modules/std/chrono.inc | 4 +- .../trait.is.clock.compile.verify.cpp | 24 ++ .../trait.is.clock.compile.pass.cpp | 225 ++++++++++++++++++ 7 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 libcxx/include/__chrono/is_clock.h create mode 100644 libcxx/test/libcxx/time/time.traits.is.clock/trait.is.clock.compile.verify.cpp create mode 100644 libcxx/test/std/time/time.traits.is.clock/trait.is.clock.compile.pass.cpp diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 57032ce26d4fd..46e17b584432e 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -262,6 +262,7 @@ set(files __chrono/gps_clock.h __chrono/hh_mm_ss.h __chrono/high_resolution_clock.h + __chrono/is_clock.h __chrono/leap_second.h __chrono/literals.h __chrono/local_info.h diff --git a/libcxx/include/__chrono/is_clock.h b/libcxx/include/__chrono/is_clock.h new file mode 100644 index 0000000000000..e63b8485d06e1 --- /dev/null +++ b/libcxx/include/__chrono/is_clock.h @@ -0,0 +1,72 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_IS_CLOCK_H +#define _LIBCPP___CHRONO_IS_CLOCK_H + +#include <__config> + +#include <__chrono/duration.h> +#include <__chrono/time_point.h> +#include <__concepts/same_as.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_arithmetic.h> +#include <__type_traits/is_class.h> +#include <__type_traits/is_union.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 20 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono { + +// Helper to check that _Tp::time_point has the form time_point<_, typename _Tp::duration>. +template +inline constexpr bool __is_valid_clock_time_point_v = false; + +template +inline constexpr bool + __is_valid_clock_time_point_v, _ClockType> = true; + +// Check if a clock satisfies the Cpp17Clock requirements as defined in [time.clock.req] +template +_LIBCPP_NO_SPECIALIZATIONS inline constexpr bool is_clock_v = requires { + typename _Tp::rep; + requires is_arithmetic_v || is_class_v || is_union_v; + + typename _Tp::period; + requires __is_ratio_v; + + typename _Tp::duration; + requires same_as>; + + typename _Tp::time_point; + requires __is_valid_clock_time_point_v; + + _Tp::is_steady; + requires same_as; + + _Tp::now(); + requires same_as; +}; + +template +struct _LIBCPP_NO_SPECIALIZATIONS is_clock : bool_constant> {}; + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER +#endif // _LIBCPP___CHRONO_IS_CLOCK_H diff --git a/libcxx/include/chrono b/libcxx/include/chrono index 82e99a31bcc9f..aa4fc6218f962 100644 --- a/libcxx/include/chrono +++ b/libcxx/include/chrono @@ -218,6 +218,9 @@ template template constexpr ToDuration round(const duration& d); // C++17 +template struct is_clock; // C++20 +template inline constexpr bool is_clock_v = is_clock::value; // C++20 + // duration I/O template // C++20 basic_ostream& @@ -1057,6 +1060,7 @@ constexpr chrono::year operator ""y(unsigned lo # include <__chrono/day.h> # include <__chrono/exception.h> # include <__chrono/hh_mm_ss.h> +# include <__chrono/is_clock.h> # include <__chrono/literals.h> # include <__chrono/local_info.h> # include <__chrono/month.h> diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 24a2fe761943a..f77c885da5b6a 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -973,6 +973,10 @@ module std [system] { header "__chrono/high_resolution_clock.h" export * } + module is_clock { + header "__chrono/is_clock.h" + export std_core.type_traits.integral_constant + } module leap_second { header "__chrono/leap_second.h" } diff --git a/libcxx/modules/std/chrono.inc b/libcxx/modules/std/chrono.inc index 66eccd8d290ad..db405d482bf9e 100644 --- a/libcxx/modules/std/chrono.inc +++ b/libcxx/modules/std/chrono.inc @@ -25,8 +25,8 @@ export namespace std { using std::chrono::duration_values; - // using std::chrono::is_clock; - // using std::chrono::is_clock_v; + using std::chrono::is_clock; + using std::chrono::is_clock_v; // [time.duration.nonmember], duration arithmetic using std::chrono::operator+; diff --git a/libcxx/test/libcxx/time/time.traits.is.clock/trait.is.clock.compile.verify.cpp b/libcxx/test/libcxx/time/time.traits.is.clock/trait.is.clock.compile.verify.cpp new file mode 100644 index 0000000000000..e9ad59aba13cb --- /dev/null +++ b/libcxx/test/libcxx/time/time.traits.is.clock/trait.is.clock.compile.verify.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REQUIRES: std-at-least-c++20 + +#include +#include + +#if !__has_warning("-Winvalid-specializations") +// expected-no-diagnostics +#else + +template <> +struct std::chrono::is_clock : std::false_type {}; // expected-error@*:* {{'is_clock' cannot be specialized}} + +template <> +constexpr bool std::chrono::is_clock_v = false; // expected-error@*:* {{'is_clock_v' cannot be specialized}} + +#endif diff --git a/libcxx/test/std/time/time.traits.is.clock/trait.is.clock.compile.pass.cpp b/libcxx/test/std/time/time.traits.is.clock/trait.is.clock.compile.pass.cpp new file mode 100644 index 0000000000000..4168fa7c861ba --- /dev/null +++ b/libcxx/test/std/time/time.traits.is.clock/trait.is.clock.compile.pass.cpp @@ -0,0 +1,225 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REQUIRES: std-at-least-c++20 + +#include +#include + +#include "test_macros.h" + +struct EmptyStruct {}; + +// Test structs missing required members +struct MissingRep { + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static time_point now(); +}; + +struct MissingPeriod { + using rep = long; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static time_point now(); +}; + +struct MissingDuration { + using rep = long; + using time_point = long; + static constexpr bool is_steady = false; + static time_point now(); +}; + +struct MissingTimePoint { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + static constexpr bool is_steady = false; + static std::chrono::time_point now(); +}; + +struct MissingIsSteady { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static time_point now(); +}; + +struct MissingNow { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; +}; + +// Valid clock types +struct ValidSteadyClock { + using rep = long long; + using period = std::nano; + using duration = std::chrono::nanoseconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = true; + static time_point now(); +}; + +struct ValidSystemClock { + using rep = long long; + using period = std::micro; + using duration = std::chrono::microseconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static time_point now(); +}; + +// Test clocks with invalid is_steady type +struct WrongIsSteadyType { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static bool is_steady; // Not const bool + static time_point now(); +}; + +struct WrongIsSteadyNonBool { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr int is_steady = 1; // Not bool + static time_point now(); +}; + +// Test clocks with invalid now() return type +struct WrongNowReturnType { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static int now(); // Wrong return type +}; + +// Test clocks with invalid period type +struct WrongPeriodType { + using rep = long; + using period = int; // Not a ratio + using duration = std::chrono::seconds; + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static time_point now(); +}; + +// Test clocks with wrong duration type +struct WrongDurationType { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::milliseconds; // Should be duration> + using time_point = std::chrono::time_point; + static constexpr bool is_steady = false; + static time_point now(); +}; + +// Test clocks with wrong time_point type +struct WrongTimePointType { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::duration>; + using time_point = int; // Not a time_point + static constexpr bool is_steady = false; + static time_point now(); +}; + +struct WrongTimePointClock { + using rep = long; + using period = std::ratio<1>; + using duration = std::chrono::duration>; + using time_point = std::chrono::time_point; // Wrong clock type + static constexpr bool is_steady = false; + static time_point now(); +}; + +// Valid clock with time_point that has matching duration instead of matching clock +struct ValidClockWithDurationMatch { + using rep = int; + using period = std::milli; + using duration = std::chrono::duration; + using time_point = std::chrono::time_point; // Valid: matches duration + static constexpr bool is_steady = false; + static time_point now(); +}; + +// Test both is_clock and is_clock_v +static_assert(std::chrono::is_clock::value); +static_assert(std::chrono::is_clock_v); + +// Test standard clock types +static_assert(std::chrono::is_clock_v); +static_assert(std::chrono::is_clock_v); + +// Test non-clock types +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); + +// Test structs missing required members +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); + +// Test valid custom clocks +static_assert(std::chrono::is_clock_v); +static_assert(std::chrono::is_clock_v); +static_assert(std::chrono::is_clock_v); + +// cv-qualified and reference types +static_assert(std::chrono::is_clock_v); +static_assert(std::chrono::is_clock_v); +static_assert(std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); + +// array and pointer types +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); +static_assert(!std::chrono::is_clock_v); + +// The Standard defined a minimum set of checks and allowed implementation to perform stricter checks. The following +// static asserts are implementation specific and a conforming standard library implementation doesn't have to produce +// the same outcome. + +// Test clocks with invalid is_steady type +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // is_steady not const bool +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // is_steady not bool type + +// Test clocks with invalid now() return type +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // now() doesn't return time_point + +// Test clocks with invalid period type +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // period is not a ratio + +// Test clocks with wrong duration type +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // duration doesn't match duration + +// Test clocks with wrong time_point type +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // time_point is not a time_point +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v); // time_point has wrong clock and wrong duration From 67eb691fc5d92dcdc8bdc22c90a3a53f64011bb4 Mon Sep 17 00:00:00 2001 From: LLVM GN Syncbot Date: Thu, 6 Nov 2025 20:34:05 +0000 Subject: [PATCH 50/71] [gn build] Port adc79324618f --- llvm/utils/gn/secondary/libcxx/include/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/llvm/utils/gn/secondary/libcxx/include/BUILD.gn b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn index 9e0b9513a9a1a..27bd2ce9849f6 100644 --- a/llvm/utils/gn/secondary/libcxx/include/BUILD.gn +++ b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn @@ -336,6 +336,7 @@ if (current_toolchain == default_toolchain) { "__chrono/gps_clock.h", "__chrono/hh_mm_ss.h", "__chrono/high_resolution_clock.h", + "__chrono/is_clock.h", "__chrono/leap_second.h", "__chrono/literals.h", "__chrono/local_info.h", From c12cb2892c808af459eaa270b8738a2b375ecc9b Mon Sep 17 00:00:00 2001 From: Razvan Lupusoru Date: Thu, 6 Nov 2025 12:46:20 -0800 Subject: [PATCH 51/71] [flang][acc] Add infrastructure and tests for ACCImplicitData (#166797) This PR adds the necessary infrastructure to enable testing of the ACCImplicitData pass for FIR/HLFIR, along with comprehensive test coverage for implicit data clause generation in OpenACC constructs. New Infrastructure: - Add FIROpenACCSupport analysis providing FIR-specific implementations of OpenACCSupport interface methods for variable name extraction, recipe name generation, and NYI emission - Add FIROpenACCUtils with helper functions for: * Variable name extraction from FIR operations (getVariableName) * Recipe name generation with FIR type string representation * Bounds checking for constant array sections - Add ACCInitializeFIRAnalyses pass to pre-register FIR analyses (OpenACCSupport and AliasAnalysis) for use by subsequent OpenACC passes in the pipeline Refactoring in flang/lib/Lower/OpenACC.cpp: - Move bounds string generation and bounds checking to FIROpenACCUtils - Refactor recipe name generation to use fir::acc::getRecipeName Test Coverage: - acc-implicit-firstprivate.fir: Tests implicit firstprivate behavior for scalar types (i8, i16, i32, i64, f32, f64, logical, complex) in parallel/serial constructs with recipe generation verification - acc-implicit-data.fir: Tests implicit data clauses for scalars, arrays, derived types, and boxes in kernels/parallel/serial with default(none) and default(present) variations - acc-implicit-data-fortran.F90: Fortran tests verifying implicit data generation through bbc with both HLFIR and FIR - acc-implicit-data-derived-type-member.F90: Tests correct ordering of parent/child data clause operations for derived type members - acc-implicit-copy-reduction.fir: Tests enable-implicit-reduction-copy flag controlling whether reduction variables use copy or firstprivate This enables proper testing of implicit data clause generation through the flang optimizer pipeline for OpenACC directives. --- .../Analysis/FIROpenACCSupportAnalysis.h | 51 +++ .../include/flang/Optimizer/OpenACC/Passes.h | 4 + .../include/flang/Optimizer/OpenACC/Passes.td | 16 + .../OpenACC/Support/FIROpenACCUtils.h | 57 +++ flang/lib/Lower/OpenACC.cpp | 69 +--- .../Optimizer/OpenACC/Analysis/CMakeLists.txt | 22 ++ .../Analysis/FIROpenACCSupportAnalysis.cpp | 40 ++ flang/lib/Optimizer/OpenACC/CMakeLists.txt | 1 + .../Optimizer/OpenACC/Support/CMakeLists.txt | 1 + .../OpenACC/Support/FIROpenACCUtils.cpp | 269 +++++++++++++ .../Transforms/ACCInitializeFIRAnalyses.cpp | 56 +++ .../OpenACC/Transforms/CMakeLists.txt | 3 + .../OpenACC/acc-implicit-copy-reduction.fir | 134 +++++++ .../acc-implicit-data-derived-type-member.F90 | 38 ++ .../OpenACC/acc-implicit-data-fortran.F90 | 79 ++++ .../Transforms/OpenACC/acc-implicit-data.fir | 358 ++++++++++++++++++ .../OpenACC/acc-implicit-firstprivate.fir | 284 ++++++++++++++ 17 files changed, 1425 insertions(+), 57 deletions(-) create mode 100644 flang/include/flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h create mode 100644 flang/include/flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h create mode 100644 flang/lib/Optimizer/OpenACC/Analysis/CMakeLists.txt create mode 100644 flang/lib/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.cpp create mode 100644 flang/lib/Optimizer/OpenACC/Support/FIROpenACCUtils.cpp create mode 100644 flang/lib/Optimizer/OpenACC/Transforms/ACCInitializeFIRAnalyses.cpp create mode 100644 flang/test/Transforms/OpenACC/acc-implicit-copy-reduction.fir create mode 100644 flang/test/Transforms/OpenACC/acc-implicit-data-derived-type-member.F90 create mode 100644 flang/test/Transforms/OpenACC/acc-implicit-data-fortran.F90 create mode 100644 flang/test/Transforms/OpenACC/acc-implicit-data.fir create mode 100644 flang/test/Transforms/OpenACC/acc-implicit-firstprivate.fir diff --git a/flang/include/flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h b/flang/include/flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h new file mode 100644 index 0000000000000..c798681306c10 --- /dev/null +++ b/flang/include/flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h @@ -0,0 +1,51 @@ +//===- FIROpenACCSupportAnalysis.h - FIR OpenACCSupport Analysis ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines the FIR-specific implementation of OpenACCSupport analysis. +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_OPTIMIZER_OPENACC_ANALYSIS_FIROPENACCSUPPORTANALYSIS_H +#define FORTRAN_OPTIMIZER_OPENACC_ANALYSIS_FIROPENACCSUPPORTANALYSIS_H + +#include "mlir/Dialect/OpenACC/OpenACC.h" +#include "mlir/IR/Value.h" +#include + +namespace fir { +namespace acc { + +/// FIR-specific implementation for the OpenACCSupport analysis interface. +/// +/// This class provides the custom implementations of the OpenACCSupport +/// interface methods that are tailored to FIR's requirements and +/// can handle FIR dialect operations and types. +/// Its primary intent is to be registered with the OpenACCSupport analysis +/// using setImplementation() +/// +/// Usage: +/// auto &support = getAnalysis(); +/// support.setImplementation(fir::acc::FIROpenACCSupportAnalysis()); +/// +class FIROpenACCSupportAnalysis { +public: + FIROpenACCSupportAnalysis() = default; + + std::string getVariableName(mlir::Value v); + + std::string getRecipeName(mlir::acc::RecipeKind kind, mlir::Type type, + mlir::Value var); + + mlir::InFlightDiagnostic emitNYI(mlir::Location loc, + const mlir::Twine &message); +}; + +} // namespace acc +} // namespace fir + +#endif // FORTRAN_OPTIMIZER_OPENACC_ANALYSIS_FIROPENACCSUPPORTANALYSIS_H diff --git a/flang/include/flang/Optimizer/OpenACC/Passes.h b/flang/include/flang/Optimizer/OpenACC/Passes.h index 0627cc8ce4a6d..c27c7ebc3b06f 100644 --- a/flang/include/flang/Optimizer/OpenACC/Passes.h +++ b/flang/include/flang/Optimizer/OpenACC/Passes.h @@ -13,6 +13,9 @@ #ifndef FORTRAN_OPTIMIZER_OPENACC_PASSES_H #define FORTRAN_OPTIMIZER_OPENACC_PASSES_H +#include "flang/Optimizer/Dialect/FIRDialect.h" +#include "flang/Optimizer/HLFIR/HLFIRDialect.h" +#include "mlir/Dialect/OpenACC/OpenACC.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/Pass/Pass.h" #include "mlir/Pass/PassRegistry.h" @@ -25,6 +28,7 @@ namespace acc { #define GEN_PASS_REGISTRATION #include "flang/Optimizer/OpenACC/Passes.h.inc" +std::unique_ptr createACCInitializeFIRAnalysesPass(); std::unique_ptr createACCRecipeBufferizationPass(); } // namespace acc diff --git a/flang/include/flang/Optimizer/OpenACC/Passes.td b/flang/include/flang/Optimizer/OpenACC/Passes.td index 3c127b30aa9b8..d947aa470494a 100644 --- a/flang/include/flang/Optimizer/OpenACC/Passes.td +++ b/flang/include/flang/Optimizer/OpenACC/Passes.td @@ -11,6 +11,22 @@ include "mlir/Pass/PassBase.td" +def ACCInitializeFIRAnalyses + : Pass<"acc-initialize-fir-analyses", "mlir::ModuleOp"> { + let summary = "Initialize FIR analyses for OpenACC passes"; + let description = [{ + This pass initializes analyses that can be used by subsequent OpenACC passes + in the pipeline. It creates and caches the OpenACCSupport analysis with a + FIR-specific implementation that can handle FIR types and operations. + It also initializes FIR's AliasAnalysis for use in OpenACC passes. + This pass needs to rerun if any analyses were invalidated by MLIR's framework. + }]; + // In addition to pre-registering the needed analyses, this pass also + // pre-registers the dialects that various OpenACC passes may generate. + let dependentDialects = ["fir::FIROpsDialect", "hlfir::hlfirDialect", + "mlir::acc::OpenACCDialect"]; +} + def ACCRecipeBufferization : Pass<"fir-acc-recipe-bufferization", "mlir::ModuleOp"> { let summary = "Rewrite acc.*.recipe box values to ref and update uses"; diff --git a/flang/include/flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h b/flang/include/flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h new file mode 100644 index 0000000000000..5ca0925ea681f --- /dev/null +++ b/flang/include/flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h @@ -0,0 +1,57 @@ +//===- FIROpenACCUtils.h - FIR OpenACC Utilities ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file declares utility functions for FIR OpenACC support. +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_OPTIMIZER_OPENACC_SUPPORT_FIROPENACCUTILS_H +#define FORTRAN_OPTIMIZER_OPENACC_SUPPORT_FIROPENACCUTILS_H + +#include "mlir/Dialect/OpenACC/OpenACC.h" +#include "mlir/IR/Value.h" +#include + +namespace fir { +namespace acc { + +/// Attempts to extract the variable name from a value by walking through +/// FIR operations and looking for variable names. +/// \param v The value to extract the variable name from +/// \param preferDemangledName If true, prefers demangled/bindc names over +/// mangled/unique names. If false, prefers mangled names. +/// Returns empty string if no name is found. +std::string getVariableName(mlir::Value v, bool preferDemangledName = true); + +/// Get the recipe name for a given recipe kind, FIR type, and optional +/// variable. Uses FIR's type string representation with appropriate prefix. For +/// firstprivate and reduction recipes, handles bounds suffix when all bounds +/// are constant. For reduction recipes, embeds the operator name in the recipe. +/// \param kind The recipe kind (private, firstprivate, or reduction) +/// \param type The FIR type (must be a FIR type) +/// \param var Optional variable value +/// \param bounds Optional bounds for array sections (used for suffix +/// generation) +/// \param reductionOp Optional reduction operator (required for reduction +/// recipes) +/// \return The complete recipe name with all necessary suffixes +std::string getRecipeName(mlir::acc::RecipeKind kind, mlir::Type type, + mlir::Value var = nullptr, + llvm::ArrayRef bounds = {}, + mlir::acc::ReductionOperator reductionOp = + mlir::acc::ReductionOperator::AccNone); + +/// Check if all bounds are expressed with constant values. +/// \param bounds Array of DataBoundsOp values to check +/// \return true if all bounds have constant lowerbound/upperbound or extent +bool areAllBoundsConstant(llvm::ArrayRef bounds); + +} // namespace acc +} // namespace fir + +#endif // FORTRAN_OPTIMIZER_OPENACC_SUPPORT_FIROPENACCUTILS_H diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 6208bed6d0aea..bb4c95aab3aa2 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -28,6 +28,7 @@ #include "flang/Optimizer/Builder/IntrinsicCall.h" #include "flang/Optimizer/Builder/Todo.h" #include "flang/Optimizer/Dialect/FIRType.h" +#include "flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h" #include "flang/Parser/parse-tree-visitor.h" #include "flang/Parser/parse-tree.h" #include "flang/Parser/tools.h" @@ -1159,18 +1160,6 @@ bool isConstantBound(mlir::acc::DataBoundsOp &op) { return false; } -/// Return true iff all the bounds are expressed with constant values. -bool areAllBoundConstant(const llvm::SmallVector &bounds) { - for (auto bound : bounds) { - auto dataBound = - mlir::dyn_cast(bound.getDefiningOp()); - assert(dataBound && "Must be DataBoundOp operation"); - if (!isConstantBound(dataBound)) - return false; - } - return true; -} - static llvm::SmallVector genConstantBounds(fir::FirOpBuilder &builder, mlir::Location loc, mlir::acc::DataBoundsOp &dataBound) { @@ -1324,7 +1313,7 @@ mlir::acc::FirstprivateRecipeOp Fortran::lower::createOrGetFirstprivateRecipe( mlir::OpBuilder::InsertionGuard guard(builder); auto recipe = genRecipeOp( builder, mod, recipeName, loc, ty); - bool allConstantBound = areAllBoundConstant(bounds); + bool allConstantBound = fir::acc::areAllBoundsConstant(bounds); auto [source, destination] = genRecipeCombinerOrCopyRegion( builder, loc, ty, recipe.getCopyRegion(), bounds, allConstantBound); @@ -1358,33 +1347,6 @@ mlir::acc::FirstprivateRecipeOp Fortran::lower::createOrGetFirstprivateRecipe( return recipe; } -/// Get a string representation of the bounds. -std::string getBoundsString(llvm::SmallVector &bounds) { - std::stringstream boundStr; - if (!bounds.empty()) - boundStr << "_section_"; - llvm::interleave( - bounds, - [&](mlir::Value bound) { - auto boundsOp = - mlir::cast(bound.getDefiningOp()); - if (boundsOp.getLowerbound() && - fir::getIntIfConstant(boundsOp.getLowerbound()) && - boundsOp.getUpperbound() && - fir::getIntIfConstant(boundsOp.getUpperbound())) { - boundStr << "lb" << *fir::getIntIfConstant(boundsOp.getLowerbound()) - << ".ub" << *fir::getIntIfConstant(boundsOp.getUpperbound()); - } else if (boundsOp.getExtent() && - fir::getIntIfConstant(boundsOp.getExtent())) { - boundStr << "ext" << *fir::getIntIfConstant(boundsOp.getExtent()); - } else { - boundStr << "?"; - } - }, - [&] { boundStr << "x"; }); - return boundStr.str(); -} - /// Rebuild the array type from the acc.bounds operation with constant /// lowerbound/upperbound or extent. mlir::Type getTypeFromBounds(llvm::SmallVector &bounds, @@ -1458,9 +1420,8 @@ static void genPrivatizationRecipes( RecipeOp recipe; mlir::Type retTy = getTypeFromBounds(bounds, info.addr.getType()); if constexpr (std::is_same_v) { - std::string recipeName = - fir::getTypeAsString(retTy, converter.getKindMap(), - Fortran::lower::privatizationRecipePrefix); + std::string recipeName = fir::acc::getRecipeName( + mlir::acc::RecipeKind::private_recipe, retTy, info.addr, bounds); recipe = Fortran::lower::createOrGetPrivateRecipe(builder, recipeName, operandLocation, retTy); auto op = createDataEntryOp( @@ -1474,10 +1435,8 @@ static void genPrivatizationRecipes( symbolPairs->emplace_back(op.getAccVar(), Fortran::semantics::SymbolRef(symbol)); } else { - std::string suffix = - areAllBoundConstant(bounds) ? getBoundsString(bounds) : ""; - std::string recipeName = fir::getTypeAsString( - retTy, converter.getKindMap(), "firstprivatization" + suffix); + std::string recipeName = fir::acc::getRecipeName( + mlir::acc::RecipeKind::firstprivate_recipe, retTy, info.addr, bounds); recipe = Fortran::lower::createOrGetFirstprivateRecipe( builder, recipeName, operandLocation, retTy, bounds); auto op = createDataEntryOp( @@ -1623,7 +1582,7 @@ mlir::acc::ReductionRecipeOp Fortran::lower::createOrGetReductionRecipe( mlir::OpBuilder::InsertionGuard guard(builder); auto recipe = genRecipeOp( builder, mod, recipeName, loc, ty, op); - bool allConstantBound = areAllBoundConstant(bounds); + bool allConstantBound = fir::acc::areAllBoundsConstant(bounds); auto [dest, src] = genRecipeCombinerOrCopyRegion( builder, loc, ty, recipe.getCombinerRegion(), bounds, allConstantBound); @@ -1708,15 +1667,12 @@ genReductions(const Fortran::parser::AccObjectListWithReduction &objectList, mlir::acc::DataClause::acc_reduction, info.addr.getType(), async, asyncDeviceTypes, asyncOnlyDeviceTypes, /*unwrapBoxAddr=*/true); mlir::Type ty = op.getAccVar().getType(); - if (!areAllBoundConstant(bounds) || + if (!fir::acc::areAllBoundsConstant(bounds) || fir::isAssumedShape(info.addr.getType()) || fir::isAllocatableOrPointerArray(info.addr.getType())) ty = info.addr.getType(); - std::string suffix = - areAllBoundConstant(bounds) ? getBoundsString(bounds) : ""; - std::string recipeName = fir::getTypeAsString( - ty, converter.getKindMap(), - ("reduction_" + stringifyReductionOperator(mlirOp)).str() + suffix); + std::string recipeName = fir::acc::getRecipeName( + mlir::acc::RecipeKind::reduction_recipe, ty, info.addr, bounds, mlirOp); mlir::acc::ReductionRecipeOp recipe = Fortran::lower::createOrGetReductionRecipe( @@ -1961,9 +1917,8 @@ static void privatizeIv( } if (privateOp == nullptr) { - std::string recipeName = - fir::getTypeAsString(ivValue.getType(), converter.getKindMap(), - Fortran::lower::privatizationRecipePrefix); + std::string recipeName = fir::acc::getRecipeName( + mlir::acc::RecipeKind::private_recipe, ivValue.getType(), ivValue, {}); auto recipe = Fortran::lower::createOrGetPrivateRecipe( builder, recipeName, loc, ivValue.getType()); diff --git a/flang/lib/Optimizer/OpenACC/Analysis/CMakeLists.txt b/flang/lib/Optimizer/OpenACC/Analysis/CMakeLists.txt new file mode 100644 index 0000000000000..e05d1456e6dba --- /dev/null +++ b/flang/lib/Optimizer/OpenACC/Analysis/CMakeLists.txt @@ -0,0 +1,22 @@ +add_flang_library(FIROpenACCAnalysis + FIROpenACCSupportAnalysis.cpp + + DEPENDS + FIRAnalysis + FIRDialect + FIROpenACCSupport + HLFIRDialect + + LINK_LIBS + FIRAnalysis + FIRDialect + FIROpenACCSupport + HLFIRDialect + + MLIR_DEPS + MLIROpenACCDialect + + MLIR_LIBS + MLIROpenACCDialect +) + diff --git a/flang/lib/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.cpp b/flang/lib/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.cpp new file mode 100644 index 0000000000000..8cdbe1d5b170e --- /dev/null +++ b/flang/lib/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.cpp @@ -0,0 +1,40 @@ +//===- FIROpenACCSupportAnalysis.cpp - FIR OpenACCSupport Analysis -------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the FIR-specific OpenACCSupport analysis. +// +//===----------------------------------------------------------------------===// + +#include "flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h" +#include "flang/Optimizer/Builder/Todo.h" +#include "flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h" + +using namespace mlir; + +namespace fir { +namespace acc { + +std::string FIROpenACCSupportAnalysis::getVariableName(Value v) { + return fir::acc::getVariableName(v, /*preferDemangledName=*/true); +} + +std::string FIROpenACCSupportAnalysis::getRecipeName(mlir::acc::RecipeKind kind, + Type type, Value var) { + return fir::acc::getRecipeName(kind, type, var); +} + +mlir::InFlightDiagnostic +FIROpenACCSupportAnalysis::emitNYI(Location loc, const Twine &message) { + TODO(loc, message); + // Should be unreachable, but we return an actual diagnostic + // to satisfy the interface. + return mlir::emitError(loc, "not yet implemented: " + message.str()); +} + +} // namespace acc +} // namespace fir diff --git a/flang/lib/Optimizer/OpenACC/CMakeLists.txt b/flang/lib/Optimizer/OpenACC/CMakeLists.txt index 790b9fdb1589a..16a40254dbfe9 100644 --- a/flang/lib/Optimizer/OpenACC/CMakeLists.txt +++ b/flang/lib/Optimizer/OpenACC/CMakeLists.txt @@ -1,2 +1,3 @@ +add_subdirectory(Analysis) add_subdirectory(Support) add_subdirectory(Transforms) diff --git a/flang/lib/Optimizer/OpenACC/Support/CMakeLists.txt b/flang/lib/Optimizer/OpenACC/Support/CMakeLists.txt index 898fb00d41dfe..9c6f0ee74f4cf 100644 --- a/flang/lib/Optimizer/OpenACC/Support/CMakeLists.txt +++ b/flang/lib/Optimizer/OpenACC/Support/CMakeLists.txt @@ -4,6 +4,7 @@ add_flang_library(FIROpenACCSupport FIROpenACCAttributes.cpp FIROpenACCOpsInterfaces.cpp FIROpenACCTypeInterfaces.cpp + FIROpenACCUtils.cpp RegisterOpenACCExtensions.cpp DEPENDS diff --git a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCUtils.cpp b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCUtils.cpp new file mode 100644 index 0000000000000..e5b8123305c62 --- /dev/null +++ b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCUtils.cpp @@ -0,0 +1,269 @@ +//===- FIROpenACCUtils.cpp - FIR OpenACC Utilities ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements utility functions for FIR OpenACC support. +// +//===----------------------------------------------------------------------===// + +#include "flang/Optimizer/OpenACC/Support/FIROpenACCUtils.h" +#include "flang/Optimizer/Dialect/FIROps.h" +#include "flang/Optimizer/Dialect/FIROpsSupport.h" +#include "flang/Optimizer/Dialect/FIRType.h" +#include "flang/Optimizer/Dialect/Support/FIRContext.h" +#include "flang/Optimizer/Dialect/Support/KindMapping.h" +#include "flang/Optimizer/HLFIR/HLFIROps.h" +#include "flang/Optimizer/Support/InternalNames.h" +#include "mlir/Dialect/OpenACC/OpenACC.h" +#include "mlir/IR/Matchers.h" +#include "mlir/Interfaces/ViewLikeInterface.h" +#include "llvm/ADT/TypeSwitch.h" +#include "llvm/Support/raw_ostream.h" + +using namespace mlir; + +namespace fir { +namespace acc { + +std::string getVariableName(Value v, bool preferDemangledName) { + std::string srcName; + std::string prefix; + llvm::SmallVector arrayIndices; + bool iterate = true; + mlir::Operation *defOp; + + // For integer constants, no need to further iterate - print their value + // immediately. + if (v.getDefiningOp()) { + IntegerAttr::ValueType val; + if (matchPattern(v.getDefiningOp(), m_ConstantInt(&val))) { + llvm::raw_string_ostream os(prefix); + val.print(os, /*isSigned=*/true); + return prefix; + } + } + + while (v && (defOp = v.getDefiningOp()) && iterate) { + iterate = + llvm::TypeSwitch(defOp) + .Case( + [&v](mlir::ViewLikeOpInterface op) { + v = op.getViewSource(); + return true; + }) + .Case([&v](fir::ReboxOp op) { + v = op.getBox(); + return true; + }) + .Case([&v](fir::EmboxOp op) { + v = op.getMemref(); + return true; + }) + .Case([&v](fir::ConvertOp op) { + v = op.getValue(); + return true; + }) + .Case([&v](fir::LoadOp op) { + v = op.getMemref(); + return true; + }) + .Case([&v](fir::BoxAddrOp op) { + // The box holds the name of the variable. + v = op.getVal(); + return true; + }) + .Case([&](fir::AddrOfOp op) { + // Only use address_of symbol if mangled name is preferred + if (!preferDemangledName) { + auto symRef = op.getSymbol(); + srcName = symRef.getLeafReference().getValue().str(); + } + return false; + }) + .Case([&](fir::ArrayCoorOp op) { + v = op.getMemref(); + for (auto coor : op.getIndices()) { + auto idxName = getVariableName(coor, preferDemangledName); + arrayIndices.push_back(idxName.empty() ? "?" : idxName); + } + return true; + }) + .Case([&](fir::CoordinateOp op) { + std::optional> fieldIndices = + op.getFieldIndices(); + if (fieldIndices && fieldIndices->size() > 0 && + (*fieldIndices)[0] != fir::CoordinateOp::kDynamicIndex) { + int fieldId = (*fieldIndices)[0]; + mlir::Type baseType = + fir::getFortranElementType(op.getRef().getType()); + if (auto recType = llvm::dyn_cast(baseType)) { + srcName = recType.getTypeList()[fieldId].first; + } + } + if (!srcName.empty()) { + // If the field name is known - attempt to continue building + // name by looking at its parents. + prefix = + getVariableName(op.getRef(), preferDemangledName) + "%"; + } + return false; + }) + .Case([&](hlfir::DesignateOp op) { + if (op.getComponent()) { + srcName = op.getComponent().value().str(); + prefix = + getVariableName(op.getMemref(), preferDemangledName) + "%"; + return false; + } + for (auto coor : op.getIndices()) { + auto idxName = getVariableName(coor, preferDemangledName); + arrayIndices.push_back(idxName.empty() ? "?" : idxName); + } + v = op.getMemref(); + return true; + }) + .Case([&](auto op) { + srcName = op.getUniqName().str(); + return false; + }) + .Case([&](fir::AllocaOp op) { + if (preferDemangledName) { + // Prefer demangled name (bindc_name over uniq_name) + srcName = op.getBindcName() ? *op.getBindcName() + : op.getUniqName() ? *op.getUniqName() + : ""; + } else { + // Prefer mangled name (uniq_name over bindc_name) + srcName = op.getUniqName() ? *op.getUniqName() + : op.getBindcName() ? *op.getBindcName() + : ""; + } + return false; + }) + .Default([](mlir::Operation *) { return false; }); + } + + // Fallback to the default implementation. + if (srcName.empty()) + return acc::getVariableName(v); + + // Build array index suffix if present + std::string suffix; + if (!arrayIndices.empty()) { + llvm::raw_string_ostream os(suffix); + os << "("; + llvm::interleaveComma(arrayIndices, os); + os << ")"; + } + + // Names from FIR operations may be mangled. + // When the demangled name is requested - demangle it. + if (preferDemangledName) { + auto [kind, deconstructed] = fir::NameUniquer::deconstruct(srcName); + if (kind != fir::NameUniquer::NameKind::NOT_UNIQUED) + return prefix + deconstructed.name + suffix; + } + + return prefix + srcName + suffix; +} + +bool areAllBoundsConstant(llvm::ArrayRef bounds) { + for (auto bound : bounds) { + auto dataBound = + mlir::dyn_cast(bound.getDefiningOp()); + if (!dataBound) + return false; + + // Check if this bound has constant values + bool hasConstant = false; + if (dataBound.getLowerbound() && dataBound.getUpperbound()) + hasConstant = + fir::getIntIfConstant(dataBound.getLowerbound()).has_value() && + fir::getIntIfConstant(dataBound.getUpperbound()).has_value(); + else if (dataBound.getExtent()) + hasConstant = fir::getIntIfConstant(dataBound.getExtent()).has_value(); + + if (!hasConstant) + return false; + } + return true; +} + +static std::string getBoundsString(llvm::ArrayRef bounds) { + if (bounds.empty()) + return ""; + + std::string boundStr; + llvm::raw_string_ostream os(boundStr); + os << "_section_"; + + llvm::interleave( + bounds, + [&](Value bound) { + auto boundsOp = + mlir::cast(bound.getDefiningOp()); + if (boundsOp.getLowerbound() && + fir::getIntIfConstant(boundsOp.getLowerbound()) && + boundsOp.getUpperbound() && + fir::getIntIfConstant(boundsOp.getUpperbound())) { + os << "lb" << *fir::getIntIfConstant(boundsOp.getLowerbound()) + << ".ub" << *fir::getIntIfConstant(boundsOp.getUpperbound()); + } else if (boundsOp.getExtent() && + fir::getIntIfConstant(boundsOp.getExtent())) { + os << "ext" << *fir::getIntIfConstant(boundsOp.getExtent()); + } else { + os << "?"; + } + }, + [&] { os << "x"; }); + + return os.str(); +} + +std::string getRecipeName(mlir::acc::RecipeKind kind, Type type, Value var, + llvm::ArrayRef bounds, + mlir::acc::ReductionOperator reductionOp) { + assert(fir::isa_fir_type(type) && "getRecipeName expects a FIR type"); + + // Build the complete prefix with all components before calling + // getTypeAsString + std::string prefixStr; + llvm::raw_string_ostream prefixOS(prefixStr); + + switch (kind) { + case mlir::acc::RecipeKind::private_recipe: + prefixOS << "privatization"; + // Private recipes do not currently include bounds in the name + // TODO: They should include them - but lowering tests would need to + // be updated. + break; + case mlir::acc::RecipeKind::firstprivate_recipe: + prefixOS << "firstprivatization"; + // Add bounds to the prefix if applicable (only for firstprivate) + if (!bounds.empty() && areAllBoundsConstant(bounds)) + prefixOS << getBoundsString(bounds); + break; + case mlir::acc::RecipeKind::reduction_recipe: + prefixOS << "reduction"; + // Embed the reduction operator in the prefix + if (reductionOp != mlir::acc::ReductionOperator::AccNone) + prefixOS << "_" + << mlir::acc::stringifyReductionOperator(reductionOp).str(); + // Add bounds to the prefix if applicable (only for reduction) + if (!bounds.empty() && areAllBoundsConstant(bounds)) + prefixOS << getBoundsString(bounds); + break; + } + + auto kindMap = var && var.getDefiningOp() + ? fir::getKindMapping(var.getDefiningOp()) + : fir::KindMapping(type.getContext()); + return fir::getTypeAsString(type, kindMap, prefixOS.str()); +} + +} // namespace acc +} // namespace fir diff --git a/flang/lib/Optimizer/OpenACC/Transforms/ACCInitializeFIRAnalyses.cpp b/flang/lib/Optimizer/OpenACC/Transforms/ACCInitializeFIRAnalyses.cpp new file mode 100644 index 0000000000000..679b29bb462b5 --- /dev/null +++ b/flang/lib/Optimizer/OpenACC/Transforms/ACCInitializeFIRAnalyses.cpp @@ -0,0 +1,56 @@ +//===- ACCInitializeFIRAnalyses.cpp - Initialize FIR analyses ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This pass initializes analyses that can be reused by subsequent OpenACC +// passes in the pipeline. +// +//===----------------------------------------------------------------------===// + +#include "flang/Optimizer/Analysis/AliasAnalysis.h" +#include "flang/Optimizer/OpenACC/Analysis/FIROpenACCSupportAnalysis.h" +#include "flang/Optimizer/OpenACC/Passes.h" +#include "mlir/Analysis/AliasAnalysis.h" +#include "mlir/Dialect/OpenACC/Analysis/OpenACCSupport.h" + +namespace fir { +namespace acc { +#define GEN_PASS_DEF_ACCINITIALIZEFIRANALYSES +#include "flang/Optimizer/OpenACC/Passes.h.inc" +} // namespace acc +} // namespace fir + +#define DEBUG_TYPE "acc-initialize-fir-analyses" + +namespace { + +/// This pass initializes analyses for reuse by subsequent OpenACC passes in the +/// pipeline. It creates and caches analyses like OpenACCSupport so they can be +/// retrieved by later passes using getAnalysis() or getCachedAnalysis(). +class ACCInitializeFIRAnalysesPass + : public fir::acc::impl::ACCInitializeFIRAnalysesBase< + ACCInitializeFIRAnalysesPass> { +public: + void runOnOperation() override { + // Initialize OpenACCSupport with FIR-specific implementation. + auto &openACCSupport = getAnalysis(); + openACCSupport.setImplementation(fir::acc::FIROpenACCSupportAnalysis()); + + // Initialize AliasAnalysis with FIR-specific implementation. + auto &aliasAnalysis = getAnalysis(); + aliasAnalysis.addAnalysisImplementation(fir::AliasAnalysis()); + + // Mark all analyses as preserved since this pass only initializes them + markAllAnalysesPreserved(); + } +}; + +} // namespace + +std::unique_ptr fir::acc::createACCInitializeFIRAnalysesPass() { + return std::make_unique(); +} diff --git a/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt b/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt index ed177baf52bea..963b7351d3a45 100644 --- a/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt +++ b/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt @@ -1,4 +1,5 @@ add_flang_library(FIROpenACCTransforms + ACCInitializeFIRAnalyses.cpp ACCRecipeBufferization.cpp DEPENDS @@ -6,6 +7,8 @@ add_flang_library(FIROpenACCTransforms LINK_LIBS FIRDialect + FIROpenACCAnalysis + HLFIRDialect MLIR_LIBS MLIRIR diff --git a/flang/test/Transforms/OpenACC/acc-implicit-copy-reduction.fir b/flang/test/Transforms/OpenACC/acc-implicit-copy-reduction.fir new file mode 100644 index 0000000000000..d0fc5b7a2ee0b --- /dev/null +++ b/flang/test/Transforms/OpenACC/acc-implicit-copy-reduction.fir @@ -0,0 +1,134 @@ +// RUN: fir-opt %s --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data{enable-implicit-reduction-copy=true})" -split-input-file | FileCheck %s --check-prefix=COPY +// RUN: fir-opt %s --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data{enable-implicit-reduction-copy=false})" -split-input-file | FileCheck %s --check-prefix=FIRSTPRIVATE + +// Test case: integer reduction in parallel loop +// This corresponds to Fortran code: +// integer :: r, i +// r = 0 +// !$acc parallel +// !$acc loop gang reduction(+:r) +// do i = 1, N +// r = r + 1 +// enddo +// !$acc end parallel + +acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref reduction_operator init { +^bb0(%arg0: !fir.ref): + %c0_i32 = arith.constant 0 : i32 + %0 = fir.alloca i32 + %1 = fir.declare %0 {uniq_name = "acc.reduction.init"} : (!fir.ref) -> !fir.ref + fir.store %c0_i32 to %1 : !fir.ref + acc.yield %1 : !fir.ref +} combiner { +^bb0(%arg0: !fir.ref, %arg1: !fir.ref): + %0 = fir.load %arg0 : !fir.ref + %1 = fir.load %arg1 : !fir.ref + %2 = arith.addi %0, %1 : i32 + fir.store %2 to %arg0 : !fir.ref + acc.yield %arg0 : !fir.ref +} + +func.func @test_reduction_implicit_copy() { + %c1_i32 = arith.constant 1 : i32 + %cN = arith.constant 100 : i32 + %r = fir.alloca i32 {bindc_name = "r", uniq_name = "_QFEr"} + %i = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"} + %r_decl = fir.declare %r {uniq_name = "_QFEr"} : (!fir.ref) -> !fir.ref + %i_decl = fir.declare %i {uniq_name = "_QFEi"} : (!fir.ref) -> !fir.ref + %c0_i32 = arith.constant 0 : i32 + fir.store %c0_i32 to %r_decl : !fir.ref + + acc.parallel { + %red_var = acc.reduction varPtr(%r_decl : !fir.ref) -> !fir.ref {name = "r"} + acc.loop reduction(@reduction_add_ref_i32 -> %red_var : !fir.ref) control(%iv : i32) = (%c1_i32 : i32) to (%cN : i32) step (%c1_i32 : i32) { + fir.store %iv to %i_decl : !fir.ref + %cur_r = fir.load %red_var : !fir.ref + %new_r = arith.addi %cur_r, %c1_i32 : i32 + fir.store %new_r to %red_var : !fir.ref + acc.yield + } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} + acc.yield + } + return +} + +// When enable-implicit-reduction-copy=true: expect copyin/copyout for reduction variable +// COPY: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "r"} +// COPY: acc.copyout accPtr(%[[COPYIN]] : !fir.ref) to varPtr({{.*}} : !fir.ref) {dataClause = #acc, implicit = true, name = "r"} + +// When enable-implicit-reduction-copy=false: expect firstprivate for reduction variable +// FIRSTPRIVATE: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "r"} +// FIRSTPRIVATE-NOT: acc.copyin +// FIRSTPRIVATE-NOT: acc.copyout + +// ----- + +// Test case: reduction variable used both in loop and outside (should be firstprivate) +// This corresponds to Fortran code: +// integer :: r = 0, i, out +// !$acc parallel num_gangs(1) +// !$acc loop reduction(+:r) copyout(out) +// do i = 1, N +// r = r + 1 +// enddo +// out = r +// !$acc end parallel + +acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref reduction_operator init { +^bb0(%arg0: !fir.ref): + %c0_i32 = arith.constant 0 : i32 + %0 = fir.alloca i32 + %1 = fir.declare %0 {uniq_name = "acc.reduction.init"} : (!fir.ref) -> !fir.ref + fir.store %c0_i32 to %1 : !fir.ref + acc.yield %1 : !fir.ref +} combiner { +^bb0(%arg0: !fir.ref, %arg1: !fir.ref): + %0 = fir.load %arg0 : !fir.ref + %1 = fir.load %arg1 : !fir.ref + %2 = arith.addi %0, %1 : i32 + fir.store %2 to %arg0 : !fir.ref + acc.yield %arg0 : !fir.ref +} + +func.func @test_reduction_with_usage_outside_loop() { + %c1_i32 = arith.constant 1 : i32 + %cN = arith.constant 100 : i32 + %c0_i32 = arith.constant 0 : i32 + + %r = fir.alloca i32 {bindc_name = "r", uniq_name = "_QFEr"} + %i = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"} + %out = fir.alloca i32 {bindc_name = "out", uniq_name = "_QFEout"} + + %r_decl = fir.declare %r {uniq_name = "_QFEr"} : (!fir.ref) -> !fir.ref + %i_decl = fir.declare %i {uniq_name = "_QFEi"} : (!fir.ref) -> !fir.ref + %out_decl = fir.declare %out {uniq_name = "_QFEout"} : (!fir.ref) -> !fir.ref + fir.store %c0_i32 to %r_decl : !fir.ref + + %out_copyout = acc.create varPtr(%out_decl : !fir.ref) -> !fir.ref {dataClause = #acc, name = "out"} + acc.parallel dataOperands(%out_copyout : !fir.ref) { + %red_var = acc.reduction varPtr(%r_decl : !fir.ref) -> !fir.ref {name = "r"} + acc.loop reduction(@reduction_add_ref_i32 -> %red_var : !fir.ref) control(%iv : i32) = (%c1_i32 : i32) to (%cN : i32) step (%c1_i32 : i32) { + fir.store %iv to %i_decl : !fir.ref + %cur_r = fir.load %red_var : !fir.ref + %new_r = arith.addi %cur_r, %c1_i32 : i32 + fir.store %new_r to %red_var : !fir.ref + acc.yield + } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} + // out = r (usage of r outside the loop) + %final_r = fir.load %r_decl : !fir.ref + fir.store %final_r to %out_copyout : !fir.ref + acc.yield + } + acc.copyout accPtr(%out_copyout : !fir.ref) to varPtr(%out_decl : !fir.ref) {dataClause = #acc, name = "out"} + return +} + +// In this case, r should be firstprivate regardless of the flag setting because it's used outside the reduction context +// COPY-LABEL: func.func @test_reduction_with_usage_outside_loop +// COPY: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "r"} +// COPY-NOT: acc.copyin varPtr({{.*}} : !fir.ref) -> !fir.ref {{.*}} name = "r" + +// FIRSTPRIVATE-LABEL: func.func @test_reduction_with_usage_outside_loop +// FIRSTPRIVATE: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "r"} +// FIRSTPRIVATE-NOT: acc.copyin varPtr({{.*}} : !fir.ref) -> !fir.ref {{.*}} name = "r" + diff --git a/flang/test/Transforms/OpenACC/acc-implicit-data-derived-type-member.F90 b/flang/test/Transforms/OpenACC/acc-implicit-data-derived-type-member.F90 new file mode 100644 index 0000000000000..71e7d79b7260f --- /dev/null +++ b/flang/test/Transforms/OpenACC/acc-implicit-data-derived-type-member.F90 @@ -0,0 +1,38 @@ +!RUN: rm -rf %t && mkdir %t && cd %t && \ +!RUN: bbc %s -fopenacc -emit-hlfir -o - \ +!RUN: | fir-opt --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data)" \ +!RUN: | FileCheck %s + +! This test exercises whether the ACCImplicitData pass inserts its new +! data operations in appropriate position so that parents are copied in before +! their children. + +module types + type derivc8r4 + complex(8) :: member0 + real(4) :: member1 + end type derivc8r4 +end module +program test + use types + implicit none + type (derivc8r4) :: d2 + type (derivc8r4) :: d4 + integer(4) :: i0 + d2%member0 = 123 + !$acc serial copyin(d2%member0) copyout(d4%member0) + do i0 = 1, 1 + d4%member0 = d2%member0 + end do + !$acc end serial +end program + +!CHECK: acc.copyin {{.*}} {dataClause = #acc, implicit = true, name = "d2"} +!CHECK: acc.copyin {{.*}} {name = "d2%member0"} +!CHECK: acc.copyin {{.*}} {dataClause = #acc, implicit = true, name = "d4"} +!CHECK: acc.create {{.*}} {dataClause = #acc, name = "d4%member0"} +!CHECK: acc.delete {{.*}} {dataClause = #acc, name = "d2%member0"} +!CHECK: acc.copyout {{.*}} {dataClause = #acc, implicit = true, name = "d2"} +!CHECK: acc.copyout {{.*}} {name = "d4%member0"} +!CHECK: acc.copyout {{.*}} {dataClause = #acc, implicit = true, name = "d4"} + diff --git a/flang/test/Transforms/OpenACC/acc-implicit-data-fortran.F90 b/flang/test/Transforms/OpenACC/acc-implicit-data-fortran.F90 new file mode 100644 index 0000000000000..228aba1b1164d --- /dev/null +++ b/flang/test/Transforms/OpenACC/acc-implicit-data-fortran.F90 @@ -0,0 +1,79 @@ +!RUN: rm -rf %t && mkdir %t && cd %t && \ +!RUN: bbc %s -fopenacc -emit-hlfir -o - \ +!RUN: | fir-opt --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data)" \ +!RUN: | FileCheck %s --check-prefix=CHECKHLFIR + +!RUN: rm -rf %t && mkdir %t && cd %t && \ +!RUN: bbc %s -fopenacc -emit-hlfir -o - \ +!RUN: | fir-opt --pass-pipeline="builtin.module(cse,acc-initialize-fir-analyses,acc-implicit-data)" \ +!RUN: | FileCheck %s --check-prefix=CHECKCSE + +!RUN: rm -rf %t && mkdir %t && cd %t && \ +!RUN: bbc %s -fopenacc -emit-fir -o - \ +!RUN: | fir-opt --pass-pipeline="builtin.module(cse,acc-initialize-fir-analyses,acc-implicit-data)" \ +!RUN: | FileCheck %s --check-prefix=CHECKCSE + +! This test uses bbc to generate both HLFIR and FIR for this test. The intent is +! that it is exercising the acc implicit data pipeline and ensures that +! correct clauses are generated. It also runs CSE which eliminates redundant +! interior pointer computations (and thus different live-ins are found). + +program main + type aggr + real :: field + end type + type nested + type(aggr) :: outer + end type + type(aggr) :: aggrvar + type(nested) :: nestaggrvar + real :: scalarvar + real :: arrayvar(10) + complex :: scalarcomp + + aggrvar%field = 1 + scalarvar = aggrvar%field + nestaggrvar%outer%field = scalarvar + scalarcomp = scalarvar + arrayvar = real(scalarcomp) + arrayvar(2) = aggrvar%field + + !$acc kernels + arrayvar = aggrvar%field + scalarvar + nestaggrvar%outer%field + real(scalarcomp) + arrayvar(2) + !$acc end kernels + + !$acc parallel + arrayvar = aggrvar%field + scalarvar + nestaggrvar%outer%field + real(scalarcomp) + arrayvar(2) + !$acc end parallel +end program + +!CHECKHLFIR-LABEL: @_QQmain +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "aggrvar"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref}>>) -> !fir.ref}>> {dataClause = #acc, implicit = true, name = "nestaggrvar"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "scalarcomp"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "scalarvar"} +!CHECKHLFIR: acc.kernels +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "aggrvar"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +!CHECKHLFIR-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref}>>) -> !fir.ref}>> {dataClause = #acc, implicit = true, name = "nestaggrvar"} +!CHECKHLFIR-DAG: acc.firstprivate varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "scalarcomp"} +!CHECKHLFIR-DAG: acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "scalarvar"} +!CHECKHLFIR: acc.parallel + +!CHECKCSE-LABEL: @_QQmain +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "scalarcomp"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "scalarvar"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "aggrvar%field"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "nestaggrvar%outer%field"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "arrayvar(2)"} +!CHECKCSE: acc.kernels +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +!CHECKCSE-DAG: acc.firstprivate varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "scalarcomp"} +!CHECKCSE-DAG: acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "scalarvar"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "aggrvar%field"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "nestaggrvar%outer%field"} +!CHECKCSE-DAG: acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "arrayvar(2)"} +!CHECKCSE: acc.parallel + diff --git a/flang/test/Transforms/OpenACC/acc-implicit-data.fir b/flang/test/Transforms/OpenACC/acc-implicit-data.fir new file mode 100644 index 0000000000000..7f6a57cb4d8c6 --- /dev/null +++ b/flang/test/Transforms/OpenACC/acc-implicit-data.fir @@ -0,0 +1,358 @@ +// RUN: fir-opt %s --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data)" -split-input-file | FileCheck %s + +// ----- + +func.func @test_fir_scalar_in_serial() { + %livein = fir.alloca i64 {bindc_name = "scalarvar"} + acc.serial { + %load = fir.load %livein : !fir.ref + acc.yield + } + return +} + +// CHECK: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "scalarvar"} + +// ----- + +func.func @test_fir_scalar_in_parallel() { + %livein = fir.alloca f32 {bindc_name = "scalarvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref + acc.yield + } + return +} + +// CHECK: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "scalarvar"} + +// ----- + +func.func @test_fir_scalar_in_kernels() { + %livein = fir.alloca f64 {bindc_name = "scalarvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref + acc.terminator + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "scalarvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref) to varPtr({{.*}} : !fir.ref) {dataClause = #acc, implicit = true, name = "scalarvar"} + +// ----- + +func.func @test_fir_scalar_in_parallel_defaultnone() { + %livein = fir.alloca f32 {bindc_name = "scalarvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref + acc.yield + } attributes {defaultAttr = #acc} + return +} + +// CHECK-NOT: acc.firstprivate + +// ----- + +func.func @test_fir_scalar_in_kernels_defaultnone() { + %livein = fir.alloca f64 {bindc_name = "scalarvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref + acc.terminator + } attributes {defaultAttr = #acc} + return +} + +// CHECK-NOT: acc.copyin + +// ----- + +func.func @test_fir_derivedtype_in_parallel() { + %livein = fir.alloca !fir.type<_QFTaggr{field:f32}> {bindc_name = "aggrvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "aggrvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) to varPtr({{.*}} : !fir.ref>) {dataClause = #acc, implicit = true, name = "aggrvar"} + +// ----- + +func.func @test_fir_derivedtype_in_kernels() { + %livein = fir.alloca !fir.type<_QFTaggr{field:f32}> {bindc_name = "aggrvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref> + acc.terminator + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "aggrvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) to varPtr({{.*}} : !fir.ref>) {dataClause = #acc, implicit = true, name = "aggrvar"} + +// ----- + +func.func @test_fir_array_in_parallel() { + %livein = fir.alloca !fir.array<10xf32> {bindc_name = "arrayvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) to varPtr({{.*}} : !fir.ref>) {dataClause = #acc, implicit = true, name = "arrayvar"} + +// ----- + +func.func @test_fir_array_in_kernels() { + %livein = fir.alloca !fir.array<10xf32> {bindc_name = "arrayvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref> + acc.terminator + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref>) -> !fir.ref> {dataClause = #acc, implicit = true, name = "arrayvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) to varPtr({{.*}} : !fir.ref>) {dataClause = #acc, implicit = true, name = "arrayvar"} + +// ----- + +func.func @test_fir_derivedtype_in_parallel_defaultpresent() { + %livein = fir.alloca !fir.type<_QFTaggr{field:f32}> {bindc_name = "aggrvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref> + acc.yield + } attributes {defaultAttr = #acc} + return +} + +// CHECK: %[[PRESENT:.*]] = acc.present varPtr({{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "aggrvar"} +// CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref>) {dataClause = #acc, implicit = true, name = "aggrvar"} + +// ----- + +func.func @test_fir_derivedtype_in_kernels_defaultpresent() { + %livein = fir.alloca !fir.type<_QFTaggr{field:f32}> {bindc_name = "aggrvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref> + acc.terminator + } attributes {defaultAttr = #acc} + return +} + +// CHECK: %[[PRESENT:.*]] = acc.present varPtr({{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "aggrvar"} +// CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref>) {dataClause = #acc, implicit = true, name = "aggrvar"} + +// ----- + +func.func @test_fir_array_in_parallel_defaultpresent() { + %livein = fir.alloca !fir.array<10xf32> {bindc_name = "arrayvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref> + acc.yield + } attributes {defaultAttr = #acc} + return +} + +// CHECK: %[[PRESENT:.*]] = acc.present varPtr({{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "arrayvar"} +// CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref>) {dataClause = #acc, implicit = true, name = "arrayvar"} + +// ----- + +func.func @test_fir_array_in_kernels_defaultpresent() { + %livein = fir.alloca !fir.array<10xf32> {bindc_name = "arrayvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref> + acc.terminator + } attributes {defaultAttr = #acc} + return +} + +// CHECK: %[[PRESENT:.*]] = acc.present varPtr({{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "arrayvar"} +// CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref>) {dataClause = #acc, implicit = true, name = "arrayvar"} + +// ----- + +func.func @test_fir_scalar_in_parallel_defaultpresent() { + %livein = fir.alloca f32 {bindc_name = "scalarvar"} + acc.parallel { + %load = fir.load %livein : !fir.ref + acc.yield + } attributes {defaultAttr = #acc} + return +} + +// CHECK: acc.firstprivate varPtr({{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "scalarvar"} + +// ----- + +func.func @test_fir_scalar_in_kernels_defaultpresent() { + %livein = fir.alloca f64 {bindc_name = "scalarvar"} + acc.kernels { + %load = fir.load %livein : !fir.ref + acc.terminator + } attributes {defaultAttr = #acc} + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "scalarvar"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref) to varPtr({{.*}} : !fir.ref) {dataClause = #acc, implicit = true, name = "scalarvar"} + +// ----- + +func.func @test_fir_box_ref() { + %livein = fir.alloca !fir.box> {bindc_name = "descriptor"} + acc.parallel { + %load = fir.load %livein : !fir.ref>> + acc.yield + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : !fir.ref>>) -> !fir.ref>> {dataClause = #acc, implicit = true, name = "descriptor"} +// CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>>) to varPtr({{.*}} : !fir.ref>>) {dataClause = #acc, implicit = true, name = "descriptor"} + +// ----- + +func.func @test_fir_box_val() { + %desc = fir.alloca !fir.box> {bindc_name = "descriptor"} + %livein = fir.load %desc : !fir.ref>> + acc.parallel { + %addr = fir.box_addr %livein : (!fir.box>) -> !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[COPYIN:.*]] = acc.copyin var({{.*}} : !fir.box>) -> !fir.box> {dataClause = #acc, implicit = true, name = "descriptor"} +// CHECK: acc.copyout accVar(%[[COPYIN]] : !fir.box>) to var({{.*}} : !fir.box>) {dataClause = #acc, implicit = true, name = "descriptor"} + + +// ----- + +// This test has an explicit data clause for the box - but the pointer held +// inside the box is used in the region instead of the box itself. Test that +// implicit present is actually used. +func.func @test_explicit_box_implicit_ptr() { + %c1 = arith.constant 1 : index + %c10 = arith.constant 10 : index + %arr = fir.alloca !fir.array<10xf32> {bindc_name = "aa"} + %shape = fir.shape %c10 : (index) -> !fir.shape<1> + %arr_decl = fir.declare %arr(%shape) {uniq_name = "aa"} : (!fir.ref>, !fir.shape<1>) -> !fir.ref> + %box = fir.embox %arr_decl(%shape) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + %copyin = acc.copyin var(%box : !fir.box>) -> !fir.box> {dataClause = #acc, name = "aa"} + acc.serial dataOperands(%copyin : !fir.box>) { + // Use the pointer, not the box + %elem = fir.array_coor %arr_decl(%shape) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref + acc.yield + } + acc.copyout accVar(%copyin : !fir.box>) to var(%box : !fir.box>) {dataClause = #acc, name = "aa"} + return +} + +// CHECK: acc.present varPtr(%{{.*}} : !fir.ref>){{.*}}-> !fir.ref> {implicit = true, name = "aa"} + +// ----- + +// This test uses an explicit-shape array with no data clause - it also has +// an optimization where the pointer is used instead of the boxed entity. +// It tests that the implicit data pass is able to recover the size despite +// it not being encoded in the FIR type. +// It was generated from the following Fortran source: +// subroutine array(aa,nn) +// integer :: nn +// real :: aa(10:nn) +// !$acc kernels loop +// do ii = 10, nn +// aa(ii) = ii +// end do +// !$acc end kernels +// end subroutine + +func.func @_QParray(%arg0: !fir.ref> {fir.bindc_name = "aa"}, %arg1: !fir.ref {fir.bindc_name = "nn"}) { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c10_i64 = arith.constant 10 : i64 + %0 = fir.dummy_scope : !fir.dscope + %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFarrayEnn"} : (!fir.ref, !fir.dscope) -> !fir.ref + %4 = fir.convert %c10_i64 : (i64) -> index + %5 = fir.load %1 : !fir.ref + %6 = fir.convert %5 : (i32) -> i64 + %7 = fir.convert %6 : (i64) -> index + %8 = arith.subi %7, %4 : index + %9 = arith.addi %8, %c1 : index + %10 = arith.cmpi sgt, %9, %c0 : index + %11 = arith.select %10, %9, %c0 : index + %12 = fir.shape_shift %4, %11 : (index, index) -> !fir.shapeshift<1> + %13 = fir.declare %arg0(%12) dummy_scope %0 {uniq_name = "_QFarrayEaa"} : (!fir.ref>, !fir.shapeshift<1>, !fir.dscope) -> !fir.ref> + acc.kernels { + %elem = fir.array_coor %13(%12) %4 : (!fir.ref>, !fir.shapeshift<1>, index) -> !fir.ref + acc.terminator + } + return +} + +// This tries to confirm that the acc.bounds operation is as expected. +// Effectively the extent needs to be max(0, nn), stride needs to be 1, +// adjusted lowerbound is 0, and actual language start index is 10. +// CHECK: %[[NN:.*]] = fir.declare %{{.*}} dummy_scope %{{.*}} {uniq_name = "_QFarrayEnn"} : (!fir.ref, !fir.dscope) -> !fir.ref +// CHECK: %[[C10:.*]] = fir.convert %c10{{.*}} : (i64) -> index +// CHECK: %[[LOADEDNN:.*]] = fir.load %[[NN]] : !fir.ref +// CHECK: %[[CAST1:.*]] = fir.convert %[[LOADEDNN]] : (i32) -> i64 +// CHECK: %[[CAST2:.*]] = fir.convert %[[CAST1]] : (i64) -> index +// CHECK: %[[SUBI:.*]] = arith.subi %[[CAST2]], %[[C10]] : index +// CHECK: %[[ADDI:.*]] = arith.addi %[[SUBI]], %c1{{.*}} : index +// CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[ADDI]], %c0{{.*}} : index +// CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[ADDI]], %c0{{.*}} : index +// CHECK: %[[BOUNDS:.*]] = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[SELECT]] : index) stride(%c1{{.*}} : index) startIdx(%[[C10]] : index) +// CHECK: acc.copyin varPtr(%{{.*}} : !fir.ref>) bounds(%[[BOUNDS]]) -> !fir.ref> {dataClause = #acc, implicit = true, name = "aa"} + +// ----- + +// Test to confirm that a copyin clause is not implicitly generated for deviceptr symbol. +func.func @test_deviceptr_no_implicit_copy() { + %c10 = arith.constant 10 : index + %arr = fir.alloca !fir.array<10xf64> {bindc_name = "a"} + %shape = fir.shape %c10 : (index) -> !fir.shape<1> + %arr_box = fir.embox %arr(%shape) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + %devptr = acc.deviceptr var(%arr_box : !fir.box>) -> !fir.box> {name = "a"} + acc.parallel dataOperands(%devptr : !fir.box>) { + %elem = fir.box_addr %arr_box : (!fir.box>) -> !fir.ref> + acc.yield + } + return +} + +// CHECK-NOT: acc.copyin +// CHECK: acc.deviceptr + +// ----- + +// Test that acc.declare with deviceptr doesn't generate implicit copyin +func.func @test_acc_declare_deviceptr() { + %c10 = arith.constant 10 : index + %arr = fir.alloca !fir.array<10xf64> {bindc_name = "a"} + %shape = fir.shape %c10 : (index) -> !fir.shape<1> + %arr_box = fir.embox %arr(%shape) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + %devptr = acc.deviceptr var(%arr_box : !fir.box>) -> !fir.box> {name = "a"} + %token = acc.declare_enter dataOperands(%devptr : !fir.box>) + acc.parallel { + %elem = fir.box_addr %arr_box : (!fir.box>) -> !fir.ref> + acc.yield + } + acc.declare_exit token(%token) + return +} + +// CHECK-LABEL: func.func @test_acc_declare_deviceptr +// CHECK: acc.deviceptr +// CHECK-NOT: acc.copyin +// CHECK: acc.deviceptr + diff --git a/flang/test/Transforms/OpenACC/acc-implicit-firstprivate.fir b/flang/test/Transforms/OpenACC/acc-implicit-firstprivate.fir new file mode 100644 index 0000000000000..e4a7b8b18bc2a --- /dev/null +++ b/flang/test/Transforms/OpenACC/acc-implicit-firstprivate.fir @@ -0,0 +1,284 @@ +// RUN: fir-opt %s --pass-pipeline="builtin.module(acc-initialize-fir-analyses,acc-implicit-data)" -split-input-file | FileCheck %s + +// Test implicit firstprivate behavior for various scalar types in parallel and serial constructs. +// Scalars in parallel/serial constructs should be implicitly firstprivate according to OpenACC spec. + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_i32 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca i32 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_i32_scalar_in_parallel +func.func @test_i32_scalar_in_parallel() { + %scalar = fir.alloca i32 {bindc_name = "i32_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "i32_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_i32 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_i64 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca i64 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_i64_scalar_in_parallel +func.func @test_i64_scalar_in_parallel() { + %scalar = fir.alloca i64 {bindc_name = "i64_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "i64_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_i64 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_f32 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca f32 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_f32_scalar_in_parallel +func.func @test_f32_scalar_in_parallel() { + %scalar = fir.alloca f32 {bindc_name = "f32_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "f32_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_f32 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_f64 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca f64 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_f64_scalar_in_parallel +func.func @test_f64_scalar_in_parallel() { + %scalar = fir.alloca f64 {bindc_name = "f64_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "f64_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_f64 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_l32 : !fir.ref> init { +// CHECK: ^bb0(%{{.*}}: !fir.ref>): +// CHECK: %[[ALLOC:.*]] = fir.alloca !fir.logical<4> +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref> +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref>, %[[DST:.*]]: !fir.ref>): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref> +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref> +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_logical_scalar_in_parallel +func.func @test_logical_scalar_in_parallel() { + %scalar = fir.alloca !fir.logical<4> {bindc_name = "logical_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "logical_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_l32 -> %[[FIRSTPRIV]] : !fir.ref>) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_z32 : !fir.ref> init { +// CHECK: ^bb0(%{{.*}}: !fir.ref>): +// CHECK: %[[ALLOC:.*]] = fir.alloca complex +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref> +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref>, %[[DST:.*]]: !fir.ref>): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref> +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref> +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_complex_scalar_in_parallel +func.func @test_complex_scalar_in_parallel() { + %scalar = fir.alloca complex {bindc_name = "complex_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "complex_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_z32 -> %[[FIRSTPRIV]] : !fir.ref>) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_z64 : !fir.ref> init { +// CHECK: ^bb0(%{{.*}}: !fir.ref>): +// CHECK: %[[ALLOC:.*]] = fir.alloca complex +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref> +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref>, %[[DST:.*]]: !fir.ref>): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref> +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref> +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_complex8_scalar_in_parallel +func.func @test_complex8_scalar_in_parallel() { + %scalar = fir.alloca complex {bindc_name = "complex8_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref> + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref>) -> !fir.ref> {implicit = true, name = "complex8_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_z64 -> %[[FIRSTPRIV]] : !fir.ref>) + +// ----- + +// Test with serial construct + +// CHECK-LABEL: func.func @test_i32_scalar_in_serial +func.func @test_i32_scalar_in_serial() { + %scalar = fir.alloca i32 {bindc_name = "serial_i32_var"} + acc.serial { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "serial_i32_var"} +// CHECK: acc.serial firstprivate(@firstprivatization_ref_i32 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// Test with serial construct and f64 + +// CHECK-LABEL: func.func @test_f64_scalar_in_serial +func.func @test_f64_scalar_in_serial() { + %scalar = fir.alloca f64 {bindc_name = "serial_f64_var"} + acc.serial { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "serial_f64_var"} +// CHECK: acc.serial firstprivate(@firstprivatization_ref_f64 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// Test i8 and i16 scalar types + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_i8 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca i8 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_i8_scalar_in_parallel +func.func @test_i8_scalar_in_parallel() { + %scalar = fir.alloca i8 {bindc_name = "i8_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "i8_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_i8 -> %[[FIRSTPRIV]] : !fir.ref) + +// ----- + +// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_i16 : !fir.ref init { +// CHECK: ^bb0(%{{.*}}: !fir.ref): +// CHECK: %[[ALLOC:.*]] = fir.alloca i16 +// CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] +// CHECK: acc.yield %[[DECL]]#0 : !fir.ref +// CHECK: } copy { +// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref, %[[DST:.*]]: !fir.ref): +// CHECK: %[[LOADED:.*]] = fir.load %[[SRC]] : !fir.ref +// CHECK: fir.store %[[LOADED]] to %[[DST]] : !fir.ref +// CHECK: acc.terminator +// CHECK: } + +// CHECK-LABEL: func.func @test_i16_scalar_in_parallel +func.func @test_i16_scalar_in_parallel() { + %scalar = fir.alloca i16 {bindc_name = "i16_var"} + acc.parallel { + %load = fir.load %scalar : !fir.ref + acc.yield + } + return +} + +// CHECK: %[[FIRSTPRIV:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref) -> !fir.ref {implicit = true, name = "i16_var"} +// CHECK: acc.parallel firstprivate(@firstprivatization_ref_i16 -> %[[FIRSTPRIV]] : !fir.ref) + From fce58897ce82de84c8d794609132eb547b2b4871 Mon Sep 17 00:00:00 2001 From: GeorgeHuyubo <113479859+GeorgeHuyubo@users.noreply.github.com> Date: Thu, 6 Nov 2025 12:48:21 -0800 Subject: [PATCH 52/71] [lldb] Enable locate module callback for all module loading (#160199) Main executables were bypassing the locate module callback that shared libraries use, preventing custom symbol file location logic from working consistently. This PR fix this by * Adding target context to ModuleSpec * Leveraging that context to use target search path and platform's locate module callback in ModuleList::GetSharedModule This ensures both main executables and shared libraries get the same callback treatment for symbol file resolution. --------- Co-authored-by: George Hu Co-authored-by: George Hu --- lldb/include/lldb/API/SBModuleSpec.h | 10 + lldb/include/lldb/API/SBTarget.h | 1 + lldb/include/lldb/Core/ModuleList.h | 4 +- lldb/include/lldb/Core/ModuleSpec.h | 18 ++ lldb/include/lldb/Target/Platform.h | 16 +- .../include/lldb/Target/RemoteAwarePlatform.h | 6 +- lldb/source/API/SBModule.cpp | 4 +- lldb/source/API/SBModuleSpec.cpp | 13 ++ lldb/source/Core/DynamicLoader.cpp | 5 +- lldb/source/Core/ModuleList.cpp | 34 +++- .../DynamicLoaderDarwinKernel.cpp | 6 +- .../POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp | 5 +- .../MacOSX/PlatformAppleSimulator.cpp | 8 +- .../Platform/MacOSX/PlatformAppleSimulator.h | 1 - .../Platform/MacOSX/PlatformDarwin.cpp | 47 ++--- .../Plugins/Platform/MacOSX/PlatformDarwin.h | 3 +- .../Platform/MacOSX/PlatformDarwinDevice.cpp | 10 +- .../Platform/MacOSX/PlatformDarwinDevice.h | 1 - .../Platform/MacOSX/PlatformDarwinKernel.cpp | 22 +-- .../Platform/MacOSX/PlatformDarwinKernel.h | 11 +- .../Platform/MacOSX/PlatformMacOSX.cpp | 9 +- .../Plugins/Platform/MacOSX/PlatformMacOSX.h | 1 - .../MacOSX/PlatformRemoteDarwinDevice.cpp | 18 +- .../MacOSX/PlatformRemoteDarwinDevice.h | 1 - .../Process/elf-core/ProcessElfCore.cpp | 3 +- .../Process/mach-core/ProcessMachCore.cpp | 3 +- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 2 +- lldb/source/Target/ModuleCache.cpp | 2 +- lldb/source/Target/Platform.cpp | 44 ++--- lldb/source/Target/RemoteAwarePlatform.cpp | 11 +- lldb/source/Target/Target.cpp | 18 +- lldb/source/Target/TargetList.cpp | 8 +- lldb/unittests/Core/CMakeLists.txt | 1 + lldb/unittests/Core/ModuleListTest.cpp | 178 ++++++++++++++++++ .../Target/LocateModuleCallbackTest.cpp | 20 +- .../Target/RemoteAwarePlatformTest.cpp | 17 +- 36 files changed, 383 insertions(+), 178 deletions(-) create mode 100644 lldb/unittests/Core/ModuleListTest.cpp diff --git a/lldb/include/lldb/API/SBModuleSpec.h b/lldb/include/lldb/API/SBModuleSpec.h index 8d1ecfe6e6f8b..b80a52b7a235f 100644 --- a/lldb/include/lldb/API/SBModuleSpec.h +++ b/lldb/include/lldb/API/SBModuleSpec.h @@ -87,6 +87,16 @@ class LLDB_API SBModuleSpec { bool GetDescription(lldb::SBStream &description); + lldb::SBTarget GetTarget(); + + /// Set the target to be used when resolving a module. + /// + /// A target can help locate a module specified by a SBModuleSpec. The + /// target settings, like the executable and debug info search paths, can + /// be essential. The target's platform can also be used to locate or download + /// the specified module. + void SetTarget(lldb::SBTarget target); + private: friend class SBModuleSpecList; friend class SBModule; diff --git a/lldb/include/lldb/API/SBTarget.h b/lldb/include/lldb/API/SBTarget.h index 173fd05b54a13..379a0bb7e9513 100644 --- a/lldb/include/lldb/API/SBTarget.h +++ b/lldb/include/lldb/API/SBTarget.h @@ -999,6 +999,7 @@ class LLDB_API SBTarget { friend class SBFunction; friend class SBInstruction; friend class SBModule; + friend class SBModuleSpec; friend class SBPlatform; friend class SBProcess; friend class SBSection; diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h index e71f3b2bad6b4..df473dff091f8 100644 --- a/lldb/include/lldb/Core/ModuleList.h +++ b/lldb/include/lldb/Core/ModuleList.h @@ -476,9 +476,9 @@ class ModuleList { static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, - bool *did_create_ptr, bool always_create = false); + bool *did_create_ptr, bool always_create = false, + bool invoke_locate_callback = true); static bool RemoveSharedModule(lldb::ModuleSP &module_sp); diff --git a/lldb/include/lldb/Core/ModuleSpec.h b/lldb/include/lldb/Core/ModuleSpec.h index 86be0383f8b47..acbc85b48f02c 100644 --- a/lldb/include/lldb/Core/ModuleSpec.h +++ b/lldb/include/lldb/Core/ModuleSpec.h @@ -16,9 +16,11 @@ #include "lldb/Utility/Iterable.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/UUID.h" +#include "lldb/lldb-forward.h" #include "llvm/Support/Chrono.h" +#include #include #include @@ -126,6 +128,16 @@ class ModuleSpec { lldb::DataBufferSP GetData() const { return m_data; } + lldb::TargetSP GetTargetSP() const { return m_target_wp.lock(); } + + /// Set the target to be used when resolving a module. + /// + /// A target can help locate a module specified by a ModuleSpec. The target + /// settings, like the executable and debug info search paths, can be + /// essential. The target's platform can also be used to locate or download + /// the specified module. + void SetTarget(std::shared_ptr target) { m_target_wp = target; } + void Clear() { m_file.Clear(); m_platform_file.Clear(); @@ -137,6 +149,7 @@ class ModuleSpec { m_object_size = 0; m_source_mappings.Clear(false); m_object_mod_time = llvm::sys::TimePoint<>(); + m_target_wp.reset(); } explicit operator bool() const { @@ -265,6 +278,11 @@ class ModuleSpec { ArchSpec m_arch; UUID m_uuid; ConstString m_object_name; + /// The target used when resolving a module. A target can help locate a module + /// specified by a ModuleSpec. The target settings, like the executable and + /// debug info search paths, can be essential. The target's platform can also + /// be used to locate or download the specified module. + std::weak_ptr m_target_wp; uint64_t m_object_offset = 0; uint64_t m_object_size = 0; llvm::sys::TimePoint<> m_object_mod_time; diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h index 35ffdabf907e7..1104722f52c70 100644 --- a/lldb/include/lldb/Target/Platform.h +++ b/lldb/include/lldb/Target/Platform.h @@ -127,8 +127,7 @@ class Platform : public PluginInterface { /// Returns \b true if this Platform plug-in was able to find /// a suitable executable, \b false otherwise. virtual Status ResolveExecutable(const ModuleSpec &module_spec, - lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr); + lldb::ModuleSP &exe_module_sp); /// Find a symbol file given a symbol file module specification. /// @@ -304,10 +303,11 @@ class Platform : public PluginInterface { /// \return /// The Status object for any errors found while searching for /// the binary. - virtual Status GetSharedModule( - const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, - llvm::SmallVectorImpl *old_modules, bool *did_create_ptr); + virtual Status + GetSharedModule(const ModuleSpec &module_spec, Process *process, + lldb::ModuleSP &module_sp, + llvm::SmallVectorImpl *old_modules, + bool *did_create_ptr); void CallLocateModuleCallbackIfSet(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, @@ -1039,8 +1039,8 @@ class Platform : public PluginInterface { /// predefined trap handlers, this method may be a no-op. virtual void CalculateTrapHandlerSymbolNames() = 0; - Status GetCachedExecutable(ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr); + Status GetCachedExecutable(ModuleSpec &module_spec, + lldb::ModuleSP &module_sp); virtual Status DownloadModuleSlice(const FileSpec &src_file_spec, const uint64_t src_offset, diff --git a/lldb/include/lldb/Target/RemoteAwarePlatform.h b/lldb/include/lldb/Target/RemoteAwarePlatform.h index fb2eecfaa23a8..de13b18f30d85 100644 --- a/lldb/include/lldb/Target/RemoteAwarePlatform.h +++ b/lldb/include/lldb/Target/RemoteAwarePlatform.h @@ -20,10 +20,8 @@ class RemoteAwarePlatform : public Platform { public: using Platform::Platform; - virtual Status - ResolveExecutable(const ModuleSpec &module_spec, - lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) override; + virtual Status ResolveExecutable(const ModuleSpec &module_spec, + lldb::ModuleSP &exe_module_sp) override; bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, ModuleSpec &module_spec) override; diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index 5a57f45f0d475..32067ac1c650f 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -37,8 +37,8 @@ SBModule::SBModule(const SBModuleSpec &module_spec) { LLDB_INSTRUMENT_VA(this, module_spec); ModuleSP module_sp; - Status error = ModuleList::GetSharedModule( - *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr); + Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_up, + module_sp, nullptr, nullptr); if (module_sp) SetSP(module_sp); } diff --git a/lldb/source/API/SBModuleSpec.cpp b/lldb/source/API/SBModuleSpec.cpp index fbbcfeac20178..031ba1256d18a 100644 --- a/lldb/source/API/SBModuleSpec.cpp +++ b/lldb/source/API/SBModuleSpec.cpp @@ -9,6 +9,7 @@ #include "lldb/API/SBModuleSpec.h" #include "Utils.h" #include "lldb/API/SBStream.h" +#include "lldb/API/SBTarget.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Host/Host.h" @@ -174,6 +175,18 @@ void SBModuleSpec::SetObjectSize(uint64_t object_size) { m_opaque_up->SetObjectSize(object_size); } +SBTarget SBModuleSpec::GetTarget() { + LLDB_INSTRUMENT_VA(this); + + return SBTarget(m_opaque_up->GetTargetSP()); +} + +void SBModuleSpec::SetTarget(SBTarget target) { + LLDB_INSTRUMENT_VA(this, target); + + m_opaque_up->SetTarget(target.GetSP()); +} + SBModuleSpecList::SBModuleSpecList() : m_opaque_up(new ModuleSpecList()) { LLDB_INSTRUMENT_VA(this); } diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp index 7580b15c02ce1..b309e0f0a72fd 100644 --- a/lldb/source/Core/DynamicLoader.cpp +++ b/lldb/source/Core/DynamicLoader.cpp @@ -227,6 +227,7 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress( } } ModuleSpec module_spec; + module_spec.SetTarget(target.shared_from_this()); module_spec.GetUUID() = uuid; FileSpec name_filespec(name); if (FileSystem::Instance().Exists(name_filespec)) @@ -238,8 +239,8 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress( // Has lldb already seen a module with this UUID? // Or have external lookup enabled in DebugSymbols on macOS. if (!module_sp) - error = ModuleList::GetSharedModule(module_spec, module_sp, nullptr, - nullptr, nullptr); + error = + ModuleList::GetSharedModule(module_spec, module_sp, nullptr, nullptr); // Can lldb's symbol/executable location schemes // find an executable and symbol file. diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index c40612c1ced5e..d9f845681e701 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -19,6 +19,8 @@ #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/TypeList.h" #include "lldb/Symbol/VariableList.h" +#include "lldb/Target/Platform.h" +#include "lldb/Target/Target.h" #include "lldb/Utility/ArchSpec.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/FileSpecList.h" @@ -1038,9 +1040,9 @@ size_t ModuleList::RemoveOrphanSharedModules(bool mandatory) { Status ModuleList::GetSharedModule(const ModuleSpec &module_spec, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, - bool *did_create_ptr, bool always_create) { + bool *did_create_ptr, bool always_create, + bool invoke_locate_callback) { SharedModuleList &shared_module_list = GetSharedModuleList(); std::lock_guard guard(shared_module_list.GetMutex()); char path[PATH_MAX]; @@ -1095,6 +1097,22 @@ ModuleList::GetSharedModule(const ModuleSpec &module_spec, ModuleSP &module_sp, if (module_sp) return error; + // Try target's platform locate module callback before second attempt. + if (invoke_locate_callback) { + TargetSP target_sp = module_spec.GetTargetSP(); + if (target_sp && target_sp->IsValid()) { + if (PlatformSP platform_sp = target_sp->GetPlatform()) { + FileSpec symbol_file_spec; + platform_sp->CallLocateModuleCallbackIfSet( + module_spec, module_sp, symbol_file_spec, did_create_ptr); + if (module_sp) { + // The callback found a module. + return error; + } + } + } + } + module_sp = std::make_shared(module_spec); // Make sure there are a module and an object file since we can specify a // valid file path with an architecture that might not be in that file. By @@ -1122,10 +1140,16 @@ ModuleList::GetSharedModule(const ModuleSpec &module_spec, ModuleSP &module_sp, module_sp.reset(); } - if (module_search_paths_ptr) { - const auto num_directories = module_search_paths_ptr->GetSize(); + // Get module search paths from the target if available. + lldb::TargetSP target_sp = module_spec.GetTargetSP(); + FileSpecList module_search_paths; + if (target_sp) + module_search_paths = target_sp->GetExecutableSearchPaths(); + + if (!module_search_paths.IsEmpty()) { + const auto num_directories = module_search_paths.GetSize(); for (size_t idx = 0; idx < num_directories; ++idx) { - auto search_path_spec = module_search_paths_ptr->GetFileSpecAtIndex(idx); + auto search_path_spec = module_search_paths.GetFileSpecAtIndex(idx); FileSystem::Instance().Resolve(search_path_spec); namespace fs = llvm::sys::fs; if (!FileSystem::Instance().IsDirectory(search_path_spec)) diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp index 1d210ea78df1a..2d0a4f67499ee 100644 --- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -789,6 +789,7 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule( // Search for the kext on the local filesystem via the UUID if (!m_module_sp && m_uuid.IsValid()) { ModuleSpec module_spec; + module_spec.SetTarget(target.shared_from_this()); module_spec.GetUUID() = m_uuid; if (!m_uuid.IsValid()) module_spec.GetArchitecture() = target.GetArchitecture(); @@ -801,9 +802,8 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule( // system. PlatformSP platform_sp(target.GetPlatform()); if (platform_sp) { - FileSpecList search_paths = target.GetExecutableSearchPaths(); - platform_sp->GetSharedModule(module_spec, process, m_module_sp, - &search_paths, nullptr, nullptr); + platform_sp->GetSharedModule(module_spec, process, m_module_sp, nullptr, + nullptr); } // Ask the Target to find this file on the local system, if possible. diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp index 326b6910b5267..470fc2a2fdbb9 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -901,10 +901,9 @@ void DynamicLoaderPOSIXDYLD::ResolveExecutableModule( if (module_sp && module_sp->MatchesModuleSpec(module_spec)) return; + module_spec.SetTarget(target.shared_from_this()); const auto executable_search_paths(Target::GetDefaultExecutableSearchPaths()); - auto error = platform_sp->ResolveExecutable( - module_spec, module_sp, - !executable_search_paths.IsEmpty() ? &executable_search_paths : nullptr); + auto error = platform_sp->ResolveExecutable(module_spec, module_sp); if (error.Fail()) { StreamString stream; module_spec.Dump(stream); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp index 887748b9e9c85..47111c97927c1 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -420,7 +420,6 @@ Status PlatformAppleSimulator::GetSymbolFile(const FileSpec &platform_file, Status PlatformAppleSimulator::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { // For iOS/tvOS/watchOS, the SDK files are all cached locally on the // host system. So first we ask for the file in the cached SDK, then @@ -432,12 +431,10 @@ Status PlatformAppleSimulator::GetSharedModule( error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(), platform_module_spec.GetFileSpec()); if (error.Success()) { - error = ResolveExecutable(platform_module_spec, module_sp, - module_search_paths_ptr); + error = ResolveExecutable(platform_module_spec, module_sp); } else { const bool always_create = false; - error = ModuleList::GetSharedModule(module_spec, module_sp, - module_search_paths_ptr, old_modules, + error = ModuleList::GetSharedModule(module_spec, module_sp, old_modules, did_create_ptr, always_create); } if (module_sp) @@ -660,4 +657,3 @@ void PlatformAppleSimulator::Terminate() { PlatformDarwin::Terminate(); } } - diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h index 7fcf2c502ca6a..77d2a3b4e1cce 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h @@ -89,7 +89,6 @@ class PlatformAppleSimulator : public PlatformDarwin { Status GetSharedModule(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp index 5aad4470091bc..8b4a3e0a7c3fb 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -331,7 +331,6 @@ Status PlatformDarwin::ResolveSymbolFile(Target &target, Status PlatformDarwin::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -341,19 +340,22 @@ Status PlatformDarwin::GetSharedModule( // module first. if (m_remote_platform_sp) { error = m_remote_platform_sp->GetSharedModule( - module_spec, process, module_sp, module_search_paths_ptr, old_modules, - did_create_ptr); + module_spec, process, module_sp, old_modules, did_create_ptr); } } if (!module_sp) { // Fall back to the local platform and find the file locally error = Platform::GetSharedModule(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); const FileSpec &platform_file = module_spec.GetFileSpec(); - if (!module_sp && module_search_paths_ptr && platform_file) { + // Get module search paths from the target if available. + TargetSP target_sp = module_spec.GetTargetSP(); + FileSpecList module_search_paths; + if (target_sp) + module_search_paths = target_sp->GetExecutableSearchPaths(); + if (!module_sp && !module_search_paths.IsEmpty() && platform_file) { // We can try to pull off part of the file path up to the bundle // directory level and try any module search paths... FileSpec bundle_directory; @@ -362,9 +364,9 @@ Status PlatformDarwin::GetSharedModule( ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = bundle_directory; if (Host::ResolveExecutableInBundle(new_module_spec.GetFileSpec())) { - Status new_error(Platform::GetSharedModule( - new_module_spec, process, module_sp, nullptr, old_modules, - did_create_ptr)); + Status new_error(Platform::GetSharedModule(new_module_spec, process, + module_sp, old_modules, + did_create_ptr)); if (module_sp) return new_error; @@ -376,10 +378,10 @@ Status PlatformDarwin::GetSharedModule( const size_t bundle_directory_len = bundle_directory.GetPath(bundle_dir, sizeof(bundle_dir)); char new_path[PATH_MAX]; - size_t num_module_search_paths = module_search_paths_ptr->GetSize(); + size_t num_module_search_paths = module_search_paths.GetSize(); for (size_t i = 0; i < num_module_search_paths; ++i) { const size_t search_path_len = - module_search_paths_ptr->GetFileSpecAtIndex(i).GetPath( + module_search_paths.GetFileSpecAtIndex(i).GetPath( new_path, sizeof(new_path)); if (search_path_len < sizeof(new_path)) { snprintf(new_path + search_path_len, @@ -390,7 +392,7 @@ Status PlatformDarwin::GetSharedModule( ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = new_file_spec; Status new_error(Platform::GetSharedModule( - new_module_spec, process, module_sp, nullptr, old_modules, + new_module_spec, process, module_sp, old_modules, did_create_ptr)); if (module_sp) { @@ -1303,12 +1305,15 @@ PlatformDarwin::LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) { lldb_private::Status PlatformDarwin::FindBundleBinaryInExecSearchPaths( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { const FileSpec &platform_file = module_spec.GetFileSpec(); - // See if the file is present in any of the module_search_paths_ptr + TargetSP target_sp = module_spec.GetTargetSP(); + FileSpecList module_search_paths; + if (target_sp) + module_search_paths = target_sp->GetExecutableSearchPaths(); + // See if the file is present in any of the module_search_paths // directories. - if (!module_sp && module_search_paths_ptr && platform_file) { + if (!module_sp && !module_search_paths.IsEmpty() && platform_file) { // create a vector of all the file / directory names in platform_file e.g. // this might be // /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation @@ -1322,21 +1327,21 @@ lldb_private::Status PlatformDarwin::FindBundleBinaryInExecSearchPaths( std::reverse(path_parts.begin(), path_parts.end()); const size_t path_parts_size = path_parts.size(); - size_t num_module_search_paths = module_search_paths_ptr->GetSize(); + size_t num_module_search_paths = module_search_paths.GetSize(); for (size_t i = 0; i < num_module_search_paths; ++i) { Log *log_verbose = GetLog(LLDBLog::Host); LLDB_LOGF( log_verbose, "PlatformRemoteDarwinDevice::GetSharedModule searching for binary in " "search-path %s", - module_search_paths_ptr->GetFileSpecAtIndex(i).GetPath().c_str()); + module_search_paths.GetFileSpecAtIndex(i).GetPath().c_str()); // Create a new FileSpec with this module_search_paths_ptr plus just the // filename ("UIFoundation"), then the parent dir plus filename // ("UIFoundation.framework/UIFoundation") etc - up to four names (to // handle "Foo.framework/Contents/MacOS/Foo") for (size_t j = 0; j < 4 && j < path_parts_size - 1; ++j) { - FileSpec path_to_try(module_search_paths_ptr->GetFileSpecAtIndex(i)); + FileSpec path_to_try(module_search_paths.GetFileSpecAtIndex(i)); // Add the components backwards. For // .../PrivateFrameworks/UIFoundation.framework/UIFoundation path_parts @@ -1356,9 +1361,9 @@ lldb_private::Status PlatformDarwin::FindBundleBinaryInExecSearchPaths( if (FileSystem::Instance().Exists(path_to_try)) { ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = path_to_try; - Status new_error( - Platform::GetSharedModule(new_module_spec, process, module_sp, - nullptr, old_modules, did_create_ptr)); + Status new_error(Platform::GetSharedModule(new_module_spec, process, + module_sp, old_modules, + did_create_ptr)); if (module_sp) { module_sp->SetPlatformFileSpec(path_to_try); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h index f8a62ceb958fe..82e69e36dca0c 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h @@ -73,7 +73,6 @@ class PlatformDarwin : public PlatformPOSIX { Status GetSharedModule(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) override; @@ -189,7 +188,7 @@ class PlatformDarwin : public PlatformPOSIX { Status FindBundleBinaryInExecSearchPaths( const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, + lldb::ModuleSP &module_sp, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr); // The OSType where lldb is running. diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp index 68ef81789b089..a72d94ea79c49 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp @@ -295,7 +295,6 @@ BringInRemoteFile(Platform *platform, lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Log *log = GetLog(LLDBLog::Platform); @@ -329,8 +328,7 @@ lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( ModuleSpec shared_cache_spec(module_spec.GetFileSpec(), image_info.uuid, image_info.data_sp); err = ModuleList::GetSharedModule(shared_cache_spec, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); if (module_sp) { LLDB_LOGF(log, "[%s] module %s was found in the in-memory shared cache", (IsHost() ? "host" : "remote"), @@ -348,8 +346,7 @@ lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( FileSystem::Instance().Resolve(device_support_spec); if (FileSystem::Instance().Exists(device_support_spec)) { ModuleSpec local_spec(device_support_spec, module_spec.GetUUID()); - err = ModuleList::GetSharedModule(local_spec, module_sp, - module_search_paths_ptr, old_modules, + err = ModuleList::GetSharedModule(local_spec, module_sp, old_modules, did_create_ptr); if (module_sp) { LLDB_LOGF(log, @@ -363,8 +360,7 @@ lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( } } - err = ModuleList::GetSharedModule(module_spec, module_sp, - module_search_paths_ptr, old_modules, + err = ModuleList::GetSharedModule(module_spec, module_sp, old_modules, did_create_ptr); if (module_sp) return err; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h index e1eba08fb5584..e0142ab7ca4cb 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h @@ -26,7 +26,6 @@ class PlatformDarwinDevice : public PlatformDarwin { protected: virtual Status GetSharedModuleWithLocalCache( const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr); struct SDKDirectoryInfo { diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp index 07c5a523161ed..04e87b9dea699 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp @@ -719,7 +719,6 @@ void PlatformDarwinKernel::UpdateKextandKernelsLocalScan() { Status PlatformDarwinKernel::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -734,14 +733,12 @@ Status PlatformDarwinKernel::GetSharedModule( // UUID search can get here with no name - and it may be a kernel. if (kext_bundle_id == "mach_kernel" || kext_bundle_id.empty()) { error = GetSharedModuleKernel(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); if (error.Success() && module_sp) { return error; } } else { - return GetSharedModuleKext(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, + return GetSharedModuleKext(module_spec, process, module_sp, old_modules, did_create_ptr); } } @@ -749,13 +746,11 @@ Status PlatformDarwinKernel::GetSharedModule( // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. return PlatformDarwin::GetSharedModule(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); } Status PlatformDarwinKernel::GetSharedModuleKext( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -782,8 +777,7 @@ Status PlatformDarwinKernel::GetSharedModuleKext( // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. error = PlatformDarwin::GetSharedModule(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); if (error.Success() && module_sp.get()) { return error; } @@ -793,7 +787,6 @@ Status PlatformDarwinKernel::GetSharedModuleKext( Status PlatformDarwinKernel::GetSharedModuleKernel( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { assert(module_sp.get() == nullptr); UpdateKextandKernelsLocalScan(); @@ -848,8 +841,7 @@ Status PlatformDarwinKernel::GetSharedModuleKernel( // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. return PlatformDarwin::GetSharedModule(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, - did_create_ptr); + old_modules, did_create_ptr); } std::vector @@ -888,8 +880,8 @@ Status PlatformDarwinKernel::ExamineKextForMatchingUUID( ModuleSP module_sp(new Module(exe_spec)); if (module_sp && module_sp->GetObjectFile() && module_sp->MatchesModuleSpec(exe_spec)) { - Status error = ModuleList::GetSharedModule(exe_spec, exe_module_sp, - NULL, NULL, NULL); + Status error = + ModuleList::GetSharedModule(exe_spec, exe_module_sp, NULL, NULL); if (exe_module_sp && exe_module_sp->GetObjectFile()) { return error; } diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h index 9db9c0065613d..b5cf701a76b4d 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h @@ -60,7 +60,6 @@ class PlatformDarwinKernel : public PlatformDarwin { Status GetSharedModule(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) override; @@ -142,14 +141,14 @@ class PlatformDarwinKernel : public PlatformDarwin { Status GetSharedModuleKext(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr); - Status GetSharedModuleKernel( - const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, - llvm::SmallVectorImpl *old_modules, bool *did_create_ptr); + Status + GetSharedModuleKernel(const ModuleSpec &module_spec, Process *process, + lldb::ModuleSP &module_sp, + llvm::SmallVectorImpl *old_modules, + bool *did_create_ptr); Status ExamineKextForMatchingUUID(const FileSpec &kext_bundle_path, const UUID &uuid, const ArchSpec &arch, diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp index dad6dcd133955..e6ea75a35f921 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp @@ -182,10 +182,8 @@ PlatformMacOSX::GetSupportedArchitectures(const ArchSpec &process_host_arch) { lldb_private::Status PlatformMacOSX::GetSharedModule( const lldb_private::ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Status error = GetSharedModuleWithLocalCache(module_spec, module_sp, - module_search_paths_ptr, old_modules, did_create_ptr); if (module_sp) { @@ -199,9 +197,9 @@ lldb_private::Status PlatformMacOSX::GetSharedModule( lldb::ModuleSP x86_64_module_sp; llvm::SmallVector old_x86_64_modules; bool did_create = false; - Status x86_64_error = GetSharedModuleWithLocalCache( - module_spec_x86_64, x86_64_module_sp, module_search_paths_ptr, - &old_x86_64_modules, &did_create); + Status x86_64_error = + GetSharedModuleWithLocalCache(module_spec_x86_64, x86_64_module_sp, + &old_x86_64_modules, &did_create); if (x86_64_module_sp && x86_64_module_sp->GetObjectFile()) { module_sp = x86_64_module_sp; if (old_modules) @@ -217,7 +215,6 @@ lldb_private::Status PlatformMacOSX::GetSharedModule( if (!module_sp) { error = FindBundleBinaryInExecSearchPaths(module_spec, process, module_sp, - module_search_paths_ptr, old_modules, did_create_ptr); } return error; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h index be844856ef923..9555b16551d5a 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h @@ -48,7 +48,6 @@ class PlatformMacOSX : public PlatformDarwinDevice { Status GetSharedModule(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp index 7b524d27b5221..53fab93f5e705 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp @@ -158,7 +158,6 @@ Status PlatformRemoteDarwinDevice::GetSymbolFile(const FileSpec &platform_file, Status PlatformRemoteDarwinDevice::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { // For iOS, the SDK files are all cached locally on the host system. So first // we ask for the file in the cached SDK, then we attempt to get a shared @@ -185,7 +184,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( if (GetFileInSDK(platform_file_path, connected_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); - error = ResolveExecutable(platform_module_spec, module_sp, nullptr); + error = ResolveExecutable(platform_module_spec, module_sp); if (module_sp) { m_last_module_sdk_idx = connected_sdk_idx; error.Clear(); @@ -202,7 +201,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( if (GetFileInSDK(platform_file_path, m_last_module_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); - error = ResolveExecutable(platform_module_spec, module_sp, nullptr); + error = ResolveExecutable(platform_module_spec, module_sp); if (module_sp) { error.Clear(); return error; @@ -224,7 +223,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( if (GetFileInSDK(platform_file_path, current_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); - error = ResolveExecutable(platform_module_spec, module_sp, nullptr); + error = ResolveExecutable(platform_module_spec, module_sp); if (module_sp) { m_last_module_sdk_idx = current_sdk_idx; error.Clear(); @@ -245,7 +244,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( platform_module_spec.GetFileSpec())) { // printf ("sdk[%u]: '%s'\n", sdk_idx, local_file.GetPath().c_str()); - error = ResolveExecutable(platform_module_spec, module_sp, nullptr); + error = ResolveExecutable(platform_module_spec, module_sp); if (module_sp) { // Remember the index of the last SDK that we found a file in in case // the wrong SDK was selected. @@ -261,8 +260,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( // This may not be an SDK-related module. Try whether we can bring in the // thing to our local cache. - error = GetSharedModuleWithLocalCache(module_spec, module_sp, - module_search_paths_ptr, old_modules, + error = GetSharedModuleWithLocalCache(module_spec, module_sp, old_modules, did_create_ptr); if (error.Success()) return error; @@ -271,15 +269,13 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( // directories. if (!module_sp) error = PlatformDarwin::FindBundleBinaryInExecSearchPaths( - module_spec, process, module_sp, module_search_paths_ptr, old_modules, - did_create_ptr); + module_spec, process, module_sp, old_modules, did_create_ptr); if (error.Success()) return error; const bool always_create = false; - error = ModuleList::GetSharedModule(module_spec, module_sp, - module_search_paths_ptr, old_modules, + error = ModuleList::GetSharedModule(module_spec, module_sp, old_modules, did_create_ptr, always_create); if (module_sp) diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h index 557f4876e91ab..4abd74ed07584 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h @@ -47,7 +47,6 @@ class PlatformRemoteDarwinDevice : public PlatformDarwinDevice { Status GetSharedModule(const ModuleSpec &module_spec, Process *process, lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index b7029fb3a95b3..f8e33eac614a4 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -84,8 +84,9 @@ bool ProcessElfCore::CanDebug(lldb::TargetSP target_sp, // For now we are just making sure the file exists for a given module if (!m_core_module_sp && FileSystem::Instance().Exists(m_core_file)) { ModuleSpec core_module_spec(m_core_file, target_sp->GetArchitecture()); + core_module_spec.SetTarget(target_sp); Status error(ModuleList::GetSharedModule(core_module_spec, m_core_module_sp, - nullptr, nullptr, nullptr)); + nullptr, nullptr)); if (m_core_module_sp) { ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile) diff --git a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp index a780b3f59aded..83d684e9ca528 100644 --- a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp +++ b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp @@ -95,8 +95,9 @@ bool ProcessMachCore::CanDebug(lldb::TargetSP target_sp, // header but we should still try to use it - // ModuleSpecList::FindMatchingModuleSpec enforces a strict arch mach. ModuleSpec core_module_spec(m_core_file); + core_module_spec.SetTarget(target_sp); Status error(ModuleList::GetSharedModule(core_module_spec, m_core_module_sp, - nullptr, nullptr, nullptr)); + nullptr, nullptr)); if (m_core_module_sp) { ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 881268bc4ca03..f00e94aee9847 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2018,7 +2018,7 @@ void SymbolFileDWARF::UpdateExternalModuleListIfNeeded() { } Status error = ModuleList::GetSharedModule(dwo_module_spec, module_sp, - nullptr, nullptr, nullptr); + nullptr, nullptr); if (!module_sp) { // ReportWarning also rate-limits based on the warning string, // but in a -gmodules build, each object file has a similar DAG diff --git a/lldb/source/Target/ModuleCache.cpp b/lldb/source/Target/ModuleCache.cpp index f737836e0d971..9978946105456 100644 --- a/lldb/source/Target/ModuleCache.cpp +++ b/lldb/source/Target/ModuleCache.cpp @@ -255,7 +255,7 @@ Status ModuleCache::Get(const FileSpec &root_dir_spec, const char *hostname, cached_module_spec.GetPlatformFileSpec() = module_spec.GetFileSpec(); error = ModuleList::GetSharedModule(cached_module_spec, cached_module_sp, - nullptr, nullptr, did_create_ptr, false); + nullptr, did_create_ptr, false); if (error.Fail()) return error; diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 8681adaf5ea76..5b0930cf26b77 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -163,11 +163,12 @@ Platform::LocateExecutableScriptingResources(Target *target, Module &module, Status Platform::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { if (IsHost()) - return ModuleList::GetSharedModule(module_spec, module_sp, - module_search_paths_ptr, old_modules, + // Note: module_search_paths_ptr functionality is now handled internally + // by getting target from module_spec and calling + // target->GetExecutableSearchPaths() + return ModuleList::GetSharedModule(module_spec, module_sp, old_modules, did_create_ptr, false); // Module resolver lambda. @@ -180,16 +181,14 @@ Status Platform::GetSharedModule( resolved_spec = spec; resolved_spec.GetFileSpec().PrependPathComponent(m_sdk_sysroot); // Try to get shared module with resolved spec. - error = ModuleList::GetSharedModule(resolved_spec, module_sp, - module_search_paths_ptr, old_modules, + error = ModuleList::GetSharedModule(resolved_spec, module_sp, old_modules, did_create_ptr, false); } // If we don't have sysroot or it didn't work then // try original module spec. if (!error.Success()) { resolved_spec = spec; - error = ModuleList::GetSharedModule(resolved_spec, module_sp, - module_search_paths_ptr, old_modules, + error = ModuleList::GetSharedModule(resolved_spec, module_sp, old_modules, did_create_ptr, false); } if (error.Success() && module_sp) @@ -731,10 +730,8 @@ bool Platform::SetOSVersion(llvm::VersionTuple version) { return false; } -Status -Platform::ResolveExecutable(const ModuleSpec &module_spec, - lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) { +Status Platform::ResolveExecutable(const ModuleSpec &module_spec, + lldb::ModuleSP &exe_module_sp) { // We may connect to a process and use the provided executable (Don't use // local $PATH). @@ -750,9 +747,8 @@ Platform::ResolveExecutable(const ModuleSpec &module_spec, if (resolved_module_spec.GetArchitecture().IsValid() || resolved_module_spec.GetUUID().IsValid()) { - Status error = - ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - module_search_paths_ptr, nullptr, nullptr); + Status error = ModuleList::GetSharedModule(resolved_module_spec, + exe_module_sp, nullptr, nullptr); if (exe_module_sp && exe_module_sp->GetObjectFile()) return error; @@ -767,9 +763,9 @@ Platform::ResolveExecutable(const ModuleSpec &module_spec, Status error; for (const ArchSpec &arch : GetSupportedArchitectures(process_host_arch)) { resolved_module_spec.GetArchitecture() = arch; - error = - ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - module_search_paths_ptr, nullptr, nullptr); + + error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, + nullptr, nullptr); if (error.Success()) { if (exe_module_sp && exe_module_sp->GetObjectFile()) break; @@ -1446,16 +1442,13 @@ const std::vector &Platform::GetTrapHandlerSymbolNames() { return m_trap_handlers; } -Status -Platform::GetCachedExecutable(ModuleSpec &module_spec, - lldb::ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr) { +Status Platform::GetCachedExecutable(ModuleSpec &module_spec, + lldb::ModuleSP &module_sp) { FileSpec platform_spec = module_spec.GetFileSpec(); Status error = GetRemoteSharedModule( module_spec, nullptr, module_sp, [&](const ModuleSpec &spec) { - return Platform::ResolveExecutable(spec, module_sp, - module_search_paths_ptr); + return Platform::ResolveExecutable(spec, module_sp); }, nullptr); if (error.Success()) { @@ -1497,7 +1490,7 @@ Status Platform::GetRemoteSharedModule(const ModuleSpec &module_spec, for (const ArchSpec &arch : GetSupportedArchitectures(process_host_arch)) { arch_module_spec.GetArchitecture() = arch; error = ModuleList::GetSharedModule(arch_module_spec, module_sp, nullptr, - nullptr, nullptr); + nullptr); // Did we find an executable using one of the if (error.Success() && module_sp) break; @@ -1673,11 +1666,12 @@ void Platform::CallLocateModuleCallbackIfSet(const ModuleSpec &module_spec, cached_module_spec.GetUUID().Clear(); // Clear UUID since it may contain md5 // content hash instead of real UUID. cached_module_spec.GetFileSpec() = module_file_spec; + cached_module_spec.GetSymbolFileSpec() = symbol_file_spec; cached_module_spec.GetPlatformFileSpec() = module_spec.GetFileSpec(); cached_module_spec.SetObjectOffset(0); error = ModuleList::GetSharedModule(cached_module_spec, module_sp, nullptr, - nullptr, did_create_ptr, false); + did_create_ptr, false, false); if (error.Success() && module_sp) { // Succeeded to load the module file. LLDB_LOGF(log, "%s: locate module callback succeeded: module=%s symbol=%s", diff --git a/lldb/source/Target/RemoteAwarePlatform.cpp b/lldb/source/Target/RemoteAwarePlatform.cpp index cac738ea67b4c..89b946ba75162 100644 --- a/lldb/source/Target/RemoteAwarePlatform.cpp +++ b/lldb/source/Target/RemoteAwarePlatform.cpp @@ -29,9 +29,8 @@ bool RemoteAwarePlatform::GetModuleSpec(const FileSpec &module_file_spec, return false; } -Status RemoteAwarePlatform::ResolveExecutable( - const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) { +Status RemoteAwarePlatform::ResolveExecutable(const ModuleSpec &module_spec, + lldb::ModuleSP &exe_module_sp) { ModuleSpec resolved_module_spec(module_spec); // The host platform can resolve the path more aggressively. @@ -47,12 +46,10 @@ Status RemoteAwarePlatform::ResolveExecutable( if (!FileSystem::Instance().Exists(resolved_file_spec)) FileSystem::Instance().ResolveExecutableLocation(resolved_file_spec); } else if (m_remote_platform_sp) { - return GetCachedExecutable(resolved_module_spec, exe_module_sp, - module_search_paths_ptr); + return GetCachedExecutable(resolved_module_spec, exe_module_sp); } - return Platform::ResolveExecutable(resolved_module_spec, exe_module_sp, - module_search_paths_ptr); + return Platform::ResolveExecutable(resolved_module_spec, exe_module_sp); } Status RemoteAwarePlatform::RunShellCommand( diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index e53fc7a1e1bda..ae6c4f7191103 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -1779,9 +1779,9 @@ bool Target::SetArchitecture(const ArchSpec &arch_spec, bool set_platform, arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); ModuleSpec module_spec(executable_sp->GetFileSpec(), other); - FileSpecList search_paths = GetExecutableSearchPaths(); + module_spec.SetTarget(shared_from_this()); Status error = ModuleList::GetSharedModule(module_spec, executable_sp, - &search_paths, nullptr, nullptr); + nullptr, nullptr); if (!error.Fail() && executable_sp) { SetExecutableModule(executable_sp, eLoadDependentsYes); @@ -2350,6 +2350,7 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, // Apply any remappings specified in target.object-map: ModuleSpec module_spec(orig_module_spec); + module_spec.SetTarget(shared_from_this()); PathMappingList &obj_mapping = GetObjectPathMap(); if (std::optional remapped_obj_file = obj_mapping.RemapPath(orig_module_spec.GetFileSpec().GetPath(), @@ -2408,9 +2409,9 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, transformed_spec.GetFileSpec().SetDirectory(transformed_dir); transformed_spec.GetFileSpec().SetFilename( module_spec.GetFileSpec().GetFilename()); + transformed_spec.SetTarget(shared_from_this()); error = ModuleList::GetSharedModule(transformed_spec, module_sp, - &search_paths, &old_modules, - &did_create_module); + &old_modules, &did_create_module); } } } @@ -2426,9 +2427,8 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, // cache. if (module_spec.GetUUID().IsValid()) { // We have a UUID, it is OK to check the global module list... - error = - ModuleList::GetSharedModule(module_spec, module_sp, &search_paths, - &old_modules, &did_create_module); + error = ModuleList::GetSharedModule(module_spec, module_sp, + &old_modules, &did_create_module); } if (!module_sp) { @@ -2436,8 +2436,8 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, // module in the shared module cache. if (m_platform_sp) { error = m_platform_sp->GetSharedModule( - module_spec, m_process_sp.get(), module_sp, &search_paths, - &old_modules, &did_create_module); + module_spec, m_process_sp.get(), module_sp, &old_modules, + &did_create_module); } else { error = Status::FromErrorString("no platform is currently set"); } diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index 188c2508a71ed..2e03bc1e38ea0 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -304,13 +304,9 @@ Status TargetList::CreateTargetInternal(Debugger &debugger, ModuleSP exe_module_sp; if (platform_sp) { - FileSpecList executable_search_paths( - Target::GetDefaultExecutableSearchPaths()); ModuleSpec module_spec(file, arch); - error = platform_sp->ResolveExecutable(module_spec, exe_module_sp, - executable_search_paths.GetSize() - ? &executable_search_paths - : nullptr); + module_spec.SetTarget(target_sp); + error = platform_sp->ResolveExecutable(module_spec, exe_module_sp); } if (error.Success() && exe_module_sp) { diff --git a/lldb/unittests/Core/CMakeLists.txt b/lldb/unittests/Core/CMakeLists.txt index 6e609a63ad9b6..f0c9a9a9d5056 100644 --- a/lldb/unittests/Core/CMakeLists.txt +++ b/lldb/unittests/Core/CMakeLists.txt @@ -7,6 +7,7 @@ add_lldb_unittest(LLDBCoreTests DumpRegisterInfoTest.cpp FormatEntityTest.cpp MangledTest.cpp + ModuleListTest.cpp ModuleSpecTest.cpp PluginManagerTest.cpp ProgressReportTest.cpp diff --git a/lldb/unittests/Core/ModuleListTest.cpp b/lldb/unittests/Core/ModuleListTest.cpp new file mode 100644 index 0000000000000..3c70b0a4b21b8 --- /dev/null +++ b/lldb/unittests/Core/ModuleListTest.cpp @@ -0,0 +1,178 @@ +//===-- ModuleListTest.cpp ------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Core/ModuleList.h" +#include "TestingSupport/SubsystemRAII.h" +#include "TestingSupport/TestUtilities.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Host/FileSystem.h" +#include "lldb/Utility/ArchSpec.h" +#include "lldb/Utility/UUID.h" + +#include "Plugins/ObjectFile/ELF/ObjectFileELF.h" + +#include "gtest/gtest.h" + +using namespace lldb; +using namespace lldb_private; + +// Test that when we already have a module in the shared_module_list with a +// specific UUID, the next call to GetSharedModule with a module_spec with the +// same UUID should return the existing module instead of creating a new one. +TEST(ModuleListTest, GetSharedModuleReusesExistingModuleWithSameUUID) { + SubsystemRAII subsystems; + + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + + // First, let's verify that calling GetSharedModule twice with the same + // module_spec returns the same module pointer + + ModuleSP first_module; + bool first_did_create = false; + Status error_first = + ModuleList::GetSharedModule(ExpectedFile->moduleSpec(), first_module, + nullptr, &first_did_create, false); + + // Second call with the same spec + ModuleSP second_module; + bool second_did_create = false; + Status error_second = + ModuleList::GetSharedModule(ExpectedFile->moduleSpec(), second_module, + nullptr, &second_did_create, false); + + if (error_first.Success() && error_second.Success()) { + // If both succeeded, verify they're the same module + EXPECT_EQ(first_module.get(), second_module.get()) + << "GetSharedModule should return the same module for the same spec"; + EXPECT_TRUE(first_did_create) << "First call should create the module"; + EXPECT_FALSE(second_did_create) + << "Second call should reuse the existing module"; + } +} + +// Test that UUID-based lookup finds existing modules +TEST(ModuleListTest, FindSharedModuleByUUID) { + SubsystemRAII subsystems; + + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + + // Create and add a module to the shared module list using the moduleSpec() + ModuleSP created_module; + bool did_create = false; + Status error = ModuleList::GetSharedModule( + ExpectedFile->moduleSpec(), created_module, nullptr, &did_create, false); + + if (error.Success() && created_module) { + // Get the UUID of the created module + UUID module_uuid = created_module->GetUUID(); + + if (module_uuid.IsValid()) { + // Now try to find the module by UUID + ModuleSP found_module = ModuleList::FindSharedModule(module_uuid); + + ASSERT_NE(found_module.get(), nullptr) + << "FindSharedModule should find the module by UUID"; + EXPECT_EQ(found_module.get(), created_module.get()) + << "FindSharedModule should return the same module instance"; + EXPECT_EQ(found_module->GetUUID(), module_uuid) + << "Found module should have the same UUID"; + } + } +} + +// Test that GetSharedModule with UUID finds existing module even with different +// path +TEST(ModuleListTest, GetSharedModuleByUUIDIgnoresPath) { + SubsystemRAII subsystems; + + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + + // Create and add a module to the shared module list + ModuleSP first_module; + bool first_did_create = false; + Status first_error = + ModuleList::GetSharedModule(ExpectedFile->moduleSpec(), first_module, + nullptr, &first_did_create, false); + + if (first_error.Success() && first_module) { + UUID module_uuid = first_module->GetUUID(); + + if (module_uuid.IsValid()) { + // Now try to get a module with the same UUID but different path + ModuleSpec second_spec; + second_spec.GetFileSpec() = FileSpec("/different/path/to/module.so"); + second_spec.GetArchitecture() = ArchSpec("x86_64-pc-linux"); + second_spec.GetUUID() = module_uuid; + + ModuleSP second_module; + bool second_did_create = false; + Status second_error = ModuleList::GetSharedModule( + second_spec, second_module, nullptr, &second_did_create, false); + + if (second_error.Success() && second_module) { + // If we got a module back, check if it's the same one + bool is_same_module = (second_module.get() == first_module.get()); + + // Document the behavior: ideally UUID should take precedence + // and return the existing module + EXPECT_TRUE(is_same_module) + << "GetSharedModule with matching UUID should return existing " + "module, " + << "even with different path (per PR #160199)"; + + if (is_same_module) { + EXPECT_FALSE(second_did_create) + << "Should not create a new module when UUID matches"; + } + } + } + } +} diff --git a/lldb/unittests/Target/LocateModuleCallbackTest.cpp b/lldb/unittests/Target/LocateModuleCallbackTest.cpp index 6ffa41b16b4ff..d727cea9f6eae 100644 --- a/lldb/unittests/Target/LocateModuleCallbackTest.cpp +++ b/lldb/unittests/Target/LocateModuleCallbackTest.cpp @@ -362,7 +362,7 @@ TEST_F(LocateModuleCallbackTest, GetOrCreateModuleCallbackFailureNoCache) { }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); ASSERT_FALSE(m_module_sp); } @@ -383,7 +383,7 @@ TEST_F(LocateModuleCallbackTest, GetOrCreateModuleCallbackFailureCached) { }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_FALSE(m_module_sp->GetSymbolFileFileSpec()); @@ -409,7 +409,7 @@ TEST_F(LocateModuleCallbackTest, GetOrCreateModuleCallbackNoFiles) { }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_FALSE(m_module_sp->GetSymbolFileFileSpec()); @@ -435,7 +435,7 @@ TEST_F(LocateModuleCallbackTest, GetOrCreateModuleCallbackNonExistentModule) { }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_FALSE(m_module_sp->GetSymbolFileFileSpec()); @@ -464,7 +464,7 @@ TEST_F(LocateModuleCallbackTest, GetOrCreateModuleCallbackNonExistentSymbol) { }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_TRUE(m_module_sp->GetSymbolFileFileSpec().GetPath().empty()); @@ -622,7 +622,7 @@ TEST_F(LocateModuleCallbackTest, }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_EQ(m_module_sp->GetSymbolFileFileSpec(), @@ -650,7 +650,7 @@ TEST_F(LocateModuleCallbackTest, }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_EQ(m_module_sp->GetSymbolFileFileSpec(), @@ -682,7 +682,7 @@ TEST_F(LocateModuleCallbackTest, }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); CheckModule(m_module_sp); ASSERT_EQ(m_module_sp->GetFileSpec(), uuid_view); ASSERT_EQ(m_module_sp->GetSymbolFileFileSpec(), @@ -709,7 +709,7 @@ TEST_F(LocateModuleCallbackTest, }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); ASSERT_FALSE(m_module_sp); } @@ -731,7 +731,7 @@ TEST_F(LocateModuleCallbackTest, }); m_module_sp = m_target_sp->GetOrCreateModule(m_module_spec, /*notify=*/false); - ASSERT_EQ(callback_call_count, 2); + ASSERT_EQ(callback_call_count, 3); ASSERT_FALSE(m_module_sp); } diff --git a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp index 3278674ed0a05..cfcec693b8742 100644 --- a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp +++ b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp @@ -32,15 +32,12 @@ class RemoteAwarePlatformTester : public RemoteAwarePlatform { ProcessSP(ProcessAttachInfo &, Debugger &, Target *, Status &)); MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void()); - MOCK_METHOD2(ResolveExecutable, - std::pair(const ModuleSpec &, - const FileSpecList *)); - Status - ResolveExecutable(const ModuleSpec &module_spec, - lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) /*override*/ + MOCK_METHOD1(ResolveExecutable, + std::pair(const ModuleSpec &)); + Status ResolveExecutable(const ModuleSpec &module_spec, + lldb::ModuleSP &exe_module_sp) /*override*/ { // NOLINT(modernize-use-override) - auto pair = ResolveExecutable(module_spec, module_search_paths_ptr); + auto pair = ResolveExecutable(module_spec); exe_module_sp = pair.second; return pair.first ? Status() : Status::FromErrorString("error"); } @@ -80,14 +77,14 @@ TEST_F(RemoteAwarePlatformTest, TestResolveExecutabelOnClientByPlatform) { static const ArchSpec process_host_arch; EXPECT_CALL(platform, GetSupportedArchitectures(process_host_arch)) .WillRepeatedly(Return(std::vector())); - EXPECT_CALL(platform, ResolveExecutable(_, _)) + EXPECT_CALL(platform, ResolveExecutable(_)) .WillRepeatedly(Return(std::make_pair(true, expected_executable))); platform.SetRemotePlatform(std::make_shared(false)); ModuleSP resolved_sp; lldb_private::Status status = - platform.ResolveExecutable(executable_spec, resolved_sp, nullptr); + platform.ResolveExecutable(executable_spec, resolved_sp); ASSERT_TRUE(status.Success()); EXPECT_EQ(expected_executable.get(), resolved_sp.get()); From e0822202a8ce5134289a2487876f453521997def Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 6 Nov 2025 12:50:00 -0800 Subject: [PATCH 53/71] [GitHub][CI] Factor out duplicate container building code into composite actions (#166663) --- .../workflows/build-ci-container-tooling.yml | 97 +++++----------- .github/workflows/build-ci-container.yml | 107 +++++------------- .github/workflows/build-container/action.yml | 95 ++++++++++++++++ .github/workflows/push-container/action.yml | 44 +++++++ 4 files changed, 198 insertions(+), 145 deletions(-) create mode 100644 .github/workflows/build-container/action.yml create mode 100644 .github/workflows/push-container/action.yml diff --git a/.github/workflows/build-ci-container-tooling.yml b/.github/workflows/build-ci-container-tooling.yml index d3e33e2ccf931..46dc38fe600a3 100644 --- a/.github/workflows/build-ci-container-tooling.yml +++ b/.github/workflows/build-ci-container-tooling.yml @@ -12,17 +12,30 @@ on: - '.github/workflows/containers/github-action-ci-tooling/**' - llvm/utils/git/requirements_formatting.txt - llvm/utils/git/requirements_linting.txt + - '.github/workflows/build-container/**' + - '.github/workflows/push-container/**' pull_request: paths: - .github/workflows/build-ci-container-tooling.yml - '.github/workflows/containers/github-action-ci-tooling/**' - llvm/utils/git/requirements_formatting.txt - llvm/utils/git/requirements_linting.txt + - '.github/workflows/build-container/**' + - '.github/workflows/push-container/**' jobs: build-ci-container-tooling: + name: Build Container ${{ matrix.container-name }} if: github.repository_owner == 'llvm' runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + include: + - container-name: code-format + test-command: 'cd $HOME && clang-format --version | grep version && git-clang-format -h | grep usage && black --version | grep black' + - container-name: code-lint + test-command: 'cd $HOME && clang-tidy --version | grep version && clang-tidy-diff.py -h | grep usage' steps: - name: Checkout LLVM uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -32,48 +45,15 @@ jobs: llvm/utils/git/requirements_formatting.txt llvm/utils/git/requirements_linting.txt clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py + .github/workflows/build-container - - name: Write Variables - id: vars - run: | - tag=$(git rev-parse --short=12 HEAD) - container_name="ghcr.io/$GITHUB_REPOSITORY_OWNER/amd64/ci-ubuntu-24.04" - echo "container-name-format=$container_name-code-format" >> $GITHUB_OUTPUT - echo "container-name-lint=$container_name-code-lint" >> $GITHUB_OUTPUT - echo "container-name-format-tag=$container_name-format:$tag" >> $GITHUB_OUTPUT - echo "container-name-lint-tag=$container_name-lint:$tag" >> $GITHUB_OUTPUT - echo "container-format-filename=$(echo $container_name-format:$tag | sed -e 's/\//-/g' -e 's/:/-/g').tar" >> $GITHUB_OUTPUT - echo "container-lint-filename=$(echo $container_name-lint:$tag | sed -e 's/\//-/g' -e 's/:/-/g').tar" >> $GITHUB_OUTPUT - - - name: Build container - run: | - podman build --target ci-container-code-format \ - -f .github/workflows/containers/github-action-ci-tooling/Dockerfile \ - -t ${{ steps.vars.outputs.container-name-format-tag }} . - podman build --target ci-container-code-lint \ - -f .github/workflows/containers/github-action-ci-tooling/Dockerfile \ - -t ${{ steps.vars.outputs.container-name-lint-tag }} . - - # Save the container so we have it in case the push fails. This also - # allows us to separate the push step into a different job so we can - # maintain minimal permissions while building the container. - - name: Save container image - run: | - podman save ${{ steps.vars.outputs.container-name-format-tag }} > ${{ steps.vars.outputs.container-format-filename }} - podman save ${{ steps.vars.outputs.container-name-lint-tag }} > ${{ steps.vars.outputs.container-lint-filename }} - - - name: Upload container image - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + - name: Build Container + uses: ./.github/workflows/build-container with: - name: container-amd64 - path: "*.tar" - retention-days: 14 - - - name: Test Container - run: | - # Use --pull=never to ensure we are testing the just built image. - podman run --pull=never --rm -it ${{ steps.vars.outputs.container-name-format-tag }} /usr/bin/bash -x -c 'cd $HOME && clang-format --version | grep version && git-clang-format -h | grep usage && black --version | grep black' - podman run --pull=never --rm -it ${{ steps.vars.outputs.container-name-lint-tag }} /usr/bin/bash -x -c 'cd $HOME && clang-tidy --version | grep version && clang-tidy-diff.py -h | grep usage' + container-name: ci-ubuntu-24.04-${{ matrix.container-name }} + dockerfile: .github/workflows/containers/github-action-ci-tooling/Dockerfile + target: ci-container-${{ matrix.container-name }} + test-command: ${{ matrix.test-command }} push-ci-container: if: github.event_name == 'push' @@ -82,34 +62,13 @@ jobs: permissions: packages: write runs-on: ubuntu-24.04 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - name: Download container - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - - - name: Push Container - run: | - function push_container { - image_name=$1 - latest_name=$(echo $image_name | sed 's/:[a-f0-9]\+$/:latest/g') - podman tag $image_name $latest_name - echo "Pushing $image_name ..." - podman push $image_name - echo "Pushing $latest_name ..." - podman push $latest_name - } - - podman login -u ${{ github.actor }} -p $GITHUB_TOKEN ghcr.io - for f in $(find . -iname '*.tar'); do - image_name=$(podman load -q -i $f | sed 's/Loaded image: //g') - push_container $image_name + - name: Checkout LLVM + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + sparse-checkout: | + .github/workflows/push-container - if echo $image_name | grep '/amd64/'; then - # For amd64, create an alias with the arch component removed. - # This matches the convention used on dockerhub. - default_image_name=$(echo $(dirname $(dirname $image_name))/$(basename $image_name)) - podman tag $image_name $default_image_name - push_container $default_image_name - fi - done + - uses: ./.github/workflows/push-container + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-ci-container.yml b/.github/workflows/build-ci-container.yml index 49c10d3318330..33b4dda2b2980 100644 --- a/.github/workflows/build-ci-container.yml +++ b/.github/workflows/build-ci-container.yml @@ -10,72 +10,46 @@ on: paths: - .github/workflows/build-ci-container.yml - '.github/workflows/containers/github-action-ci/**' + - '.github/workflows/build-container/**' + - '.github/workflows/push-container/**' pull_request: paths: - .github/workflows/build-ci-container.yml - '.github/workflows/containers/github-action-ci/**' + - '.github/workflows/build-container/**' + - '.github/workflows/push-container/**' jobs: build-ci-container: + name: Build Container ${{ matrix.container-name }} ${{ (contains(matrix.runs-on, 'arm') && 'ARM64') || 'X64' }} if: github.repository_owner == 'llvm' runs-on: ${{ matrix.runs-on }} strategy: matrix: - include: - # The arch names should match the names used on dockerhub. - # See https://github.com/docker-library/official-images#architectures-other-than-amd64 - - arch: amd64 - runs-on: depot-ubuntu-24.04-16 - - arch: arm64v8 - runs-on: depot-ubuntu-24.04-arm-16 + runs-on: + - depot-ubuntu-24.04-16 + - depot-ubuntu-24.04-arm-16 + container-name: + - '' + - agent + test-command: + - cd $HOME && printf '#include \nint main(int argc, char **argv) { std::cout << "Hello\\n"; }' | clang++ -x c++ - && ./a.out | grep Hello steps: - name: Checkout LLVM uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: - sparse-checkout: .github/workflows/containers/github-action-ci/ - # podman is not installed by default on the ARM64 images. - - name: Install Podman - if: runner.arch == 'ARM64' - run: | - sudo apt-get install podman - - name: Write Variables - id: vars - run: | - tag=$(git rev-parse --short=12 HEAD) - container_name="ghcr.io/$GITHUB_REPOSITORY_OWNER/${{ matrix.arch }}/ci-ubuntu-24.04" - echo "container-name=$container_name" >> $GITHUB_OUTPUT - echo "container-name-agent=$container_name-agent" >> $GITHUB_OUTPUT - echo "container-name-tag=$container_name:$tag" >> $GITHUB_OUTPUT - echo "container-name-agent-tag=$container_name-agent:$tag" >> $GITHUB_OUTPUT - echo "container-filename=$(echo $container_name:$tag | sed -e 's/\//-/g' -e 's/:/-/g').tar" >> $GITHUB_OUTPUT - echo "container-agent-filename=$(echo $container_name-agent:$tag | sed -e 's/\//-/g' -e 's/:/-/g').tar" >> $GITHUB_OUTPUT - - name: Build container - working-directory: ./.github/workflows/containers/github-action-ci/ - run: | - podman build --target ci-container -t ${{ steps.vars.outputs.container-name-tag }} . - podman build --target ci-container-agent -t ${{ steps.vars.outputs.container-name-agent-tag }} . + sparse-checkout: | + .github/workflows/containers/github-action-ci/ + .github/workflows/build-container - # Save the container so we have it in case the push fails. This also - # allows us to separate the push step into a different job so we can - # maintain minimal permissions while building the container. - - name: Save container image - run: | - podman save ${{ steps.vars.outputs.container-name-tag }} > ${{ steps.vars.outputs.container-filename }} - podman save ${{ steps.vars.outputs.container-name-agent-tag }} > ${{ steps.vars.outputs.container-agent-filename }} - - - name: Upload container image - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + - name: Build Container + uses: ./.github/workflows/build-container with: - name: container-${{ matrix.arch }} - path: "*.tar" - retention-days: 14 - - - name: Test Container - run: | - for image in ${{ steps.vars.outputs.container-name-tag }}; do - # Use --pull=never to ensure we are testing the just built image. - podman run --pull=never --rm -it $image /usr/bin/bash -x -c 'cd $HOME && printf '\''#include \nint main(int argc, char **argv) { std::cout << "Hello\\n"; }'\'' | clang++ -x c++ - && ./a.out | grep Hello' - done + container-name: ci-ubuntu-24.04${{ matrix.container-name && format('-{0}', matrix.container-name)}} + context: .github/workflows/containers/github-action-ci/ + dockerfile: .github/workflows/containers/github-action-ci/Dockerfile + target: ci-container${{ matrix.container-name && format('-{0}', matrix.container-name) }} + test-command: ${{ matrix.test-command }} push-ci-container: if: github.event_name == 'push' @@ -87,31 +61,12 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - name: Download container - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 - - - name: Push Container - run: | - function push_container { - image_name=$1 - latest_name=$(echo $image_name | sed 's/:[a-f0-9]\+$/:latest/g') - podman tag $image_name $latest_name - echo "Pushing $image_name ..." - podman push $image_name - echo "Pushing $latest_name ..." - podman push $latest_name - } - - podman login -u ${{ github.actor }} -p $GITHUB_TOKEN ghcr.io - for f in $(find . -iname '*.tar'); do - image_name=$(podman load -q -i $f | sed 's/Loaded image: //g') - push_container $image_name + - name: Checkout LLVM + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + sparse-checkout: | + .github/workflows/push-container - if echo $image_name | grep '/amd64/'; then - # For amd64, create an alias with the arch component removed. - # This matches the convention used on dockerhub. - default_image_name=$(echo $(dirname $(dirname $image_name))/$(basename $image_name)) - podman tag $image_name $default_image_name - push_container $default_image_name - fi - done + - uses: ./.github/workflows/push-container + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-container/action.yml b/.github/workflows/build-container/action.yml new file mode 100644 index 0000000000000..595c3f8dd2070 --- /dev/null +++ b/.github/workflows/build-container/action.yml @@ -0,0 +1,95 @@ +name: Build Container +description: >- + Build and test a container using the standard llvm naming scheme for containers. + +inputs: + tag: + description: >- + The tag to use for this container. + required: false + container-name: + description: >- + The name for the container. + required: true + dockerfile: + description: >- + Path to docker file. + required: false + target: + description: >- + The container target to build 'passed to podman via ---target option' + required: false + context: + description: >- + Path to context for the container build. + required: false + test-command: + description: >- + Test command to run to ensure the container is working correctly. + required: false + +runs: + using: "composite" + steps: + # podman is not installed by default on the ARM64 images. + - name: Install Podman + if: runner.arch == 'ARM64' + shell: bash + run: | + sudo apt-get install podman + + - name: Build Container + shell: bash + env: + INPUT_TAG: ${{inputs.tag }} + INPUT_CONTAINER_NAME: ${{ inputs.container-name }} + INPUT_TARGET: ${{ inputs.target }} + INPUT_DOCKERFILE: ${{ inputs.dockerfile }} + INPUT_CONTEXT: ${{ inputs.context }} + id: build + run: | + env + tag="${INPUT_TAG:-$(git rev-parse --short=12 HEAD)}" + + case "$RUNNER_ARCH" in + ARM64) + container_arch="arm64v8" + ;; + *) + container_arch="amd64" + ;; + esac + + container_name="ghcr.io/$GITHUB_REPOSITORY_OWNER/$container_arch/$INPUT_CONTAINER_NAME:$tag" + container_filename="$(echo $container_name | sed -e 's/\//-/g' -e 's/:/-/g').tar" + if [ -n "$INPUT_TARGET" ]; then + podman_options="$podman_options --target $INPUT_TARGET" + fi + if [ -n "$INPUT_DOCKERFILE" ]; then + podman_options="$podman_options -f $INPUT_DOCKERFILE" + fi + podman_options="$podman_options ${INPUT_CONTEXT:-.}" + echo "Podman Options: $podman_options" + + podman build -t $container_name $podman_options + + podman save $container_name > $container_filename + + echo "container-full-name=$container_name" >> $GITHUB_OUTPUT + + - name: Create container artifact + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: ${{ inputs.container-name }}-${{ runner.arch }} + path: "*.tar" + retention-days: 14 + + - name: Test container + shell: bash + if: inputs.test-command + env: + INPUT_TEST_COMMAND: ${{ inputs.test-command }} + CONTAINER_FULL_NAME: ${{ steps.build.outputs.container-full-name }} + run: | + podman run --pull=never --rm -it $CONTAINER_FULL_NAME /usr/bin/bash -x -c "$INPUT_TEST_COMMAND" + diff --git a/.github/workflows/push-container/action.yml b/.github/workflows/push-container/action.yml new file mode 100644 index 0000000000000..51f4b2aa0002e --- /dev/null +++ b/.github/workflows/push-container/action.yml @@ -0,0 +1,44 @@ +name: Push Container +description: >- + Download all container artifacts for this job and push them to the GitHub registry. + +inputs: + token: + description: >- + Token to use to authenticate with the container registry. + required: true + +runs: + using: "composite" + steps: + - name: Download container + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 + + - name: Push Container + env: + GITHUB_TOKEN: ${{ inputs.token }} + shell: bash + run: | + function push_container { + image_name=$1 + latest_name=$(echo $image_name | sed 's/:[a-f0-9]\+$/:latest/g') + podman tag $image_name $latest_name + echo "Pushing $image_name ..." + podman push $image_name + echo "Pushing $latest_name ..." + podman push $latest_name + } + + podman login -u ${{ github.actor }} -p $GITHUB_TOKEN ghcr.io + for f in $(find . -iname '*.tar'); do + image_name=$(podman load -q -i $f | sed 's/Loaded image: //g') + push_container $image_name + + if echo $image_name | grep '/amd64/'; then + # For amd64, create an alias with the arch component removed. + # This matches the convention used on dockerhub. + default_image_name=$(echo $(dirname $(dirname $image_name))/$(basename $image_name)) + podman tag $image_name $default_image_name + push_container $default_image_name + fi + done From aa1b1dc3914df84581e92fa75e6b8ff7007e0295 Mon Sep 17 00:00:00 2001 From: Augusto Noronha Date: Thu, 6 Nov 2025 12:52:04 -0800 Subject: [PATCH 54/71] [lldb] Add function to tell if a section is a GOT section (#165936) A global offset table is a section that holds the address of functions that are dynamically linked. The Swift plugin needs to know if sections are a global offset table or not. --- lldb/include/lldb/Core/Section.h | 3 +++ lldb/include/lldb/Symbol/ObjectFile.h | 6 ++++++ lldb/source/Core/Section.cpp | 4 ++++ .../Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 14 ++++++++++++++ .../Plugins/ObjectFile/Mach-O/ObjectFileMachO.h | 2 ++ 5 files changed, 29 insertions(+) diff --git a/lldb/include/lldb/Core/Section.h b/lldb/include/lldb/Core/Section.h index f0f5a0b3499c0..d0f10cc342780 100644 --- a/lldb/include/lldb/Core/Section.h +++ b/lldb/include/lldb/Core/Section.h @@ -273,6 +273,9 @@ class Section : public std::enable_shared_from_this
, /// return true. bool ContainsOnlyDebugInfo() const; + /// Returns true if this is a global offset table section. + bool IsGOTSection() const; + protected: ObjectFile *m_obj_file; // The object file that data for this section should // be read from diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h index 1b9ae1fb31a69..1de08a8576507 100644 --- a/lldb/include/lldb/Symbol/ObjectFile.h +++ b/lldb/include/lldb/Symbol/ObjectFile.h @@ -758,6 +758,12 @@ class ObjectFile : public std::enable_shared_from_this, return false; } + /// Returns true if the section is a global offset table section. + virtual bool IsGOTSection(const lldb_private::Section §ion) const { + assert(section.GetObjectFile() == this && "Wrong object file!"); + return false; + } + /// Get a hash that can be used for caching object file releated information. /// /// Data for object files can be cached between runs of debug sessions and diff --git a/lldb/source/Core/Section.cpp b/lldb/source/Core/Section.cpp index 02d9d86fe5374..d3f753e53b7fa 100644 --- a/lldb/source/Core/Section.cpp +++ b/lldb/source/Core/Section.cpp @@ -471,6 +471,10 @@ bool Section::ContainsOnlyDebugInfo() const { return false; } +bool Section::IsGOTSection() const { + return GetObjectFile()->IsGOTSection(*this); +} + #pragma mark SectionList SectionList &SectionList::operator=(const SectionList &rhs) { diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index c8e520d687f67..2218c23db5a95 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -5936,6 +5936,20 @@ Section *ObjectFileMachO::GetMachHeaderSection() { return nullptr; } +bool ObjectFileMachO::IsGOTSection(const lldb_private::Section §ion) const { + assert(section.GetObjectFile() == this && "Wrong object file!"); + SectionSP segment = section.GetParent(); + if (!segment) + return false; + + const bool is_data_const_got = + segment->GetName() == "__DATA_CONST" && section.GetName() == "__got"; + const bool is_auth_const_ptr = + segment->GetName() == "__AUTH_CONST" && + (section.GetName() == "__auth_got" || section.GetName() == "__auth_ptr"); + return is_data_const_got || is_auth_const_ptr; +} + bool ObjectFileMachO::SectionIsLoadable(const Section *section) { if (!section) return false; diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h index 25643aacb3d2d..5456f0315c942 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h @@ -162,6 +162,8 @@ class ObjectFileMachO : public lldb_private::ObjectFile { lldb_private::Section *GetMachHeaderSection(); + bool IsGOTSection(const lldb_private::Section §ion) const override; + // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } From 6adf99338832966dcf3477e112b158cd588ac584 Mon Sep 17 00:00:00 2001 From: Marcell Leleszi <59964679+mleleszi@users.noreply.github.com> Date: Thu, 6 Nov 2025 21:55:16 +0100 Subject: [PATCH 55/71] [libc] Disable overflow test in strfromtest on riscv32 (#166719) Looks like https://github.com/llvm/llvm-project/pull/166517 is breaking libc-riscv32-qemu-yocto-fullbuild-dbg build due to failing overflow test for strfrom. https://lab.llvm.org/buildbot/#/changes/58668 ``` int result = func(buff, sizeof(buff), "%.2147483647f", 1.0f); EXPECT_LT(result, 0); ASSERT_ERRNO_FAILURE(); ``` ``` [ RUN ] LlvmLibcStrfromdTest.CharsWrittenOverflow /home/libcrv32buildbot/bbroot/libc-riscv32-qemu-yocto-fullbuild-dbg/llvm-project/libc/test/src/stdlib/StrfromTest.h:493: FAILURE Expected: result Which is: 0 To be less than: 0 Which is: 0 /home/libcrv32buildbot/bbroot/libc-riscv32-qemu-yocto-fullbuild-dbg/llvm-project/libc/test/src/stdlib/StrfromTest.h:494: FAILURE Expected: 0 Which is: 0 To be not equal to: static_cast(libc_errno) Which is: 0 [ FAILED ] LlvmLibcStrfromdTest.CharsWrittenOverflow Ran 8 tests. PASS: 7 FAIL: 1 ``` At first glance it seem like there is some kind of overflow in internal::strfromfloat_convert on 32bit archs because the other overflow test case is passing for snprintf. Interestingly, it passes on all other buildbots, including libc-arm32-qemu-debian-dbg. This issue likely wasn't introduced by https://github.com/llvm/llvm-project/pull/166517 and was probably already present, so I'm not reverting the change just disabling the test case on riscv32 until I can debug properly. --- libc/test/src/stdlib/CMakeLists.txt | 1 + libc/test/src/stdlib/StrfromTest.h | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/libc/test/src/stdlib/CMakeLists.txt b/libc/test/src/stdlib/CMakeLists.txt index 0eb373c3fa061..42e8faa3fd69f 100644 --- a/libc/test/src/stdlib/CMakeLists.txt +++ b/libc/test/src/stdlib/CMakeLists.txt @@ -187,6 +187,7 @@ add_header_library( DEPENDS libc.src.__support.CPP.type_traits libc.src.__support.FPUtil.fp_bits + libc.src.__support.macros.properties.architectures ) add_libc_test( diff --git a/libc/test/src/stdlib/StrfromTest.h b/libc/test/src/stdlib/StrfromTest.h index fd2e0f120e90e..3dacfca9e89f9 100644 --- a/libc/test/src/stdlib/StrfromTest.h +++ b/libc/test/src/stdlib/StrfromTest.h @@ -8,6 +8,7 @@ #include "src/__support/CPP/type_traits.h" #include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/properties/architectures.h" #include "test/UnitTest/ErrnoCheckingTest.h" #include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" @@ -484,7 +485,9 @@ class StrfromTest : public LIBC_NAMESPACE::testing::ErrnoCheckingTest { ASSERT_STREQ_LEN(written, buff, "-NAN"); } + // https://github.com/llvm/llvm-project/issues/166795 void charsWrittenOverflow(FunctionT func) { +#ifndef LIBC_TARGET_ARCH_IS_RISCV32 char buff[100]; // Trigger an overflow in the return value of strfrom by writing more than // INT_MAX bytes. @@ -492,6 +495,7 @@ class StrfromTest : public LIBC_NAMESPACE::testing::ErrnoCheckingTest { EXPECT_LT(result, 0); ASSERT_ERRNO_FAILURE(); +#endif } }; From bb6d2bea6495b044a0773598916eba801f8d38fc Mon Sep 17 00:00:00 2001 From: "Oleksandr T." Date: Thu, 6 Nov 2025 22:55:36 +0200 Subject: [PATCH 56/71] [Clang] fix confusing diagnostics for lambdas with init-captures inside braced initializers (#166180) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #163498 --- This PR addresses the issue of confusing diagnostics for lambdas with init-captures appearing inside braced initializers. Cases such as: ```cpp S s{[a(42), &] {}}; ``` were misparsed as C99 array designators, producing unrelated diagnostics, such as `use of undeclared identifier 'a'`, and `expected ']'` --- https://github.com/llvm/llvm-project/blob/bb9bd5f263226840194b28457ddf9861986db51f/clang/lib/Parse/ParseInit.cpp#L470 https://github.com/llvm/llvm-project/blob/bb9bd5f263226840194b28457ddf9861986db51f/clang/lib/Parse/ParseInit.cpp#L74 https://github.com/llvm/llvm-project/blob/bb9bd5f263226840194b28457ddf9861986db51f/clang/include/clang/Parse/Parser.h#L4652-L4655 https://github.com/llvm/llvm-project/blob/24c22b7de620669aed9da28de323309c44a58244/clang/lib/Parse/ParseExprCXX.cpp#L871-L879 The tentative parser now returns `Incomplete` for partially valid lambda introducers, preserving the `lambda` interpretation and allowing the proper diagnostic to be issued later. --- Clang now correctly recognizes such constructs as malformed lambda introducers and emits the expected diagnostic — for example, “capture-default must be first” — consistent with direct initialization cases such as: ```cpp S s([a(42), &] {}); ``` --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Parse/ParseExprCXX.cpp | 22 ++++++++++--------- .../lambda-misplaced-capture-default.cpp | 9 ++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 34c0d73d4a129..e8339fa13ffba 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -514,6 +514,7 @@ Bug Fixes to C++ Support - Fixed a template depth issue when parsing lambdas inside a type constraint. (#GH162092) - Diagnose unresolved overload sets in non-dependent compound requirements. (#GH51246) (#GH97753) - Fix a crash when extracting unavailable member type from alias in template deduction. (#GH165560) +- Fix incorrect diagnostics for lambdas with init-captures inside braced initializers. (#GH163498) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 74f87a8cb63c3..7a5d28caf8521 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -772,9 +772,11 @@ bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, // Produce a diagnostic if we're not tentatively parsing; otherwise track // that our parse has failed. - auto Invalid = [&](llvm::function_ref Action) { + auto Result = [&](llvm::function_ref Action, + LambdaIntroducerTentativeParse State = + LambdaIntroducerTentativeParse::Invalid) { if (Tentative) { - *Tentative = LambdaIntroducerTentativeParse::Invalid; + *Tentative = State; return false; } Action(); @@ -824,7 +826,7 @@ bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, break; } - return Invalid([&] { + return Result([&] { Diag(Tok.getLocation(), diag::err_expected_comma_or_rsquare); }); } @@ -861,7 +863,7 @@ bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, ConsumeToken(); Kind = LCK_StarThis; } else { - return Invalid([&] { + return Result([&] { Diag(Tok.getLocation(), diag::err_expected_star_this_capture); }); } @@ -875,8 +877,9 @@ bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, // or the start of a capture (in the "&" case) with the rest of the // capture missing. Both are an error but a misplaced capture-default // is more likely if we don't already have a capture default. - return Invalid( - [&] { Diag(Tok.getLocation(), diag::err_capture_default_first); }); + return Result( + [&] { Diag(Tok.getLocation(), diag::err_capture_default_first); }, + LambdaIntroducerTentativeParse::Incomplete); } else { TryConsumeToken(tok::ellipsis, EllipsisLocs[0]); @@ -899,14 +902,13 @@ bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, Id = Tok.getIdentifierInfo(); Loc = ConsumeToken(); } else if (Tok.is(tok::kw_this)) { - return Invalid([&] { + return Result([&] { // FIXME: Suggest a fixit here. Diag(Tok.getLocation(), diag::err_this_captured_by_reference); }); } else { - return Invalid([&] { - Diag(Tok.getLocation(), diag::err_expected_capture); - }); + return Result( + [&] { Diag(Tok.getLocation(), diag::err_expected_capture); }); } TryConsumeToken(tok::ellipsis, EllipsisLocs[2]); diff --git a/clang/test/Parser/lambda-misplaced-capture-default.cpp b/clang/test/Parser/lambda-misplaced-capture-default.cpp index d65b875102da7..4f5bd6d7fa5e9 100644 --- a/clang/test/Parser/lambda-misplaced-capture-default.cpp +++ b/clang/test/Parser/lambda-misplaced-capture-default.cpp @@ -36,3 +36,12 @@ template void Test(Args... args) { [... xs = &args, &] {}; // expected-error {{capture default must be first}} } } // namespace misplaced_capture_default_pack + +namespace GH163498 { +struct S { + template S(T) {} +}; +void t() { + S s{[a(42), &] {}}; // expected-error {{capture default must be first}} +} +} From 94a52cbdae280e1aa164dbd9078e5d6e201936a8 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 13:09:30 -0800 Subject: [PATCH 57/71] [CI] Remove Disabled Warning Set on Windows (#166838) The low hanging fruit that was causing the vast majority of these warnings has been fixed, so reenable them now. There are still a couple more warnings that could probably do with some cleanup, but those can be fixed in the future. --- .ci/monolithic-windows.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.ci/monolithic-windows.sh b/.ci/monolithic-windows.sh index d1b834cc4e840..beaed71f49f65 100755 --- a/.ci/monolithic-windows.sh +++ b/.ci/monolithic-windows.sh @@ -47,7 +47,6 @@ cmake -S "${MONOREPO_ROOT}"/llvm -B "${BUILD_DIR}" \ -D CMAKE_EXE_LINKER_FLAGS="/MANIFEST:NO" \ -D CMAKE_MODULE_LINKER_FLAGS="/MANIFEST:NO" \ -D CMAKE_SHARED_LINKER_FLAGS="/MANIFEST:NO" \ - -D CMAKE_CXX_FLAGS="-Wno-c++98-compat -Wno-c++14-compat -Wno-unsafe-buffer-usage -Wno-old-style-cast" \ -D LLVM_ENABLE_RUNTIMES="${runtimes}" start-group "ninja" From c940bfd7e6218c01c6a517e8d6afc8067e933ffd Mon Sep 17 00:00:00 2001 From: Sergei Barannikov Date: Fri, 7 Nov 2025 00:28:27 +0300 Subject: [PATCH 58/71] [BPF] TableGen-erate SDNode descriptions (#166499) This allows SDNodes to be validated against their expected type profiles and reduces the number of changes required to add a new node. Fix BR_CC/MEMCPY descriptions to match C++ code that creates the nodes (an error detected by the enabled verification functionality). Also remove redundant `SDNPOutGlue` on `BPFISD::MEMCPY`. Part of #119709. --- llvm/lib/Target/BPF/BPFISelLowering.cpp | 20 -------------------- llvm/lib/Target/BPF/BPFISelLowering.h | 14 -------------- llvm/lib/Target/BPF/BPFInstrInfo.td | 6 ++---- llvm/lib/Target/BPF/BPFSelectionDAGInfo.cpp | 18 +++++++++++------- llvm/lib/Target/BPF/BPFSelectionDAGInfo.h | 10 +++++++--- llvm/lib/Target/BPF/CMakeLists.txt | 1 + 6 files changed, 21 insertions(+), 48 deletions(-) diff --git a/llvm/lib/Target/BPF/BPFISelLowering.cpp b/llvm/lib/Target/BPF/BPFISelLowering.cpp index 6e5520c3dbb18..3c61216cd9327 100644 --- a/llvm/lib/Target/BPF/BPFISelLowering.cpp +++ b/llvm/lib/Target/BPF/BPFISelLowering.cpp @@ -803,26 +803,6 @@ SDValue BPFTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const { return getAddr(N, DAG); } -const char *BPFTargetLowering::getTargetNodeName(unsigned Opcode) const { - switch ((BPFISD::NodeType)Opcode) { - case BPFISD::FIRST_NUMBER: - break; - case BPFISD::RET_GLUE: - return "BPFISD::RET_GLUE"; - case BPFISD::CALL: - return "BPFISD::CALL"; - case BPFISD::SELECT_CC: - return "BPFISD::SELECT_CC"; - case BPFISD::BR_CC: - return "BPFISD::BR_CC"; - case BPFISD::Wrapper: - return "BPFISD::Wrapper"; - case BPFISD::MEMCPY: - return "BPFISD::MEMCPY"; - } - return nullptr; -} - static SDValue getTargetNode(ConstantPoolSDNode *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, unsigned Flags) { return DAG.getTargetConstantPool(N->getConstVal(), Ty, N->getAlign(), diff --git a/llvm/lib/Target/BPF/BPFISelLowering.h b/llvm/lib/Target/BPF/BPFISelLowering.h index 5243d4944667d..3d6e7c70df28b 100644 --- a/llvm/lib/Target/BPF/BPFISelLowering.h +++ b/llvm/lib/Target/BPF/BPFISelLowering.h @@ -20,17 +20,6 @@ namespace llvm { class BPFSubtarget; -namespace BPFISD { -enum NodeType : unsigned { - FIRST_NUMBER = ISD::BUILTIN_OP_END, - RET_GLUE, - CALL, - SELECT_CC, - BR_CC, - Wrapper, - MEMCPY -}; -} class BPFTargetLowering : public TargetLowering { public: @@ -39,9 +28,6 @@ class BPFTargetLowering : public TargetLowering { // Provide custom lowering hooks for some operations. SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; - // This method returns the name of a target specific DAG node. - const char *getTargetNodeName(unsigned Opcode) const override; - // This method decides whether folding a constant offset // with the given GlobalAddress is legal. bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override; diff --git a/llvm/lib/Target/BPF/BPFInstrInfo.td b/llvm/lib/Target/BPF/BPFInstrInfo.td index 51c32b22510f0..bdacf9cc3a6ab 100644 --- a/llvm/lib/Target/BPF/BPFInstrInfo.td +++ b/llvm/lib/Target/BPF/BPFInstrInfo.td @@ -41,14 +41,12 @@ def BPFcallseq_start: SDNode<"ISD::CALLSEQ_START", SDT_BPFCallSeqStart, [SDNPHasChain, SDNPOutGlue]>; def BPFcallseq_end : SDNode<"ISD::CALLSEQ_END", SDT_BPFCallSeqEnd, [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; -def BPFbrcc : SDNode<"BPFISD::BR_CC", SDT_BPFBrCC, - [SDNPHasChain, SDNPOutGlue, SDNPInGlue]>; +def BPFbrcc : SDNode<"BPFISD::BR_CC", SDT_BPFBrCC, [SDNPHasChain]>; def BPFselectcc : SDNode<"BPFISD::SELECT_CC", SDT_BPFSelectCC>; def BPFWrapper : SDNode<"BPFISD::Wrapper", SDT_BPFWrapper>; def BPFmemcpy : SDNode<"BPFISD::MEMCPY", SDT_BPFMEMCPY, - [SDNPHasChain, SDNPInGlue, SDNPOutGlue, - SDNPMayStore, SDNPMayLoad]>; + [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; def BPFIsLittleEndian : Predicate<"Subtarget->isLittleEndian()">; def BPFIsBigEndian : Predicate<"!Subtarget->isLittleEndian()">; def BPFHasALU32 : Predicate<"Subtarget->getHasAlu32()">; diff --git a/llvm/lib/Target/BPF/BPFSelectionDAGInfo.cpp b/llvm/lib/Target/BPF/BPFSelectionDAGInfo.cpp index 3e29e6c7ed386..0e6d35dd3781f 100644 --- a/llvm/lib/Target/BPF/BPFSelectionDAGInfo.cpp +++ b/llvm/lib/Target/BPF/BPFSelectionDAGInfo.cpp @@ -10,12 +10,20 @@ // //===----------------------------------------------------------------------===// +#include "BPFSelectionDAGInfo.h" #include "BPFTargetMachine.h" #include "llvm/CodeGen/SelectionDAG.h" + +#define GET_SDNODE_DESC +#include "BPFGenSDNodeInfo.inc" + using namespace llvm; #define DEBUG_TYPE "bpf-selectiondag-info" +BPFSelectionDAGInfo::BPFSelectionDAGInfo() + : SelectionDAGGenTargetInfo(BPFGenSDNodeInfo) {} + SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy( SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline, @@ -31,11 +39,7 @@ SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy( if (StoresNumEstimate > getCommonMaxStoresPerMemFunc()) return SDValue(); - SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Glue); - - Dst = DAG.getNode(BPFISD::MEMCPY, dl, VTs, Chain, Dst, Src, - DAG.getConstant(CopyLen, dl, MVT::i64), - DAG.getConstant(Alignment.value(), dl, MVT::i64)); - - return Dst.getValue(0); + return DAG.getNode(BPFISD::MEMCPY, dl, MVT::Other, Chain, Dst, Src, + DAG.getConstant(CopyLen, dl, MVT::i64), + DAG.getConstant(Alignment.value(), dl, MVT::i64)); } diff --git a/llvm/lib/Target/BPF/BPFSelectionDAGInfo.h b/llvm/lib/Target/BPF/BPFSelectionDAGInfo.h index 79f05e57bb5cd..7345d2d7e4738 100644 --- a/llvm/lib/Target/BPF/BPFSelectionDAGInfo.h +++ b/llvm/lib/Target/BPF/BPFSelectionDAGInfo.h @@ -15,10 +15,15 @@ #include "llvm/CodeGen/SelectionDAGTargetInfo.h" +#define GET_SDNODE_ENUM +#include "BPFGenSDNodeInfo.inc" + namespace llvm { -class BPFSelectionDAGInfo : public SelectionDAGTargetInfo { +class BPFSelectionDAGInfo : public SelectionDAGGenTargetInfo { public: + BPFSelectionDAGInfo(); + SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, @@ -27,9 +32,8 @@ class BPFSelectionDAGInfo : public SelectionDAGTargetInfo { MachinePointerInfo SrcPtrInfo) const override; unsigned getCommonMaxStoresPerMemFunc() const { return 128; } - }; -} +} // namespace llvm #endif diff --git a/llvm/lib/Target/BPF/CMakeLists.txt b/llvm/lib/Target/BPF/CMakeLists.txt index 3678f1335ca36..fa539a0a7b806 100644 --- a/llvm/lib/Target/BPF/CMakeLists.txt +++ b/llvm/lib/Target/BPF/CMakeLists.txt @@ -10,6 +10,7 @@ tablegen(LLVM BPFGenDisassemblerTables.inc -gen-disassembler) tablegen(LLVM BPFGenInstrInfo.inc -gen-instr-info) tablegen(LLVM BPFGenMCCodeEmitter.inc -gen-emitter) tablegen(LLVM BPFGenRegisterInfo.inc -gen-register-info) +tablegen(LLVM BPFGenSDNodeInfo.inc -gen-sd-node-info) tablegen(LLVM BPFGenSubtargetInfo.inc -gen-subtarget) tablegen(LLVM BPFGenGlobalISel.inc -gen-global-isel) tablegen(LLVM BPFGenRegisterBank.inc -gen-register-bank) From 3ad5765e2341b53bff480b7992b1ed428dc603d6 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 6 Nov 2025 21:45:57 +0000 Subject: [PATCH 59/71] [LV] Check all users of partial reductions in chain have same scale. (#162822) Check that all partial reductions in a chain are only used by other partial reductions with the same scale factor. Otherwise we end up creating users of scaled reductions where the types of the other operands don't match. A similar issue was addressed in https://github.com/llvm/llvm-project/pull/158603, but misses the chained cases. Fixes https://github.com/llvm/llvm-project/issues/162530. PR: https://github.com/llvm/llvm-project/pull/162822 --- .../Transforms/Vectorize/LoopVectorize.cpp | 33 ++++++++++++++----- .../partial-reduce-incomplete-chains.ll | 25 ++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 906fa2f857c21..b7224a33f47b1 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -7933,6 +7933,26 @@ void VPRecipeBuilder::collectScaledReductions(VFRange &Range) { (!Chain.ExtendB || ExtendIsOnlyUsedByPartialReductions(Chain.ExtendB))) ScaledReductionMap.try_emplace(Chain.Reduction, Pair.second); } + + // Check that all partial reductions in a chain are only used by other + // partial reductions with the same scale factor. Otherwise we end up creating + // users of scaled reductions where the types of the other operands don't + // match. + for (const auto &[Chain, Scale] : PartialReductionChains) { + auto AllUsersPartialRdx = [ScaleVal = Scale, this](const User *U) { + auto *UI = cast(U); + if (isa(UI) && UI->getParent() == OrigLoop->getHeader()) { + return all_of(UI->users(), [ScaleVal, this](const User *U) { + auto *UI = cast(U); + return ScaledReductionMap.lookup_or(UI, 0) == ScaleVal; + }); + } + return ScaledReductionMap.lookup_or(UI, 0) == ScaleVal || + !OrigLoop->contains(UI->getParent()); + }; + if (!all_of(Chain.Reduction->users(), AllUsersPartialRdx)) + ScaledReductionMap.erase(Chain.Reduction); + } } bool VPRecipeBuilder::getScaledReductions( @@ -8116,11 +8136,8 @@ VPRecipeBase *VPRecipeBuilder::tryToCreateWidenRecipe(VPSingleDefRecipe *R, if (isa(Instr) || isa(Instr)) return tryToWidenMemory(Instr, Operands, Range); - if (std::optional ScaleFactor = getScalingForReduction(Instr)) { - if (auto PartialRed = - tryToCreatePartialReduction(Instr, Operands, ScaleFactor.value())) - return PartialRed; - } + if (std::optional ScaleFactor = getScalingForReduction(Instr)) + return tryToCreatePartialReduction(Instr, Operands, ScaleFactor.value()); if (!shouldWiden(Instr, Range)) return nullptr; @@ -8154,9 +8171,9 @@ VPRecipeBuilder::tryToCreatePartialReduction(Instruction *Reduction, isa(BinOpRecipe)) std::swap(BinOp, Accumulator); - if (ScaleFactor != - vputils::getVFScaleFactor(Accumulator->getDefiningRecipe())) - return nullptr; + assert(ScaleFactor == + vputils::getVFScaleFactor(Accumulator->getDefiningRecipe()) && + "all accumulators in chain must have same scale factor"); unsigned ReductionOpcode = Reduction->getOpcode(); if (ReductionOpcode == Instruction::Sub) { diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-incomplete-chains.ll b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-incomplete-chains.ll index d80178fde45d9..866487d2620ea 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-incomplete-chains.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-incomplete-chains.ll @@ -70,3 +70,28 @@ loop: exit: ret i32 %red.next } + +define i16 @test_incomplete_chain_without_mul(ptr noalias %dst, ptr %A, ptr %B) #0 { +entry: + br label %loop + +loop: + %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] + %red = phi i16 [ 0, %entry ], [ %red.next, %loop ] + %l.a = load i8, ptr %A, align 1 + %a.ext = zext i8 %l.a to i16 + store i16 %a.ext, ptr %dst, align 2 + %l.b = load i8, ptr %B, align 1 + %b.ext = zext i8 %l.b to i16 + %add = add i16 %red, %b.ext + %add.1 = add i16 %add, %a.ext + %red.next = add i16 %add.1, %b.ext + %iv.next = add i64 %iv, 1 + %ec = icmp ult i64 %iv, 1024 + br i1 %ec, label %loop, label %exit + +exit: + ret i16 %red.next +} + +attributes #0 = { "target-cpu"="grace" } From 2c0e4e775c0f98149d5c48cb2a750926f6f74f4a Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Thu, 6 Nov 2025 16:52:36 -0500 Subject: [PATCH 60/71] RuntimeLibcalls: Remove LLVM_ABI from private member variable declarations (#166776) Seeing warnings: llvm/include/llvm/CodeGen/LibcallLoweringInfo.h:15:46: error: 'visibility' attribute ignored [-Werror=attributes] 15 | LLVM_ABI const RTLIB::RuntimeLibcallsInfo &RTLCI; llvm/include/llvm/CodeGen/LibcallLoweringInfo.h:18:25: error: 'visibility' attribute ignored [-Werror=attributes] 18 | RTLIB::Unsupported}; --- llvm/include/llvm/CodeGen/LibcallLoweringInfo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h index 9229750e00ab8..e88079e796e7d 100644 --- a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h +++ b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h @@ -15,9 +15,9 @@ namespace llvm { class LibcallLoweringInfo { private: - LLVM_ABI const RTLIB::RuntimeLibcallsInfo &RTLCI; + const RTLIB::RuntimeLibcallsInfo &RTLCI; /// Stores the implementation choice for each each libcall. - LLVM_ABI RTLIB::LibcallImpl LibcallImpls[RTLIB::UNKNOWN_LIBCALL + 1] = { + RTLIB::LibcallImpl LibcallImpls[RTLIB::UNKNOWN_LIBCALL + 1] = { RTLIB::Unsupported}; public: From 4b4bfe9ceb48b69bafa38bc13ca34c1daea1fc06 Mon Sep 17 00:00:00 2001 From: Razvan Lupusoru Date: Thu, 6 Nov 2025 13:54:30 -0800 Subject: [PATCH 61/71] [flang][acc] Add missing FIRAnalysis dependency (#166853) Fix shared library linking failure for FIROpenACCTransforms --- flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt b/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt index 963b7351d3a45..35aa87d6f1c80 100644 --- a/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt +++ b/flang/lib/Optimizer/OpenACC/Transforms/CMakeLists.txt @@ -6,6 +6,7 @@ add_flang_library(FIROpenACCTransforms FIROpenACCPassesIncGen LINK_LIBS + FIRAnalysis FIRDialect FIROpenACCAnalysis HLFIRDialect From fa83723bbe55f2aee857438f8087c4fc0f52449e Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Thu, 6 Nov 2025 14:17:51 -0800 Subject: [PATCH 62/71] [debugserver] Remove unnecessary sleep in MachProcess::AttachForDebug (#166674) Remove the unnecessary sleep in MachProcess::AttachForDebug. The preceding comment makes it seem like it's necessary for synchronization, though I don't believe that's the case (see below), and even if it were, sleeping is not a reliable way to achieve that. The reason I don't believe it's necessary is because after we return, we synchronize with the exception thread on a state change. The latter will call and update the process state, which is exactly what we synchronize on. I was able to verify that this is the first time we change the process state: i.e., `GetState` doesn't return a different value before and after the sleep. On top of that, there are 3 more places where we call ptrace attach (`PosixSpawnChildForPTraceDebugging`, `SBLaunchForDebug`, and `BoardServiceLaunchForDebug`) where we don't sleep. rdar://163952037 --- lldb/tools/debugserver/source/MacOSX/MachProcess.mm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm index 3afaaa2f64c00..8df3f29a7e825 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm @@ -2853,12 +2853,6 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) { if (err.Success()) { m_flags |= eMachProcessFlagsAttached; - // Sleep a bit to let the exception get received and set our process - // status - // to stopped. - ::usleep(250000); - DNBLog("[LaunchAttach] (%d) Done napping after ptrace(PT_ATTACHEXC)'ing", - getpid()); DNBLogThreadedIf(LOG_PROCESS, "successfully attached to pid %d", pid); return m_pid; } else { From 8b422006af02766a0e1577108260200944106530 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Thu, 6 Nov 2025 15:00:19 -0800 Subject: [PATCH 63/71] [mlir][ods] Enable basic string interpolation in constraint summary. (#153603) This enables printing, for example, the attribute value from a mismatched predicate. Example of resultant output (here made non-negative report value seen as sign-extended int): ``` PDL/ops.mlir:21:1: error: 'pdl.pattern' op attribute 'benefit' failed to satisfy constraint: 16-bit signless integer attribute whose value is non-negative (got -31) pdl.pattern @rewrite_with_args : benefit(-31) { ^ ``` This is primarily the mechanism and didn't change any existing constraints. I also attempted to keep the error format as close to the original as possible - but did notice 2 errors that were inconsistent with the rest and updated them to be consistent. --- mlir/include/mlir/TableGen/CodeGenHelpers.h | 24 ++++- mlir/lib/TableGen/CodeGenHelpers.cpp | 90 ++++++++++++++++--- mlir/test/mlir-tblgen/constraint-unique.td | 10 +-- mlir/test/mlir-tblgen/op-attribute.td | 16 ++-- .../mlir-tblgen/op-properties-predicates.td | 2 +- mlir/test/mlir-tblgen/predicate.td | 16 ++-- mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | 38 +++++--- mlir/unittests/TableGen/CMakeLists.txt | 2 +- 8 files changed, 150 insertions(+), 48 deletions(-) diff --git a/mlir/include/mlir/TableGen/CodeGenHelpers.h b/mlir/include/mlir/TableGen/CodeGenHelpers.h index 997aef26bdc01..b56172f55a157 100644 --- a/mlir/include/mlir/TableGen/CodeGenHelpers.h +++ b/mlir/include/mlir/TableGen/CodeGenHelpers.h @@ -52,6 +52,15 @@ class DialectNamespaceEmitter { std::optional nsEmitter; }; +/// This class represents how an error stream string being constructed will be +/// consumed. +enum class ErrorStreamType { + // Inside a string that's streamed into an InflightDiagnostic. + InString, + // Inside a string inside an OpError. + InsideOpError, +}; + /// This class deduplicates shared operation verification code by emitting /// static functions alongside the op definitions. These methods are local to /// the definition file, and are invoked within the operation verify methods. @@ -192,7 +201,8 @@ class StaticVerifierFunctionEmitter { /// A generic function to emit constraints void emitConstraints(const ConstraintMap &constraints, StringRef selfName, - const char *codeTemplate); + const char *codeTemplate, + ErrorStreamType errorStreamType); /// Assign a unique name to a unique constraint. std::string getUniqueName(StringRef kind, unsigned index); @@ -243,6 +253,18 @@ std::string stringify(T &&t) { apply(std::forward(t)); } +/// Helper to generate a C++ streaming error message from a given message. +/// Message can contain '{{...}}' placeholders that are substituted with +/// C-expressions via tgfmt. It would effectively convert: +/// "failed to verify {{foo}}" +/// into: +/// "failed to verify " << bar +/// where bar is the result of evaluating 'tgfmt("foo", &ctx)' at compile +/// time. +std::string buildErrorStreamingString( + StringRef message, const FmtContext &ctx, + ErrorStreamType errorStreamType = ErrorStreamType::InString); + } // namespace tblgen } // namespace mlir diff --git a/mlir/lib/TableGen/CodeGenHelpers.cpp b/mlir/lib/TableGen/CodeGenHelpers.cpp index d52d5e769ee6d..9ad031eb701ad 100644 --- a/mlir/lib/TableGen/CodeGenHelpers.cpp +++ b/mlir/lib/TableGen/CodeGenHelpers.cpp @@ -12,12 +12,26 @@ //===----------------------------------------------------------------------===// #include "mlir/TableGen/CodeGenHelpers.h" +#include "mlir/Support/LLVM.h" +#include "mlir/TableGen/Argument.h" +#include "mlir/TableGen/Attribute.h" +#include "mlir/TableGen/Format.h" #include "mlir/TableGen/Operator.h" #include "mlir/TableGen/Pattern.h" +#include "mlir/TableGen/Property.h" +#include "mlir/TableGen/Region.h" +#include "mlir/TableGen/Successor.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/CodeGenHelpers.h" +#include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" +#include +#include +#include using namespace llvm; using namespace mlir; @@ -112,6 +126,55 @@ StringRef StaticVerifierFunctionEmitter::getRegionConstraintFn( // Constraint Emission //===----------------------------------------------------------------------===// +/// Helper to generate a C++ string expression from a given message. +/// Message can contain '{{...}}' placeholders that are substituted with +/// C-expressions via tgfmt. +std::string mlir::tblgen::buildErrorStreamingString( + StringRef message, const FmtContext &ctx, ErrorStreamType errorStreamType) { + std::string result; + raw_string_ostream os(result); + + std::string msgStr = escapeString(message); + StringRef msg = msgStr; + + // Split the message by '{{' and '}}' and build a streaming expression. + auto split = msg.split("{{"); + os << split.first; + if (split.second.empty()) { + return msgStr; + } + + if (errorStreamType == ErrorStreamType::InsideOpError) + os << "\")"; + else + os << '"'; + + msg = split.second; + while (!msg.empty()) { + split = msg.split("}}"); + StringRef var = split.first; + StringRef rest = split.second; + + os << " << " << tgfmt(var, &ctx); + + if (rest.empty()) + break; + + split = rest.split("{{"); + if (split.second.empty() && + errorStreamType == ErrorStreamType::InsideOpError) { + // To enable having part of string post, this adds a parenthesis before + // the last string segment to match the existing one. + os << " << (\"" << split.first; + } else { + os << " << \"" << split.first; + } + msg = split.second; + } + + return os.str(); +} + /// Code templates for emitting type, attribute, successor, and region /// constraints. Each of these templates require the following arguments: /// @@ -224,22 +287,24 @@ static ::llvm::LogicalResult {0}( void StaticVerifierFunctionEmitter::emitConstraints( const ConstraintMap &constraints, StringRef selfName, - const char *const codeTemplate) { + const char *const codeTemplate, ErrorStreamType errorStreamType) { FmtContext ctx; ctx.addSubst("_op", "*op").withSelf(selfName); + for (auto &it : constraints) { os << formatv(codeTemplate, it.second, tgfmt(it.first.getConditionTemplate(), &ctx), - escapeString(it.first.getSummary())); + buildErrorStreamingString(it.first.getSummary(), ctx)); } } - void StaticVerifierFunctionEmitter::emitTypeConstraints() { - emitConstraints(typeConstraints, "type", typeConstraintCode); + emitConstraints(typeConstraints, "type", typeConstraintCode, + ErrorStreamType::InString); } void StaticVerifierFunctionEmitter::emitAttrConstraints() { - emitConstraints(attrConstraints, "attr", attrConstraintCode); + emitConstraints(attrConstraints, "attr", attrConstraintCode, + ErrorStreamType::InString); } /// Unlike with the other helpers, this one has to substitute in the interface @@ -251,17 +316,19 @@ void StaticVerifierFunctionEmitter::emitPropConstraints() { auto propConstraint = cast(it.first); os << formatv(propConstraintCode, it.second, tgfmt(propConstraint.getConditionTemplate(), &ctx), - escapeString(it.first.getSummary()), + buildErrorStreamingString(it.first.getSummary(), ctx), propConstraint.getInterfaceType()); } } void StaticVerifierFunctionEmitter::emitSuccessorConstraints() { - emitConstraints(successorConstraints, "successor", successorConstraintCode); + emitConstraints(successorConstraints, "successor", successorConstraintCode, + ErrorStreamType::InString); } void StaticVerifierFunctionEmitter::emitRegionConstraints() { - emitConstraints(regionConstraints, "region", regionConstraintCode); + emitConstraints(regionConstraints, "region", regionConstraintCode, + ErrorStreamType::InString); } void StaticVerifierFunctionEmitter::emitPatternConstraints() { @@ -270,13 +337,14 @@ void StaticVerifierFunctionEmitter::emitPatternConstraints() { for (auto &it : typeConstraints) { os << formatv(patternConstraintCode, it.second, tgfmt(it.first.getConditionTemplate(), &ctx), - escapeString(it.first.getSummary()), "::mlir::Type type"); + buildErrorStreamingString(it.first.getSummary(), ctx), + "::mlir::Type type"); } ctx.withSelf("attr"); for (auto &it : attrConstraints) { os << formatv(patternConstraintCode, it.second, tgfmt(it.first.getConditionTemplate(), &ctx), - escapeString(it.first.getSummary()), + buildErrorStreamingString(it.first.getSummary(), ctx), "::mlir::Attribute attr"); } ctx.withSelf("prop"); @@ -291,7 +359,7 @@ void StaticVerifierFunctionEmitter::emitPatternConstraints() { } os << formatv(patternConstraintCode, it.second, tgfmt(propConstraint.getConditionTemplate(), &ctx), - escapeString(propConstraint.getSummary()), + buildErrorStreamingString(propConstraint.getSummary(), ctx), Twine(interfaceType) + " prop"); } } diff --git a/mlir/test/mlir-tblgen/constraint-unique.td b/mlir/test/mlir-tblgen/constraint-unique.td index d51e1a5f43ee7..3f2e5cd4bfad4 100644 --- a/mlir/test/mlir-tblgen/constraint-unique.td +++ b/mlir/test/mlir-tblgen/constraint-unique.td @@ -16,7 +16,7 @@ def AType : Type; def OtherType : Type; def AnAttrPred : CPred<"attrPred($_self, $_op)">; -def AnAttr : Attr; +def AnAttr : Attr; def OtherAttr : Attr; def ASuccessorPred : CPred<"successorPred($_self, $_op)">; @@ -24,7 +24,7 @@ def ASuccessor : Successor; def OtherSuccessor : Successor; def ARegionPred : CPred<"regionPred($_self, $_op)">; -def ARegion : Region; +def ARegion : Region; def OtherRegion : Region; // OpA and OpB have the same type, attribute, successor, and region constraints. @@ -71,10 +71,10 @@ def OpC : NS_Op<"op_c"> { // CHECK: static ::llvm::LogicalResult [[$A_ATTR_CONSTRAINT:__mlir_ods_local_attr_constraint.*]]( // CHECK: if (attr && !((attrPred(attr, *op)))) // CHECK-NEXT: return emitError() << "attribute '" << attrName -// CHECK-NEXT: << "' failed to satisfy constraint: an attribute"; +// CHECK-NEXT: << "' failed to satisfy constraint: an attribute (got " << reformat(attr) << ")"; /// Test that duplicate attribute constraint was not generated. -// CHECK-NOT: << "' failed to satisfy constraint: an attribute"; +// CHECK-NOT: << "' failed to satisfy constraint: an attribute /// Test that a attribute constraint with a different description was generated. // CHECK: static ::llvm::LogicalResult [[$O_ATTR_CONSTRAINT:__mlir_ods_local_attr_constraint.*]]( @@ -103,7 +103,7 @@ def OpC : NS_Op<"op_c"> { // CHECK: if (!((regionPred(region, *op)))) { // CHECK-NEXT: return op->emitOpError("region #") << regionIndex // CHECK-NEXT: << (regionName.empty() ? " " : " ('" + regionName + "') ") -// CHECK-NEXT: << "failed to verify constraint: a region"; +// CHECK-NEXT: << "failed to verify constraint: a region (" << find(foo) << ")"; /// Test that duplicate region constraint was not generated. // CHECK-NOT: << "failed to verify constraint: a region"; diff --git a/mlir/test/mlir-tblgen/op-attribute.td b/mlir/test/mlir-tblgen/op-attribute.td index 549830e06042f..a3cb9a41a5b7f 100644 --- a/mlir/test/mlir-tblgen/op-attribute.td +++ b/mlir/test/mlir-tblgen/op-attribute.td @@ -69,19 +69,19 @@ def AOp : NS_Op<"a_op", []> { // DEF: ::llvm::LogicalResult AOpAdaptor::verify // DEF-NEXT: auto tblgen_aAttr = getProperties().aAttr; (void)tblgen_aAttr; -// DEF-NEXT: if (!tblgen_aAttr) return emitError(loc, "'test.a_op' op ""requires attribute 'aAttr'"); +// DEF-NEXT: if (!tblgen_aAttr) return emitError(loc, "'test.a_op' op requires attribute 'aAttr'"); // DEF-NEXT: auto tblgen_bAttr = getProperties().bAttr; (void)tblgen_bAttr; // DEF-NEXT: auto tblgen_cAttr = getProperties().cAttr; (void)tblgen_cAttr; // DEF-NEXT: auto tblgen_dAttr = getProperties().dAttr; (void)tblgen_dAttr; // DEF: if (tblgen_aAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test.a_op' op ""attribute 'aAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test.a_op' op attribute 'aAttr' failed to satisfy constraint: some attribute kind"); // DEF: if (tblgen_bAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test.a_op' op ""attribute 'bAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test.a_op' op attribute 'bAttr' failed to satisfy constraint: some attribute kind"); // DEF: if (tblgen_cAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test.a_op' op ""attribute 'cAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test.a_op' op attribute 'cAttr' failed to satisfy constraint: some attribute kind"); // DEF: if (tblgen_dAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test.a_op' op ""attribute 'dAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test.a_op' op attribute 'dAttr' failed to satisfy constraint: some attribute kind"); // Test getter methods // --- @@ -219,13 +219,13 @@ def AgetOp : Op { // DEF: ::llvm::LogicalResult AgetOpAdaptor::verify // DEF: auto tblgen_aAttr = getProperties().aAttr; (void)tblgen_aAttr; -// DEF: if (!tblgen_aAttr) return emitError(loc, "'test2.a_get_op' op ""requires attribute 'aAttr'"); +// DEF: if (!tblgen_aAttr) return emitError(loc, "'test2.a_get_op' op requires attribute 'aAttr'"); // DEF: auto tblgen_bAttr = getProperties().bAttr; (void)tblgen_bAttr; // DEF: auto tblgen_cAttr = getProperties().cAttr; (void)tblgen_cAttr; // DEF: if (tblgen_bAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test2.a_get_op' op ""attribute 'bAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test2.a_get_op' op attribute 'bAttr' failed to satisfy constraint: some attribute kind"); // DEF: if (tblgen_cAttr && !((some-condition))) -// DEF-NEXT: return emitError(loc, "'test2.a_get_op' op ""attribute 'cAttr' failed to satisfy constraint: some attribute kind"); +// DEF-NEXT: return emitError(loc, "'test2.a_get_op' op attribute 'cAttr' failed to satisfy constraint: some attribute kind"); // Test getter methods // --- diff --git a/mlir/test/mlir-tblgen/op-properties-predicates.td b/mlir/test/mlir-tblgen/op-properties-predicates.td index af09ee7c12f53..7cc9633850069 100644 --- a/mlir/test/mlir-tblgen/op-properties-predicates.td +++ b/mlir/test/mlir-tblgen/op-properties-predicates.td @@ -74,7 +74,7 @@ def OpWithPredicates : NS_Op<"op_with_predicates"> { // Note: comprehensive emission of verifiers is tested in verifyINvariantsImpl() below // CHECK: int64_t tblgen_scalar = this->getScalar(); // CHECK: if (!((tblgen_scalar >= 0))) -// CHECK: return emitError(loc, "'test.op_with_predicates' op ""property 'scalar' failed to satisfy constraint: non-negative int64_t"); +// CHECK: return emitError(loc, "'test.op_with_predicates' op property 'scalar' failed to satisfy constraint: non-negative int64_t"); // CHECK-LABEL: OpWithPredicates::verifyInvariantsImpl() // Note: for test readability, we capture [[maybe_unused]] into the variable maybe_unused diff --git a/mlir/test/mlir-tblgen/predicate.td b/mlir/test/mlir-tblgen/predicate.td index c1fcd3fa76089..41e041f171213 100644 --- a/mlir/test/mlir-tblgen/predicate.td +++ b/mlir/test/mlir-tblgen/predicate.td @@ -55,7 +55,7 @@ def OpF : NS_Op<"op_for_int_min_val", []> { // CHECK-LABEL: OpFAdaptor::verify // CHECK: (::llvm::cast<::mlir::IntegerAttr>(tblgen_attr).getInt() >= 10) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: 32-bit signless integer attribute whose minimum value is 10" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: 32-bit signless integer attribute whose minimum value is 10" def OpFX : NS_Op<"op_for_int_max_val", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -63,7 +63,7 @@ def OpFX : NS_Op<"op_for_int_max_val", []> { // CHECK-LABEL: OpFXAdaptor::verify // CHECK: (::llvm::cast<::mlir::IntegerAttr>(tblgen_attr).getInt() <= 10) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: 32-bit signless integer attribute whose maximum value is 10" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: 32-bit signless integer attribute whose maximum value is 10" def OpG : NS_Op<"op_for_arr_min_count", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -71,7 +71,7 @@ def OpG : NS_Op<"op_for_arr_min_count", []> { // CHECK-LABEL: OpGAdaptor::verify // CHECK: (::llvm::cast<::mlir::ArrayAttr>(tblgen_attr).size() >= 8) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: array attribute with at least 8 elements" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: array attribute with at least 8 elements" def OpH : NS_Op<"op_for_arr_value_at_index", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -79,7 +79,7 @@ def OpH : NS_Op<"op_for_arr_value_at_index", []> { // CHECK-LABEL: OpHAdaptor::verify // CHECK: (((::llvm::cast<::mlir::ArrayAttr>(tblgen_attr).size() > 0)) && ((::llvm::cast<::mlir::IntegerAttr>(::llvm::cast<::mlir::ArrayAttr>(tblgen_attr)[0]).getInt() == 8))))) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be 8" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be 8" def OpI: NS_Op<"op_for_arr_min_value_at_index", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -87,7 +87,7 @@ def OpI: NS_Op<"op_for_arr_min_value_at_index", []> { // CHECK-LABEL: OpIAdaptor::verify // CHECK: (((::llvm::cast<::mlir::ArrayAttr>(tblgen_attr).size() > 0)) && ((::llvm::cast<::mlir::IntegerAttr>(::llvm::cast<::mlir::ArrayAttr>(tblgen_attr)[0]).getInt() >= 8))))) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at least 8" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at least 8" def OpJ: NS_Op<"op_for_arr_max_value_at_index", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -95,7 +95,7 @@ def OpJ: NS_Op<"op_for_arr_max_value_at_index", []> { // CHECK-LABEL: OpJAdaptor::verify // CHECK: (((::llvm::cast<::mlir::ArrayAttr>(tblgen_attr).size() > 0)) && ((::llvm::cast<::mlir::IntegerAttr>(::llvm::cast<::mlir::ArrayAttr>(tblgen_attr)[0]).getInt() <= 8))))) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at most 8" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at most 8" def OpK: NS_Op<"op_for_arr_in_range_at_index", []> { let arguments = (ins ConfinedAttr]>:$attr); @@ -103,7 +103,7 @@ def OpK: NS_Op<"op_for_arr_in_range_at_index", []> { // CHECK-LABEL: OpKAdaptor::verify // CHECK: (((::llvm::cast<::mlir::ArrayAttr>(tblgen_attr).size() > 0)) && ((::llvm::cast<::mlir::IntegerAttr>(::llvm::cast<::mlir::ArrayAttr>(tblgen_attr)[0]).getInt() >= 4)) && ((::llvm::cast<::mlir::IntegerAttr>(::llvm::cast<::mlir::ArrayAttr>(tblgen_attr)[0]).getInt() <= 8))))) -// CHECK-NEXT: "attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at least 4 and at most 8" +// CHECK-NEXT: attribute 'attr' failed to satisfy constraint: array attribute whose 0-th element must be at least 4 and at most 8" def OpL: NS_Op<"op_for_TCopVTEtAreSameAt", [ PredOpTrait<"operands indexed at 0, 2, 3 should all have " @@ -121,7 +121,7 @@ def OpL: NS_Op<"op_for_TCopVTEtAreSameAt", [ // CHECK: ::llvm::all_equal(::llvm::map_range( // CHECK-SAME: ::mlir::ArrayRef({0, 2, 3}), // CHECK-SAME: [this](unsigned i) { return getElementTypeOrSelf(this->getOperand(i)); })) -// CHECK: "failed to verify that operands indexed at 0, 2, 3 should all have the same type" +// CHECK: failed to verify that operands indexed at 0, 2, 3 should all have the same type" def OpM : NS_Op<"op_for_AnyTensorOf", []> { let arguments = (ins TensorOf<[F32, I32]>:$x); diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp index 4d9b1b2328018..3b10842f2a127 100644 --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -17,6 +17,7 @@ #include "OpGenHelpers.h" #include "mlir/TableGen/Argument.h" #include "mlir/TableGen/Attribute.h" +#include "mlir/TableGen/Builder.h" #include "mlir/TableGen/Class.h" #include "mlir/TableGen/CodeGenHelpers.h" #include "mlir/TableGen/Format.h" @@ -24,16 +25,24 @@ #include "mlir/TableGen/Interfaces.h" #include "mlir/TableGen/Operator.h" #include "mlir/TableGen/Property.h" +#include "mlir/TableGen/Region.h" #include "mlir/TableGen/SideEffects.h" +#include "mlir/TableGen/Successor.h" #include "mlir/TableGen/Trait.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/MapVector.h" +#include "llvm/ADT/PointerUnion.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Sequence.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/CodeGenHelpers.h" @@ -380,9 +389,8 @@ class OpOrAdaptorHelper { Formatter emitErrorPrefix() const { return [this](raw_ostream &os) -> raw_ostream & { if (emitForOp) - return os << "emitOpError("; - return os << formatv("emitError(loc, \"'{0}' op \"", - op.getOperationName()); + return os << "emitOpError(\""; + return os << formatv("emitError(loc, \"'{0}' op ", op.getOperationName()); }; } @@ -940,7 +948,7 @@ genAttributeVerifier(const OpOrAdaptorHelper &emitHelper, FmtContext &ctx, // {4}: Attribute/constraint description. const char *const verifyAttrInline = R"( if ({0} && !({1})) - return {2}"attribute '{3}' failed to satisfy constraint: {4}"); + return {2}attribute '{3}' failed to satisfy constraint: {4}"); )"; // Verify the attribute using a uniqued constraint. Can only be used within // the context of an op. @@ -993,10 +1001,11 @@ while (true) {{ (constraintFn = staticVerifierEmitter.getAttrConstraintFn(attr))) { body << formatv(verifyAttrUnique, *constraintFn, varName, attrName); } else { - body << formatv(verifyAttrInline, varName, - tgfmt(condition, &ctx.withSelf(varName)), - emitHelper.emitErrorPrefix(), attrName, - escapeString(attr.getSummary())); + body << formatv( + verifyAttrInline, varName, tgfmt(condition, &ctx.withSelf(varName)), + emitHelper.emitErrorPrefix(), attrName, + buildErrorStreamingString(attr.getSummary(), ctx.withSelf(varName), + ErrorStreamType::InsideOpError)); } }; @@ -1017,7 +1026,7 @@ while (true) {{ it.first); if (metadata.isRequired) body << formatv( - "if (!tblgen_{0}) return {1}\"requires attribute '{0}'\");\n", + "if (!tblgen_{0}) return {1}requires attribute '{0}'\");\n", it.first, emitHelper.emitErrorPrefix()); } } else { @@ -1099,7 +1108,7 @@ static void genPropertyVerifier( // {3}: Property description. const char *const verifyPropertyInline = R"( if (!({0})) - return {1}"property '{2}' failed to satisfy constraint: {3}"); + return {1}property '{2}' failed to satisfy constraint: {3}"); )"; // Verify the property using a uniqued constraint. Can only be used @@ -1143,9 +1152,12 @@ static void genPropertyVerifier( if (uniquedFn.has_value() && emitHelper.isEmittingForOp()) body << formatv(verifyPropertyUniqued, *uniquedFn, varName, prop.name); else - body << formatv( - verifyPropertyInline, tgfmt(rawCondition, &ctx.withSelf(varName)), - emitHelper.emitErrorPrefix(), prop.name, prop.prop.getSummary()); + body << formatv(verifyPropertyInline, + tgfmt(rawCondition, &ctx.withSelf(varName)), + emitHelper.emitErrorPrefix(), prop.name, + buildErrorStreamingString( + prop.prop.getSummary(), ctx.withSelf(varName), + ErrorStreamType::InsideOpError)); } } diff --git a/mlir/unittests/TableGen/CMakeLists.txt b/mlir/unittests/TableGen/CMakeLists.txt index c51bda6e8d6cc..4d8e508ecdf5b 100644 --- a/mlir/unittests/TableGen/CMakeLists.txt +++ b/mlir/unittests/TableGen/CMakeLists.txt @@ -25,6 +25,6 @@ target_include_directories(MLIRTableGenTests ) target_link_libraries(MLIRTableGenTests - PRIVATE MLIRTableGen MLIRIR + PRIVATE LLVMTableGen MLIRTableGen MLIRIR PUBLIC MLIRTestDialect ) From e30dc12640a21a0c25a4ca60e30fb56a6745a57b Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Thu, 6 Nov 2025 15:25:49 -0800 Subject: [PATCH 64/71] [NFC][Github] Move Container Composite Workflows to .github/actions (#166864) This allows for their reuse inside llvm-zorg. Otherwise we get an error that we cannot use reusable workflows inside job steps because Github thinks that they are reuseable workflows rather than composite actions. This should be NFC inside the monorepo. --- .../build-container/action.yml | 0 .../push-container/action.yml | 0 .github/workflows/build-ci-container-tooling.yml | 16 ++++++++-------- .github/workflows/build-ci-container.yml | 16 ++++++++-------- 4 files changed, 16 insertions(+), 16 deletions(-) rename .github/{workflows => actions}/build-container/action.yml (100%) rename .github/{workflows => actions}/push-container/action.yml (100%) diff --git a/.github/workflows/build-container/action.yml b/.github/actions/build-container/action.yml similarity index 100% rename from .github/workflows/build-container/action.yml rename to .github/actions/build-container/action.yml diff --git a/.github/workflows/push-container/action.yml b/.github/actions/push-container/action.yml similarity index 100% rename from .github/workflows/push-container/action.yml rename to .github/actions/push-container/action.yml diff --git a/.github/workflows/build-ci-container-tooling.yml b/.github/workflows/build-ci-container-tooling.yml index 46dc38fe600a3..0bb8242eb35a9 100644 --- a/.github/workflows/build-ci-container-tooling.yml +++ b/.github/workflows/build-ci-container-tooling.yml @@ -12,16 +12,16 @@ on: - '.github/workflows/containers/github-action-ci-tooling/**' - llvm/utils/git/requirements_formatting.txt - llvm/utils/git/requirements_linting.txt - - '.github/workflows/build-container/**' - - '.github/workflows/push-container/**' + - '.github/actions/build-container/**' + - '.github/actions/push-container/**' pull_request: paths: - .github/workflows/build-ci-container-tooling.yml - '.github/workflows/containers/github-action-ci-tooling/**' - llvm/utils/git/requirements_formatting.txt - llvm/utils/git/requirements_linting.txt - - '.github/workflows/build-container/**' - - '.github/workflows/push-container/**' + - '.github/actions/build-container/**' + - '.github/actions/push-container/**' jobs: build-ci-container-tooling: @@ -45,10 +45,10 @@ jobs: llvm/utils/git/requirements_formatting.txt llvm/utils/git/requirements_linting.txt clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py - .github/workflows/build-container + .github/actions/build-container - name: Build Container - uses: ./.github/workflows/build-container + uses: ./.github/actions/build-container with: container-name: ci-ubuntu-24.04-${{ matrix.container-name }} dockerfile: .github/workflows/containers/github-action-ci-tooling/Dockerfile @@ -67,8 +67,8 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: sparse-checkout: | - .github/workflows/push-container + .github/actions/push-container - - uses: ./.github/workflows/push-container + - uses: ./.github/actions/push-container with: token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-ci-container.yml b/.github/workflows/build-ci-container.yml index 33b4dda2b2980..ddb803fb969ff 100644 --- a/.github/workflows/build-ci-container.yml +++ b/.github/workflows/build-ci-container.yml @@ -10,14 +10,14 @@ on: paths: - .github/workflows/build-ci-container.yml - '.github/workflows/containers/github-action-ci/**' - - '.github/workflows/build-container/**' - - '.github/workflows/push-container/**' + - '.github/actions/build-container/**' + - '.github/actions/push-container/**' pull_request: paths: - .github/workflows/build-ci-container.yml - '.github/workflows/containers/github-action-ci/**' - - '.github/workflows/build-container/**' - - '.github/workflows/push-container/**' + - '.github/actions/build-container/**' + - '.github/actions/push-container/**' jobs: build-ci-container: @@ -40,10 +40,10 @@ jobs: with: sparse-checkout: | .github/workflows/containers/github-action-ci/ - .github/workflows/build-container + .github/actions/build-container - name: Build Container - uses: ./.github/workflows/build-container + uses: ./.github/actions/build-container with: container-name: ci-ubuntu-24.04${{ matrix.container-name && format('-{0}', matrix.container-name)}} context: .github/workflows/containers/github-action-ci/ @@ -65,8 +65,8 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: sparse-checkout: | - .github/workflows/push-container + .github/actions/push-container - - uses: ./.github/workflows/push-container + - uses: ./.github/actions/push-container with: token: ${{ secrets.GITHUB_TOKEN }} From 2fd3bf36806b4cca0bc80f8ceb5978aa9535af02 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 6 Nov 2025 23:39:56 +0000 Subject: [PATCH 65/71] [Github] Update GHA Dependencies (major) (#161108) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/attest-build-provenance](https://redirect.github.com/actions/attest-build-provenance) | action | major | `v1.4.4` -> `v3.0.0` | | [actions/checkout](https://redirect.github.com/actions/checkout) | action | major | `v4.3.0` -> `v5.0.0` | | [actions/github-script](https://redirect.github.com/actions/github-script) | action | major | `v7.1.0` -> `v8.0.0` | | [actions/github-script](https://redirect.github.com/actions/github-script) | action | major | `v6.4.1` -> `v8.0.0` | | [actions/labeler](https://redirect.github.com/actions/labeler) | action | major | `v4.3.0` -> `v6.0.1` | | [actions/setup-node](https://redirect.github.com/actions/setup-node) | action | major | `v4.4.0` -> `v6.0.0` | | [actions/setup-python](https://redirect.github.com/actions/setup-python) | action | major | `v5.6.0` -> `v6.0.0` | | [github/codeql-action](https://redirect.github.com/github/codeql-action) | action | major | `v2.28.1` -> `v4.31.2` | | [github/codeql-action](https://redirect.github.com/github/codeql-action) | action | major | `v3.31.2` -> `v4.31.2` | | [node](https://redirect.github.com/actions/node-versions) | uses-with | major | `18` -> `24` | | [tj-actions/changed-files](https://redirect.github.com/tj-actions/changed-files) | action | major | `v46.0.5` -> `v47.0.0` | --- .github/workflows/check-ci.yml | 2 +- .github/workflows/docs.yml | 4 ++-- .github/workflows/gha-codeql.yml | 4 ++-- .github/workflows/issue-write.yml | 2 +- .github/workflows/libclang-python-tests.yml | 2 +- .github/workflows/llvm-bugs.yml | 6 +++--- .github/workflows/new-prs.yml | 2 +- .github/workflows/pr-code-format.yml | 2 +- .github/workflows/pr-code-lint.yml | 4 ++-- .github/workflows/release-asset-audit.yml | 2 +- .github/workflows/release-binaries.yml | 2 +- .github/workflows/release-documentation.yml | 2 +- .github/workflows/release-doxygen.yml | 2 +- .github/workflows/release-sources.yml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/unprivileged-download-artifact/action.yml | 2 +- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/check-ci.yml b/.github/workflows/check-ci.yml index 6ecad5536109b..7fecb010a64ff 100644 --- a/.github/workflows/check-ci.yml +++ b/.github/workflows/check-ci.yml @@ -26,7 +26,7 @@ jobs: with: sparse-checkout: .ci - name: Setup Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: 3.14 cache: 'pip' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2f9354a798e42..3eb146d21dc40 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -60,7 +60,7 @@ jobs: fetch-depth: 2 - name: Get subprojects that have doc changes id: docs-changed-subprojects - uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5 + uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0 with: skip_initial_fetch: true base_sha: 'HEAD~1' @@ -95,7 +95,7 @@ jobs: workflow: - '.github/workflows/docs.yml' - name: Setup Python env - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: '3.14' cache: 'pip' diff --git a/.github/workflows/gha-codeql.yml b/.github/workflows/gha-codeql.yml index 6d490ca2c4b29..4b9df6b668451 100644 --- a/.github/workflows/gha-codeql.yml +++ b/.github/workflows/gha-codeql.yml @@ -29,9 +29,9 @@ jobs: sparse-checkout: | .github/ - name: Initialize CodeQL - uses: github/codeql-action/init@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2 + uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: languages: actions queries: security-extended - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2 + uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 diff --git a/.github/workflows/issue-write.yml b/.github/workflows/issue-write.yml index 26cd60c070251..8a083f9143ec6 100644 --- a/.github/workflows/issue-write.yml +++ b/.github/workflows/issue-write.yml @@ -40,7 +40,7 @@ jobs: - name: 'Comment on PR' if: steps.download-artifact.outputs.artifact-id != '' - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/libclang-python-tests.yml b/.github/workflows/libclang-python-tests.yml index 8fb8cec3b4f00..0d66f5d595e0e 100644 --- a/.github/workflows/libclang-python-tests.yml +++ b/.github/workflows/libclang-python-tests.yml @@ -34,7 +34,7 @@ jobs: steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: ${{ matrix.python-version }} - name: Setup ccache diff --git a/.github/workflows/llvm-bugs.yml b/.github/workflows/llvm-bugs.yml index 3274f1adf9e61..96fc553abfe35 100644 --- a/.github/workflows/llvm-bugs.yml +++ b/.github/workflows/llvm-bugs.yml @@ -14,13 +14,13 @@ jobs: runs-on: ubuntu-24.04 if: github.repository == 'llvm/llvm-project' steps: - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: - node-version: 18 + node-version: 24 check-latest: true - run: npm install mailgun.js form-data - name: Send notification - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: MAILGUN_API_KEY: ${{ secrets.LLVM_BUGS_KEY }} with: diff --git a/.github/workflows/new-prs.yml b/.github/workflows/new-prs.yml index e1f2e754c1a3d..dc8cd100f3e68 100644 --- a/.github/workflows/new-prs.yml +++ b/.github/workflows/new-prs.yml @@ -67,7 +67,7 @@ jobs: github.event.pull_request.draft == false && github.event.pull_request.commits < 10 steps: - - uses: actions/labeler@ac9175f8a1f3625fd0d4fb234536d26811351594 # v4.3.0 + - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 with: configuration-path: .github/new-prs-labeler.yml # workaround for https://github.com/actions/labeler/issues/112 diff --git a/.github/workflows/pr-code-format.yml b/.github/workflows/pr-code-format.yml index 029325c51d41f..dc253e4fbae98 100644 --- a/.github/workflows/pr-code-format.yml +++ b/.github/workflows/pr-code-format.yml @@ -27,7 +27,7 @@ jobs: - name: Get changed files id: changed-files - uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5 + uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0 with: separator: "," skip_initial_fetch: true diff --git a/.github/workflows/pr-code-lint.yml b/.github/workflows/pr-code-lint.yml index 3cb564feb255b..5444a29c22205 100644 --- a/.github/workflows/pr-code-lint.yml +++ b/.github/workflows/pr-code-lint.yml @@ -27,13 +27,13 @@ jobs: cancel-in-progress: true steps: - name: Fetch LLVM sources - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 2 - name: Get changed files id: changed-files - uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5 + uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0 with: separator: "," skip_initial_fetch: true diff --git a/.github/workflows/release-asset-audit.yml b/.github/workflows/release-asset-audit.yml index 8b24948b568eb..b658167d1db36 100644 --- a/.github/workflows/release-asset-audit.yml +++ b/.github/workflows/release-asset-audit.yml @@ -38,7 +38,7 @@ jobs: if: >- github.event_name != 'pull_request' && failure() - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.ISSUE_SUBSCRIBER_TOKEN }} script: | diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 9263754aa021a..a4a462ae6737c 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -270,7 +270,7 @@ jobs: - name: Attest Build Provenance id: provenance - uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 # v1.4.4 + uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0 with: subject-path: ${{ needs.prepare.outputs.release-binary-filename }} diff --git a/.github/workflows/release-documentation.yml b/.github/workflows/release-documentation.yml index 9b77112e9bddb..c09ad57066711 100644 --- a/.github/workflows/release-documentation.yml +++ b/.github/workflows/release-documentation.yml @@ -41,7 +41,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup Python env - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: cache: 'pip' cache-dependency-path: './llvm/docs/requirements.txt' diff --git a/.github/workflows/release-doxygen.yml b/.github/workflows/release-doxygen.yml index 79e509e5e6a8b..c31319e47833d 100644 --- a/.github/workflows/release-doxygen.yml +++ b/.github/workflows/release-doxygen.yml @@ -43,7 +43,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup Python env - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: cache: 'pip' cache-dependency-path: './llvm/docs/requirements.txt' diff --git a/.github/workflows/release-sources.yml b/.github/workflows/release-sources.yml index 70323c276c18d..4c47bd7575d99 100644 --- a/.github/workflows/release-sources.yml +++ b/.github/workflows/release-sources.yml @@ -92,7 +92,7 @@ jobs: - name: Attest Build Provenance if: github.event_name != 'pull_request' id: provenance - uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 # v1.4.4 + uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0 with: subject-path: "*.xz" - if: github.event_name != 'pull_request' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 084511935fa27..05a6d98a81bad 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -57,6 +57,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@b8d3b6e8af63cde30bdc382c0bc28114f4346c88 # v2.28.1 + uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: sarif_file: results.sarif diff --git a/.github/workflows/unprivileged-download-artifact/action.yml b/.github/workflows/unprivileged-download-artifact/action.yml index 5b50d7ce3d3fb..72815b26bcf41 100644 --- a/.github/workflows/unprivileged-download-artifact/action.yml +++ b/.github/workflows/unprivileged-download-artifact/action.yml @@ -27,7 +27,7 @@ outputs: runs: using: "composite" steps: - - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 id: artifact-url with: script: | From 32ebf635c2be171b01a288b00b3e64b8de72e61a Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Thu, 6 Nov 2025 15:56:11 -0800 Subject: [PATCH 66/71] [LLDB] Fix debuginfo ELF files overwriting Unified Section List (#166635) Recently I've been deep diving ELF cores in LLDB, aspiring to move LLDB closer to GDB in capability. One issue I encountered was a system lib losing it's unwind plan when loading the debuginfo. The reason for this was the debuginfo has the eh_frame section stripped and the main executable did not. The root cause of this was this line in [ObjectFileElf](https://github.com/llvm/llvm-project/blob/163933e9e7099f352ff8df1973f9a9c3d7def6c5/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp#L1972) ``` // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the // unified section list. if (GetType() != eTypeDebugInfo) unified_section_list = *m_sections_up; ``` This would always be executed because CalculateType can never return an eTypeDebugInfo ``` ObjectFile::Type ObjectFileELF::CalculateType() { switch (m_header.e_type) { case llvm::ELF::ET_NONE: // 0 - No file type return eTypeUnknown; case llvm::ELF::ET_REL: // 1 - Relocatable file return eTypeObjectFile; case llvm::ELF::ET_EXEC: // 2 - Executable file return eTypeExecutable; case llvm::ELF::ET_DYN: // 3 - Shared object file return eTypeSharedLibrary; case ET_CORE: // 4 - Core file return eTypeCoreFile; default: break; } return eTypeUnknown; } ``` This makes sense as there isn't a explicit sh_type to denote that this file is a debuginfo. After some discussion with @clayborg and @GeorgeHuyubo we settled on joining the exciting unified section list with whatever new sections were being added. Adding each new unique section, or taking the section with the maximum file size. We picked this strategy to pick the section with the most information. In most scenarios, LHS should be SHT_NOBITS and RHS would be SHT_PROGBITS. Here is a diagram documenting the existing vs proposed new way. image --- lldb/include/lldb/Core/Section.h | 13 + lldb/source/Core/Section.cpp | 29 ++ .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 31 +- .../python_api/unified_section_list/Makefile | 5 + .../TestModuleUnifiedSectionList.py | 285 ++++++++++++++++++ .../python_api/unified_section_list/main.cpp | 3 + .../main.largercomment.yaml | 46 +++ .../unified_section_list/main.largertext.yaml | 46 +++ .../main.reversedtext.yaml | 45 +++ .../python_api/unified_section_list/main.yaml | 45 +++ 10 files changed, 544 insertions(+), 4 deletions(-) create mode 100644 lldb/test/API/python_api/unified_section_list/Makefile create mode 100644 lldb/test/API/python_api/unified_section_list/TestModuleUnifiedSectionList.py create mode 100644 lldb/test/API/python_api/unified_section_list/main.cpp create mode 100644 lldb/test/API/python_api/unified_section_list/main.largercomment.yaml create mode 100644 lldb/test/API/python_api/unified_section_list/main.largertext.yaml create mode 100644 lldb/test/API/python_api/unified_section_list/main.reversedtext.yaml create mode 100644 lldb/test/API/python_api/unified_section_list/main.yaml diff --git a/lldb/include/lldb/Core/Section.h b/lldb/include/lldb/Core/Section.h index d0f10cc342780..3c5586c489da5 100644 --- a/lldb/include/lldb/Core/Section.h +++ b/lldb/include/lldb/Core/Section.h @@ -46,6 +46,8 @@ class SectionList { /// Create an empty list. SectionList() = default; + SectionList(const SectionList &lhs); + SectionList &operator=(const SectionList &rhs); size_t AddSection(const lldb::SectionSP §ion_sp); @@ -96,6 +98,17 @@ class SectionList { /// information. uint64_t GetDebugInfoSize() const; + // Callback to decide which of two matching sections should be used in the + // merged output. + using MergeCallback = + std::function; + + // Function that merges two different sections into a new output list. All + // unique sections will be checked for conflict and resolved using the + // supplied merging callback. + static SectionList Merge(SectionList &lhs, SectionList &rhs, + MergeCallback filter); + protected: collection m_sections; }; diff --git a/lldb/source/Core/Section.cpp b/lldb/source/Core/Section.cpp index d3f753e53b7fa..f16035b5649e1 100644 --- a/lldb/source/Core/Section.cpp +++ b/lldb/source/Core/Section.cpp @@ -477,6 +477,8 @@ bool Section::IsGOTSection() const { #pragma mark SectionList +SectionList::SectionList(const SectionList &rhs) : m_sections(rhs.m_sections) {} + SectionList &SectionList::operator=(const SectionList &rhs) { if (this != &rhs) m_sections = rhs.m_sections; @@ -687,6 +689,33 @@ uint64_t SectionList::GetDebugInfoSize() const { return debug_info_size; } +SectionList SectionList::Merge(SectionList &lhs, SectionList &rhs, + MergeCallback filter) { + SectionList output_list; + + // Iterate through all the sections in lhs and see if we have matches in + // the rhs list. + for (const auto &lhs_section : lhs) { + auto rhs_section = rhs.FindSectionByName(lhs_section->GetName()); + if (rhs_section) + output_list.AddSection(filter(lhs_section, rhs_section)); + else + output_list.AddSection(lhs_section); + } + + // Now that we've visited all possible duplicates, we can iterate over + // the rhs and take any values not in lhs. + for (const auto &rhs_section : rhs) { + auto lhs_section = lhs.FindSectionByName(rhs_section->GetName()); + // Because we already visited everything overlapping between rhs + // and lhs, any section not in lhs is unique and can be output. + if (!lhs_section) + output_list.AddSection(rhs_section); + } + + return output_list; +} + namespace llvm { namespace json { diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index e06e69fb08305..3968715a6d215 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -130,6 +130,29 @@ class ELFRelocation { RelocUnion reloc; }; + +lldb::SectionSP MergeSections(lldb::SectionSP lhs, lldb::SectionSP rhs) { + assert(lhs && rhs); + + lldb::ModuleSP lhs_module_parent = lhs->GetModule(); + lldb::ModuleSP rhs_module_parent = rhs->GetModule(); + assert(lhs_module_parent && rhs_module_parent); + + // Do a sanity check, these should be the same. + if (lhs->GetFileAddress() != rhs->GetFileAddress()) + lhs_module_parent->ReportWarning( + "Mismatch addresses for section {0} when " + "merging with {1}, expected: {2:x}, " + "actual: {3:x}", + lhs->GetTypeAsCString(), + rhs_module_parent->GetFileSpec().GetPathAsConstString().GetCString(), + lhs->GetByteSize(), rhs->GetByteSize()); + + // We want to take the greater of two sections. If LHS and RHS are both + // SHT_NOBITS, we should default to LHS. If RHS has a bigger section, + // indicating it has data that wasn't stripped, we should take that instead. + return rhs->GetFileSize() > lhs->GetFileSize() ? rhs : lhs; +} } // end anonymous namespace ELFRelocation::ELFRelocation(unsigned type) { @@ -1967,10 +1990,10 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) { provider.AddSection(std::move(*InfoOr), std::move(section_sp)); } - // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the - // unified section list. - if (GetType() != eTypeDebugInfo) - unified_section_list = *m_sections_up; + // Merge the two adding any new sections, and overwriting any existing + // sections that are SHT_NOBITS + unified_section_list = + SectionList::Merge(unified_section_list, *m_sections_up, MergeSections); // If there's a .gnu_debugdata section, we'll try to read the .symtab that's // embedded in there and replace the one in the original object file (if any). diff --git a/lldb/test/API/python_api/unified_section_list/Makefile b/lldb/test/API/python_api/unified_section_list/Makefile new file mode 100644 index 0000000000000..431e716ab8f69 --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/Makefile @@ -0,0 +1,5 @@ +CXX_SOURCES := main.cpp + +SPLIT_DEBUG_SYMBOLS := YES + +include Makefile.rules diff --git a/lldb/test/API/python_api/unified_section_list/TestModuleUnifiedSectionList.py b/lldb/test/API/python_api/unified_section_list/TestModuleUnifiedSectionList.py new file mode 100644 index 0000000000000..93b23d0ba81cb --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/TestModuleUnifiedSectionList.py @@ -0,0 +1,285 @@ +""" +Test Unified Section List merging. +""" + +import os +import shutil + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil +from lldbsuite.test.lldbutil import symbol_type_to_str + + +class ModuleUnifiedSectionList(TestBase): + @skipUnlessPlatform(["linux", "freebsd", "netbsd"]) + def test_unified_section_list(self): + self.build() + exe = self.getBuildArtifact("a.out") + debug_info = self.getBuildArtifact("a.out.debug") + new_dir = os.path.join(os.path.dirname(debug_info), "new_dir") + os.mkdir(new_dir) + renamed_debug_info = os.path.join(new_dir, "renamed.debug") + os.rename(debug_info, renamed_debug_info) + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + self.assertGreater(target.GetNumModules(), 0) + + main_exe_module = target.GetModuleAtIndex(0) + eh_frame = main_exe_module.FindSection(".eh_frame") + self.assertTrue(eh_frame.IsValid()) + self.assertGreater(eh_frame.size, 0) + + # Should be stripped in main executable. + debug_info_section = main_exe_module.FindSection(".debug_info") + self.assertFalse(debug_info_section.IsValid()) + + ci = self.dbg.GetCommandInterpreter() + res = lldb.SBCommandReturnObject() + ci.HandleCommand(f"target symbols add {renamed_debug_info}", res) + self.assertTrue(res.Succeeded()) + + # Should be stripped in .debuginfo but be present in main executable. + main_exe_module = target.GetModuleAtIndex(0) + eh_frame = main_exe_module.FindSection(".eh_frame") + self.assertTrue(eh_frame.IsValid()) + self.assertGreater(eh_frame.size, 0) + + # Should be unified and both sections should have contents. + debug_info_section = main_exe_module.FindSection(".debug_info") + self.assertTrue(debug_info_section.IsValid()) + self.assertGreater(debug_info_section.file_size, 0) + + def test_unified_section_list_overwrite_larger_section(self): + """ + Test the merging of an ELF file with another ELF File where all the new sections are bigger, validating we + overwrite .comment from SHT_NOBITS to the new SHT_PROGBITS section and the smaller .text with the larger + .text + """ + exe = self.getBuildArtifact("a.out") + self.yaml2obj("main.yaml", exe) + + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + main_exe_module = target.GetModuleAtIndex(0) + + # First we verify out .text section is the expected BEC0FFEE + text_before_merge = main_exe_module.FindSection(".text") + self.assertTrue(text_before_merge.IsValid()) + error = lldb.SBError() + section_content = text_before_merge.data.ReadRawData( + error, 0, text_before_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content, bytes.fromhex("BEC0FFEE")) + + # .comment in main.yaml should be SHT_NOBITS, and size 0 + comment_before_merge = main_exe_module.FindSection(".comment") + self.assertTrue(comment_before_merge.IsValid()) + self.assertEqual(comment_before_merge.data.size, 0) + + # yamlize the main.largertext.yaml and force symbol loading + debug_info = self.getBuildArtifact("a.out.debug") + self.yaml2obj("main.largertext.yaml", debug_info) + + ci = self.dbg.GetCommandInterpreter() + res = lldb.SBCommandReturnObject() + ci.HandleCommand(f"target symbols add {debug_info}", res) + self.assertTrue(res.Succeeded()) + + # verify we took the larger .text section + main_exe_module_after_merge = target.GetModuleAtIndex(0) + text_after_merge = main_exe_module_after_merge.FindSection(".text") + self.assertTrue(text_after_merge.IsValid()) + self.assertGreater(text_after_merge.data.size, text_before_merge.data.size) + section_content_after_merge = text_after_merge.data.ReadRawData( + error, 0, text_after_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content_after_merge, bytes.fromhex("BEC0FFEEEEFF0CEB")) + + # in main.largertext.yaml comment is not SHT_NOBITS, and so we should see + # the size > 0 and equal to BAADF00D + comment_after_merge = main_exe_module_after_merge.FindSection(".comment") + self.assertTrue(comment_after_merge.IsValid()) + comment_content_after_merge = comment_after_merge.data.ReadRawData( + error, 0, comment_after_merge.data.size + ) + + self.assertTrue(error.Success()) + self.assertEqual(comment_content_after_merge, bytes.fromhex("BAADF00D")) + + def test_unified_section_list_overwrite_smaller_section(self): + """ + Test the merging of an ELF file with another ELF File where all the existing sections are bigger, validating we don't + overwrite with the SHT_NOBITS for .comment or the smaller .text section. + """ + exe = self.getBuildArtifact("a.out") + self.yaml2obj("main.largertext.yaml", exe) + + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + main_exe_module = target.GetModuleAtIndex(0) + + # Same as above test but inverse, verify our larger .text section + # is the expected BEC0FFEE palindrome + text_before_merge = main_exe_module.FindSection(".text") + self.assertTrue(text_before_merge.IsValid()) + error = lldb.SBError() + section_content = text_before_merge.data.ReadRawData( + error, 0, text_before_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content, bytes.fromhex("BEC0FFEEEEFF0CEB")) + + # Comment is SHT_PROGBITS on the larger yaml and should remain + # the same after merge. + comment_before_merge = main_exe_module.FindSection(".comment") + self.assertTrue(comment_before_merge.IsValid()) + comment_content = comment_before_merge.data.ReadRawData( + error, 0, comment_before_merge.data.size + ) + + self.assertTrue(error.Success()) + self.assertEqual(comment_content, bytes.fromhex("BAADF00D")) + + debug_info = self.getBuildArtifact("a.out.debug") + self.yaml2obj("main.yaml", debug_info) + + ci = self.dbg.GetCommandInterpreter() + res = lldb.SBCommandReturnObject() + ci.HandleCommand(f"target symbols add {debug_info}", res) + self.assertTrue(res.Succeeded()) + + # Verify we didn't replace the sections after merge.s + main_exe_module_after_merge = target.GetModuleAtIndex(0) + text_after_merge = main_exe_module_after_merge.FindSection(".text") + self.assertTrue(text_after_merge.IsValid()) + self.assertEqual(text_after_merge.data.size, text_before_merge.data.size) + section_content_after_merge = text_after_merge.data.ReadRawData( + error, 0, text_after_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content_after_merge, bytes.fromhex("BEC0FFEEEEFF0CEB")) + + comment_after_merge = main_exe_module_after_merge.FindSection(".comment") + self.assertTrue(comment_after_merge.IsValid()) + comment_content_after_merge = comment_after_merge.data.ReadRawData( + error, 0, comment_after_merge.data.size + ) + + self.assertTrue(error.Success()) + self.assertEqual(comment_content_after_merge, bytes.fromhex("BAADF00D")) + + def test_unified_section_list_overwrite_mixed_merge(self): + """ + Test the merging of an ELF file with another ELF File where the lhs has a larger .comment section + and the RHS has a larger .text section. + """ + exe = self.getBuildArtifact("a.out") + self.yaml2obj("main.largercomment.yaml", exe) + + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + main_exe_module = target.GetModuleAtIndex(0) + + # Verify we have the expected smaller BEC0FFEE + text_before_merge = main_exe_module.FindSection(".text") + self.assertTrue(text_before_merge.IsValid()) + error = lldb.SBError() + section_content = text_before_merge.data.ReadRawData( + error, 0, text_before_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content, bytes.fromhex("BEC0FFEE")) + + # Verify we have the larger palindromic comment + comment_before_merge = main_exe_module.FindSection(".comment") + self.assertTrue(comment_before_merge.IsValid()) + comment_content = comment_before_merge.data.ReadRawData( + error, 0, comment_before_merge.data.size + ) + + self.assertTrue(error.Success()) + self.assertEqual(comment_content, bytes.fromhex("BAADF00DF00DBAAD")) + + debug_info = self.getBuildArtifact("a.out.debug") + self.yaml2obj("main.largertext.yaml", debug_info) + + ci = self.dbg.GetCommandInterpreter() + res = lldb.SBCommandReturnObject() + ci.HandleCommand(f"target symbols add {debug_info}", res) + self.assertTrue(res.Succeeded()) + + # Verify we replaced .text + main_exe_module_after_merge = target.GetModuleAtIndex(0) + text_after_merge = main_exe_module_after_merge.FindSection(".text") + self.assertTrue(text_after_merge.IsValid()) + section_content_after_merge = text_after_merge.data.ReadRawData( + error, 0, text_after_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content_after_merge, bytes.fromhex("BEC0FFEEEEFF0CEB")) + + # Verify .comment is still the same. + comment_after_merge = main_exe_module_after_merge.FindSection(".comment") + self.assertTrue(comment_after_merge.IsValid()) + comment_content_after_merge = comment_after_merge.data.ReadRawData( + error, 0, comment_after_merge.data.size + ) + + self.assertTrue(error.Success()) + self.assertEqual(comment_content_after_merge, bytes.fromhex("BAADF00DF00DBAAD")) + + def test_unified_section_list_overwrite_equal_size(self): + """ + Test the merging of an ELF file with an ELF file with sections of the same size with different values + .text + """ + exe = self.getBuildArtifact("a.out") + self.yaml2obj("main.yaml", exe) + + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + main_exe_module = target.GetModuleAtIndex(0) + + # First we verify out .text section is the expected BEC0FFEE + text_before_merge = main_exe_module.FindSection(".text") + self.assertTrue(text_before_merge.IsValid()) + error = lldb.SBError() + section_content = text_before_merge.data.ReadRawData( + error, 0, text_before_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content, bytes.fromhex("BEC0FFEE")) + + # .comment in main.yaml should be SHT_NOBITS, and size 0 + comment_before_merge = main_exe_module.FindSection(".comment") + self.assertTrue(comment_before_merge.IsValid()) + self.assertEqual(comment_before_merge.data.size, 0) + + # yamlize the main with the .text reversed from BEC0FFEE + # to EEFF0CEB. We should still keep our .text with BEC0FFEE + debug_info = self.getBuildArtifact("a.out.debug") + self.yaml2obj("main.reversedtext.yaml", debug_info) + + ci = self.dbg.GetCommandInterpreter() + res = lldb.SBCommandReturnObject() + ci.HandleCommand(f"target symbols add {debug_info}", res) + self.assertTrue(res.Succeeded()) + + # verify .text did not change + main_exe_module_after_merge = target.GetModuleAtIndex(0) + text_after_merge = main_exe_module_after_merge.FindSection(".text") + self.assertTrue(text_after_merge.IsValid()) + section_content_after_merge = text_after_merge.data.ReadRawData( + error, 0, text_after_merge.data.size + ) + self.assertTrue(error.Success()) + self.assertEqual(section_content_after_merge, bytes.fromhex("BEC0FFEE")) + + # verify comment did not change + comment_afer_merge = main_exe_module_after_merge.FindSection(".comment") + self.assertTrue(comment_afer_merge.IsValid()) + self.assertEqual(comment_afer_merge.data.size, 0) diff --git a/lldb/test/API/python_api/unified_section_list/main.cpp b/lldb/test/API/python_api/unified_section_list/main.cpp new file mode 100644 index 0000000000000..45fd52eeeb303 --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/main.cpp @@ -0,0 +1,3 @@ +#include + +int main() { printf("Hello World\n"); } diff --git a/lldb/test/API/python_api/unified_section_list/main.largercomment.yaml b/lldb/test/API/python_api/unified_section_list/main.largercomment.yaml new file mode 100644 index 0000000000000..f7860063e151a --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/main.largercomment.yaml @@ -0,0 +1,46 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x1040 +ProgramHeaders: + - Type: PT_PHDR + Flags: [ PF_R ] + VAddr: 0x40 + Align: 0x8 + Offset: 0x40 + - Type: PT_LOAD + Flags: [ PF_R ] + FirstSec: .text + LastSec: .fini + Align: 0x1000 + Offset: 0x0 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1040 + AddressAlign: 0x10 + Content: BEC0FFEE + - Name: .fini + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1140 + AddressAlign: 0x4 + Content: DEADBEEF + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Address: 0x3140 + AddressAlign: 0x4 + Content: BAADF00DF00DBAAD +Symbols: + - Name: main + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + Value: 0x1130 + Size: 0xF +... diff --git a/lldb/test/API/python_api/unified_section_list/main.largertext.yaml b/lldb/test/API/python_api/unified_section_list/main.largertext.yaml new file mode 100644 index 0000000000000..6450e6769db69 --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/main.largertext.yaml @@ -0,0 +1,46 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x1040 +ProgramHeaders: + - Type: PT_PHDR + Flags: [ PF_R ] + VAddr: 0x40 + Align: 0x8 + Offset: 0x40 + - Type: PT_LOAD + Flags: [ PF_R ] + FirstSec: .text + LastSec: .fini + Align: 0x1000 + Offset: 0x0 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1040 + AddressAlign: 0x10 + Content: BEC0FFEEEEFF0CEB + - Name: .fini + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1140 + AddressAlign: 0x4 + Content: DEADBEEF + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Address: 0x3140 + AddressAlign: 0x4 + Content: BAADF00D +Symbols: + - Name: main + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + Value: 0x1130 + Size: 0xF +... diff --git a/lldb/test/API/python_api/unified_section_list/main.reversedtext.yaml b/lldb/test/API/python_api/unified_section_list/main.reversedtext.yaml new file mode 100644 index 0000000000000..57206666046a4 --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/main.reversedtext.yaml @@ -0,0 +1,45 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x1040 +ProgramHeaders: + - Type: PT_PHDR + Flags: [ PF_R ] + VAddr: 0x40 + Align: 0x8 + Offset: 0x40 + - Type: PT_LOAD + Flags: [ PF_R ] + FirstSec: .text + LastSec: .fini + Align: 0x1000 + Offset: 0x0 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1040 + AddressAlign: 0x10 + Content: BEC0FFEE + - Name: .fini + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1140 + AddressAlign: 0x4 + Content: DEADBEEF + - Name: .comment + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + Address: 0x3140 + AddressAlign: 0x4 +Symbols: + - Name: main + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + Value: 0x1130 + Size: 0xF +... diff --git a/lldb/test/API/python_api/unified_section_list/main.yaml b/lldb/test/API/python_api/unified_section_list/main.yaml new file mode 100644 index 0000000000000..57206666046a4 --- /dev/null +++ b/lldb/test/API/python_api/unified_section_list/main.yaml @@ -0,0 +1,45 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x1040 +ProgramHeaders: + - Type: PT_PHDR + Flags: [ PF_R ] + VAddr: 0x40 + Align: 0x8 + Offset: 0x40 + - Type: PT_LOAD + Flags: [ PF_R ] + FirstSec: .text + LastSec: .fini + Align: 0x1000 + Offset: 0x0 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1040 + AddressAlign: 0x10 + Content: BEC0FFEE + - Name: .fini + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1140 + AddressAlign: 0x4 + Content: DEADBEEF + - Name: .comment + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + Address: 0x3140 + AddressAlign: 0x4 +Symbols: + - Name: main + Type: STT_FUNC + Section: .text + Binding: STB_GLOBAL + Value: 0x1130 + Size: 0xF +... From 995b0f1883b2199432b419a388a95248d3baf9dc Mon Sep 17 00:00:00 2001 From: Alex Voicu Date: Fri, 7 Nov 2025 01:59:36 +0200 Subject: [PATCH 67/71] [SPIRV] Handle `inttoptr` constant expressions in global initialisers (#166494) `inttoptr` usage in global initialisers is valid, and rather common when it comes to the machinery around vtables (construction vtables are particularly fond). This was not handled by the BE, even though SPIR-V allows forming `SpecConstantOp`s with the `OpConvertUToPtr` opcode, which is what these would map to. We augment instruction selection to address this. --- llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp | 6 ++- .../Target/SPIRV/SPIRVInstructionSelector.cpp | 15 ++++-- llvm/test/CodeGen/SPIRV/ComparePointers.ll | 2 +- llvm/test/CodeGen/SPIRV/complex-constexpr.ll | 2 +- .../transcoding/ConvertPtrInGlobalInit.ll | 49 +++++++++++++++++++ 5 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 llvm/test/CodeGen/SPIRV/transcoding/ConvertPtrInGlobalInit.ll diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp index a151fd2fbdb7a..599cc35ca2e9d 100644 --- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp @@ -767,6 +767,8 @@ Type *SPIRVEmitIntrinsics::deduceElementTypeHelper( Type *RefTy = deduceElementTypeHelper(Ref->getPointerOperand(), Visited, UnknownElemTypeI8); maybeAssignPtrType(Ty, I, RefTy, UnknownElemTypeI8); + } else if (auto *Ref = dyn_cast(I)) { + maybeAssignPtrType(Ty, I, Ref->getDestTy(), UnknownElemTypeI8); } else if (auto *Ref = dyn_cast(I)) { if (Type *Src = Ref->getSrcTy(), *Dest = Ref->getDestTy(); isPointerTy(Src) && isPointerTy(Dest)) @@ -2149,7 +2151,9 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I, for (const auto &Op : I->operands()) { if (isa(Op) || isa(Op) || // Check GetElementPtrConstantExpr case. - (isa(Op) && isa(Op))) { + (isa(Op) && + (isa(Op) || + (cast(Op)->getOpcode() == CastInst::IntToPtr)))) { setInsertPointSkippingPhis(B, I); Type *OpTy = Op->getType(); if (isa(Op) && OpTy->isAggregateType()) { diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 245e5a2894604..fc87288a4a212 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -1210,8 +1210,16 @@ bool SPIRVInstructionSelector::selectUnOp(Register ResVReg, for (MachineRegisterInfo::def_instr_iterator DefIt = MRI->def_instr_begin(SrcReg); DefIt != MRI->def_instr_end(); DefIt = std::next(DefIt)) { - if ((*DefIt).getOpcode() == TargetOpcode::G_GLOBAL_VALUE || - (*DefIt).getOpcode() == SPIRV::OpVariable) { + unsigned DefOpCode = DefIt->getOpcode(); + if (DefOpCode == SPIRV::ASSIGN_TYPE) { + // We need special handling to look through the type assignment and see + // if this is a constant or a global + if (auto *VRD = getVRegDef(*MRI, DefIt->getOperand(1).getReg())) + DefOpCode = VRD->getOpcode(); + } + if (DefOpCode == TargetOpcode::G_GLOBAL_VALUE || + DefOpCode == TargetOpcode::G_CONSTANT || + DefOpCode == SPIRV::OpVariable || DefOpCode == SPIRV::OpConstantI) { IsGV = true; break; } @@ -3099,9 +3107,10 @@ bool SPIRVInstructionSelector::wrapIntoSpecConstantOp( SmallPtrSet Visited; if (!OpDefine || !OpType || isConstReg(MRI, OpDefine, Visited) || OpDefine->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST || + OpDefine->getOpcode() == TargetOpcode::G_INTTOPTR || GR.isAggregateType(OpType)) { // The case of G_ADDRSPACE_CAST inside spv_const_composite() is processed - // by selectAddrSpaceCast() + // by selectAddrSpaceCast(), and G_INTTOPTR is processed by selectUnOp() CompositeArgs.push_back(OpReg); continue; } diff --git a/llvm/test/CodeGen/SPIRV/ComparePointers.ll b/llvm/test/CodeGen/SPIRV/ComparePointers.ll index 408b95579502e..bc1514e145cb5 100644 --- a/llvm/test/CodeGen/SPIRV/ComparePointers.ll +++ b/llvm/test/CodeGen/SPIRV/ComparePointers.ll @@ -12,7 +12,7 @@ ;; return; ;; } -; CHECK-SPIRV: OpConvertPtrToU +; CHECK-SPIRV: OpSpecConstantOp %[[#]] ConvertPtrToU ; CHECK-SPIRV: OpConvertPtrToU ; CHECK-SPIRV: OpINotEqual ; CHECK-SPIRV: OpConvertPtrToU diff --git a/llvm/test/CodeGen/SPIRV/complex-constexpr.ll b/llvm/test/CodeGen/SPIRV/complex-constexpr.ll index e2c1d00ba4c0e..a97a124ad2c65 100644 --- a/llvm/test/CodeGen/SPIRV/complex-constexpr.ll +++ b/llvm/test/CodeGen/SPIRV/complex-constexpr.ll @@ -6,7 +6,7 @@ define linkonce_odr hidden spir_func void @test() { entry: ; CHECK: %[[#MinusOne:]] = OpConstant %[[#]] 18446744073709551615 -; CHECK: %[[#Ptr:]] = OpConvertUToPtr %[[#]] %[[#MinusOne]] +; CHECK: %[[#Ptr:]] = OpSpecConstantOp %[[#]] ConvertUToPtr %[[#MinusOne]] ; CHECK: %[[#PtrCast:]] = OpPtrCastToGeneric %[[#]] %[[#]] ; CHECK: %[[#]] = OpFunctionCall %[[#]] %[[#]] %[[#PtrCast]] %[[#Ptr]] diff --git a/llvm/test/CodeGen/SPIRV/transcoding/ConvertPtrInGlobalInit.ll b/llvm/test/CodeGen/SPIRV/transcoding/ConvertPtrInGlobalInit.ll new file mode 100644 index 0000000000000..f397030c7bdb1 --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/transcoding/ConvertPtrInGlobalInit.ll @@ -0,0 +1,49 @@ +; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +; CHECK: %[[Int8Ty:[0-9]+]] = OpTypeInt 8 0 +; CHECK: %[[Int8PtrTy:[0-9]+]] = OpTypePointer Generic %[[Int8Ty]] +; CHECK-DAG: %[[GlobInt8PtrTy:[0-9]+]] = OpTypePointer CrossWorkgroup %[[Int8Ty]] +; CHECK: %[[GlobInt8PtrPtrTy:[0-9]+]] = OpTypePointer CrossWorkgroup %[[GlobInt8PtrTy]] +; CHECK: %[[Int8PtrGlobPtrPtrTy:[0-9]+]] = OpTypePointer Generic %[[GlobInt8PtrPtrTy]] +; CHECK: %[[Int32Ty:[0-9]+]] = OpTypeInt 32 0 +; CHECK: %[[Const5:[0-9]+]] = OpConstant %[[Int32Ty]] 5 +; CHECK: %[[ArrTy:[0-9]+]] = OpTypeArray %[[GlobInt8PtrTy]] %[[Const5]] +; CHECK: %[[VtblTy:[0-9]+]] = OpTypeStruct %[[ArrTy]] %[[ArrTy]] %[[ArrTy]] %[[ArrTy]] %[[ArrTy]] +; CHECK: %[[Int64Ty:[0-9]+]] = OpTypeInt 64 0 +; CHECK: %[[GlobVtblPtrTy:[0-9]+]] = OpTypePointer CrossWorkgroup %[[VtblTy]] +; CHECK: %[[ConstMinus184:[0-9]+]] = OpConstant %[[Int64Ty]] 18446744073709551432 +; CHECK: %[[ConstMinus16:[0-9]+]] = OpConstant %[[Int64Ty]] 18446744073709551600 +; CHECK: %[[Const168:[0-9]+]] = OpConstant %[[Int64Ty]] 168 +; CHECK: %[[Nullptr:[0-9]+]] = OpConstantNull %[[GlobInt8PtrTy]] +; CHECK: %[[Const184:[0-9]+]] = OpConstant %[[Int64Ty]] 184 +; CHECK: %[[Const184toPtr:[0-9]+]] = OpSpecConstantOp %[[GlobInt8PtrTy]] ConvertUToPtr %[[Const184]] +; CHECK: %[[Const168toPtr:[0-9]+]] = OpSpecConstantOp %[[GlobInt8PtrTy]] ConvertUToPtr %[[Const168]] +; CHECK: %[[ConstMinus16toPtr:[0-9]+]] = OpSpecConstantOp %[[GlobInt8PtrTy]] ConvertUToPtr %[[ConstMinus16]] +; CHECK: %[[ConstMinus184toPtr:[0-9]+]] = OpSpecConstantOp %[[GlobInt8PtrTy]] ConvertUToPtr %[[ConstMinus184]] +; CHECK: %[[Vtbl012:[0-9]+]] = OpConstantComposite %[[ArrTy]] %[[Const184toPtr]] %[[Nullptr]] %[[Nullptr]] %[[Nullptr]] %[[Nullptr]] +; CHECK: %[[Vtbl3:[0-9]+]] = OpConstantComposite %[[ArrTy]] %[[Const168toPtr]] %[[ConstMinus16toPtr]] %[[Nullptr]] %[[Nullptr]] %[[Nullptr]] +; CHECK: %[[Vtbl4:[0-9]+]] = OpConstantComposite %[[ArrTy]] %[[ConstMinus184toPtr]] %[[ConstMinus184toPtr]] %[[Nullptr]] %[[Nullptr]] %[[Nullptr]] +; CHECK: %[[Vtbl:[0-9]+]] = OpConstantComposite %[[VtblTy]] %[[Vtbl012]] %[[Vtbl012]] %[[Vtbl012]] %[[Vtbl3]] %[[Vtbl4]] +; CHECK: %[[#]] = OpVariable %[[GlobVtblPtrTy]] CrossWorkgroup %[[Vtbl]] + +@vtable = linkonce_odr unnamed_addr addrspace(1) constant { [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] } + { [5 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 184 to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null], + [5 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 184 to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null], + [5 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 184 to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null], + [5 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 168 to ptr addrspace(1)), ptr addrspace(1) inttoptr (i64 -16 to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null], + [5 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 -184 to ptr addrspace(1)), ptr addrspace(1) inttoptr (i64 -184 to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) null] } + +define linkonce_odr spir_func void @foo(ptr addrspace(4) %this) { +entry: + %0 = getelementptr inbounds i8, ptr addrspace(4) %this, i64 184 + store ptr addrspace(1) getelementptr inbounds inrange(-24, 16) ({ [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] }, ptr addrspace(1) @vtable, i32 0, i32 0, i32 3), ptr addrspace(4) %this + store ptr addrspace(1) getelementptr inbounds inrange(-24, 16) ({ [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] }, ptr addrspace(1) @vtable, i32 0, i32 1, i32 3), ptr addrspace(4) %this + store ptr addrspace(1) getelementptr inbounds inrange(-24, 16) ({ [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] }, ptr addrspace(1) @vtable, i32 0, i32 2, i32 3), ptr addrspace(4) %this + %add.ptr = getelementptr inbounds i8, ptr addrspace(4) %this, i64 184 + store ptr addrspace(1) getelementptr inbounds inrange(-24, 16) ({ [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] }, ptr addrspace(1) @vtable, i32 0, i32 4, i32 3), ptr addrspace(4) %add.ptr + %add.ptr2 = getelementptr inbounds i8, ptr addrspace(4) %this, i64 16 + store ptr addrspace(1) getelementptr inbounds inrange(-24, 16) ({ [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)], [5 x ptr addrspace(1)] }, ptr addrspace(1) @vtable, i32 0, i32 3, i32 3), ptr addrspace(4) %add.ptr2 + + ret void +} From 16ca2eb77b2cf1d129747d37f3e3da1f4b9c8365 Mon Sep 17 00:00:00 2001 From: Alex Voicu Date: Fri, 7 Nov 2025 02:01:31 +0200 Subject: [PATCH 68/71] [NFC][CUDA][HIP] Print the triple when there's no mcpu (#166565) It is possible to run into situations where no mcpu is specified for an offload device side compilation. Currently, this'd lead to a rather uninformative blank being presented as the target for a failing compilation, when messaging the error count. This patch changes things so that if there is no `-mcpu` we print the triple, which is slightly more helpful, especially when there are multiple offload targets for a single compilation. --- clang/lib/Frontend/CompilerInstance.cpp | 4 +++- clang/test/SemaCUDA/error-includes-mode.cu | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 6b09f7f9fc1e3..8034ce9c3f221 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -1058,7 +1058,9 @@ void CompilerInstance::printDiagnosticStats() { if (!getLangOpts().CUDAIsDevice) { OS << " when compiling for host"; } else { - OS << " when compiling for " << getTargetOpts().CPU; + OS << " when compiling for " + << (!getTargetOpts().CPU.empty() ? getTargetOpts().CPU + : getTarget().getTriple().str()); } } OS << ".\n"; diff --git a/clang/test/SemaCUDA/error-includes-mode.cu b/clang/test/SemaCUDA/error-includes-mode.cu index 257fdeceef654..f775e656b07a1 100644 --- a/clang/test/SemaCUDA/error-includes-mode.cu +++ b/clang/test/SemaCUDA/error-includes-mode.cu @@ -1,7 +1,16 @@ // RUN: not %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck --check-prefix HOST %s // RUN: not %clang_cc1 -triple nvptx-unknown-unknown -target-cpu sm_35 \ // RUN: -fcuda-is-device -fsyntax-only %s 2>&1 | FileCheck --check-prefix SM35 %s +// RUN: not %clang_cc1 -triple spirv64-unknown-unknown \ +// RUN: -fcuda-is-device -fsyntax-only %s 2>&1 | FileCheck --check-prefix SPIRV %s +// RUN: not %clang_cc1 -triple spirv64-amd-amdhsa \ +// RUN: -fcuda-is-device -fsyntax-only %s 2>&1 | FileCheck --check-prefix AMDGCNSPIRV %s +// RUN: not %clang_cc1 -triple spirv64-intel-unknown \ +// RUN: -fcuda-is-device -fsyntax-only %s 2>&1 | FileCheck --check-prefix INTELSPIRV %s // HOST: 1 error generated when compiling for host // SM35: 1 error generated when compiling for sm_35 +// SPIRV: 1 error generated when compiling for spirv64-unknown-unknown +// AMDGCNSPIRV: 1 error generated when compiling for spirv64-amd-amdhsa +// INTELSPIRV: 1 error generated when compiling for spirv64-intel-unknown error; From 83d60778c8dd304973733b17cc129ff2ed62c499 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Fri, 7 Nov 2025 00:39:27 +0000 Subject: [PATCH 69/71] [Github] Revert labeller update in new PRs workflow This was causing workflow failures when PRs were opened. Revert the upgrade for now so that this can be investigated and fixed before relanding. --- .github/workflows/new-prs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/new-prs.yml b/.github/workflows/new-prs.yml index dc8cd100f3e68..e1f2e754c1a3d 100644 --- a/.github/workflows/new-prs.yml +++ b/.github/workflows/new-prs.yml @@ -67,7 +67,7 @@ jobs: github.event.pull_request.draft == false && github.event.pull_request.commits < 10 steps: - - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 + - uses: actions/labeler@ac9175f8a1f3625fd0d4fb234536d26811351594 # v4.3.0 with: configuration-path: .github/new-prs-labeler.yml # workaround for https://github.com/actions/labeler/issues/112 From 7e9db961f8342ef0740e63b778d4f207b074f6d8 Mon Sep 17 00:00:00 2001 From: Chenguang Wang Date: Thu, 6 Nov 2025 17:01:49 -0800 Subject: [PATCH 70/71] [bazel] Fix compilation for AlignmentAttrInterface and BPF. (#166872) --- .../llvm-project-overlay/llvm/BUILD.bazel | 1 + .../llvm-project-overlay/mlir/BUILD.bazel | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel index bb35815a18d71..3e7719c0d03c7 100644 --- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel @@ -2317,6 +2317,7 @@ llvm_target_lib_list = [lib for lib in [ "lib/Target/BPF/BPFGenInstrInfo.inc": ["-gen-instr-info"], "lib/Target/BPF/BPFGenRegisterInfo.inc": ["-gen-register-info"], "lib/Target/BPF/BPFGenSubtargetInfo.inc": ["-gen-subtarget"], + "lib/Target/BPF/BPFGenSDNodeInfo.inc": ["-gen-sd-node-info"], }, }, { diff --git a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel index 943ae102f2f2a..3a802311688be 100644 --- a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel @@ -357,6 +357,34 @@ cc_library( ], ) +td_library( + name = "AlignmentAttrInterfaceTdFiles", + srcs = ["include/mlir/Interfaces/AlignmentAttrInterface.td"], + includes = ["include"], + deps = [":OpBaseTdFiles"], +) + +gentbl_cc_library( + name = "AlignmentAttrInterfaceIncGen", + tbl_outs = { + "include/mlir/Interfaces/AlignmentAttrInterface.h.inc": ["-gen-op-interface-decls"], + "include/mlir/Interfaces/AlignmentAttrInterface.cpp.inc": ["-gen-op-interface-defs"], + }, + tblgen = ":mlir-tblgen", + td_file = "include/mlir/Interfaces/AlignmentAttrInterface.td", + deps = [":OpBaseTdFiles"], +) + +cc_library( + name = "AlignmentAttrInterface", + hdrs = ["include/mlir/Interfaces/AlignmentAttrInterface.h"], + deps = [ + ":AlignmentAttrInterfaceIncGen", + ":IR", + "//llvm:Support", + ], +) + cc_library( name = "IR", srcs = glob([ @@ -6836,6 +6864,7 @@ td_library( srcs = glob(["include/mlir/Dialect/SPIRV/IR/*.td"]), includes = ["include"], deps = [ + ":AlignmentAttrInterfaceTdFiles", ":BuiltinDialectTdFiles", ":CallInterfacesTdFiles", ":ControlFlowInterfacesTdFiles", @@ -11327,6 +11356,7 @@ td_library( ], includes = ["include"], deps = [ + ":AlignmentAttrInterfaceTdFiles", ":ControlFlowInterfacesTdFiles", ":DestinationStyleOpInterfaceTdFiles", ":IndexingMapOpInterfaceTdFiles", @@ -12907,6 +12937,7 @@ td_library( ], includes = ["include"], deps = [ + ":AlignmentAttrInterfaceTdFiles", ":ArithOpsTdFiles", ":CastInterfacesTdFiles", ":ControlFlowInterfacesTdFiles", @@ -12988,6 +13019,7 @@ cc_library( ], includes = ["include"], deps = [ + ":AlignmentAttrInterface", ":AllocationOpInterface", ":ArithDialect", ":ArithUtils", From 7463efe62e934ee481d44400ed20242d356c0764 Mon Sep 17 00:00:00 2001 From: Ron Lieberman Date: Thu, 6 Nov 2025 19:48:02 -0600 Subject: [PATCH 71/71] Revert "[Offload] Remove handling for device memory pool (#163629)" breaks smoke no-looo-sched and openmpapps snap-mp4 MI-Teams This reverts commit 670c453aeb1931fbecd0be31ea9cb1cca113c1af. --- offload/include/Shared/Environment.h | 22 +++++ offload/plugins-nextgen/amdgpu/src/rtl.cpp | 15 +++ .../common/include/PluginInterface.h | 15 ++- .../common/src/PluginInterface.cpp | 93 +++++++++++++++++++ offload/plugins-nextgen/cuda/src/rtl.cpp | 12 ++- offload/plugins-nextgen/host/src/rtl.cpp | 8 ++ offload/test/mapping/lambda_mapping.cpp | 2 - offload/test/offloading/interop-print.c | 1 - offload/test/offloading/malloc.c | 2 +- .../{libc => offloading}/malloc_parallel.c | 0 openmp/device/include/Allocator.h | 6 ++ openmp/device/src/Allocator.cpp | 67 +++++++------ openmp/device/src/Kernel.cpp | 1 + openmp/device/src/Misc.cpp | 4 +- openmp/device/src/State.cpp | 7 +- openmp/docs/design/Runtimes.rst | 1 + revert_patches.txt | 3 + 17 files changed, 208 insertions(+), 51 deletions(-) rename offload/test/{libc => offloading}/malloc_parallel.c (100%) diff --git a/offload/include/Shared/Environment.h b/offload/include/Shared/Environment.h index 79e45fd8e082d..2a283bd6fa4ed 100644 --- a/offload/include/Shared/Environment.h +++ b/offload/include/Shared/Environment.h @@ -21,6 +21,7 @@ enum class DeviceDebugKind : uint32_t { Assertion = 1U << 0, FunctionTracing = 1U << 1, CommonIssues = 1U << 2, + AllocationTracker = 1U << 3, PGODump = 1U << 4, }; @@ -35,6 +36,27 @@ struct DeviceEnvironmentTy { uint64_t HardwareParallelism; }; +struct DeviceMemoryPoolTy { + void *Ptr; + uint64_t Size; +}; + +struct DeviceMemoryPoolTrackingTy { + uint64_t NumAllocations; + uint64_t AllocationTotal; + uint64_t AllocationMin; + uint64_t AllocationMax; + + void combine(DeviceMemoryPoolTrackingTy &Other) { + NumAllocations += Other.NumAllocations; + AllocationTotal += Other.AllocationTotal; + AllocationMin = AllocationMin > Other.AllocationMin ? Other.AllocationMin + : AllocationMin; + AllocationMax = AllocationMax < Other.AllocationMax ? Other.AllocationMax + : AllocationMax; + } +}; + // NOTE: Please don't change the order of those members as their indices are // used in the middle end. Always add the new data member at the end. // Different from KernelEnvironmentTy below, this structure contains members diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp index 6873c045390ce..7dfeb8e585d26 100644 --- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp +++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp @@ -4552,6 +4552,18 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy { return Plugin::success(); } + Error getDeviceHeapSize(uint64_t &Value) override { + Value = DeviceMemoryPoolSize; + return Plugin::success(); + } + Error setDeviceHeapSize(uint64_t Value) override { + for (DeviceImageTy *Image : LoadedImages) + if (auto Err = setupDeviceMemoryPool(Plugin, *Image, Value)) + return Err; + DeviceMemoryPoolSize = Value; + return Plugin::success(); + } + Error getDeviceMemorySize(uint64_t &Value) override { for (AMDGPUMemoryPoolTy *Pool : AllMemoryPools) { if (Pool->isGlobal()) { @@ -5001,6 +5013,9 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy { /// Pointer to the preallocated device memory pool void *PreAllocatedDeviceMemoryPool; + /// The current size of the global device memory pool (managed by us). + uint64_t DeviceMemoryPoolSize = 1L << 29L /* 512MB */; + /// The current size of the stack that will be used in cases where it could /// not be statically determined. /// Default: 1024, in conformity to hipLimitStackSize. diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h index 31c42c90ee82e..021ab736941bf 100644 --- a/offload/plugins-nextgen/common/include/PluginInterface.h +++ b/offload/plugins-nextgen/common/include/PluginInterface.h @@ -894,6 +894,10 @@ struct GenericDeviceTy : public DeviceAllocatorTy { Error unloadBinary(DeviceImageTy *Image); virtual Error unloadBinaryImpl(DeviceImageTy *Image) = 0; + /// Setup the global device memory pool, if the plugin requires one. + Error setupDeviceMemoryPool(GenericPluginTy &Plugin, DeviceImageTy &Image, + uint64_t PoolSize); + // Setup the RPC server for this device if needed. This may not run on some // plugins like the CPU targets. By default, it will not be executed so it is // up to the target to override this using the shouldSetupRPCServer function. @@ -1359,6 +1363,12 @@ struct GenericDeviceTy : public DeviceAllocatorTy { /// plugin can implement the setters as no-op and setting the output /// value to zero for the getters. virtual Error setDeviceStackSize(uint64_t V) = 0; + virtual Error getDeviceHeapSize(uint64_t &V) = 0; + virtual Error setDeviceHeapSize(uint64_t V) = 0; + + /// Indicate whether the device should setup the global device memory pool. If + /// false is return the value on the device will be uninitialized. + virtual bool shouldSetupDeviceMemoryPool() const { return true; } /// Indicate whether or not the device should setup the RPC server. This is /// only necessary for unhosted targets like the GPU. @@ -1456,6 +1466,9 @@ struct GenericDeviceTy : public DeviceAllocatorTy { Expected getKernelEnvironmentForKernel(StringRef Name, DeviceImageTy &Image); + DeviceMemoryPoolTy DeviceMemoryPool = {nullptr, 0}; + DeviceMemoryPoolTrackingTy DeviceMemoryPoolTracking = {0, 0, ~0U, 0}; + bool IsFastReductionEnabled = false; }; @@ -1567,8 +1580,6 @@ struct KernelRunRecordTy { uint32_t RunLimiter = ThreadCandidate.size() * CUMultiplierCandidate.size(); // Used for keeping track of the metatdata used in tuning for each kernel. std::unordered_map TuningData; - /// Internal representation for OMPT device (initialize & finalize) - std::atomic OmptInitialized; }; /// Class implementing common functionalities of offload plugins. Each plugin diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index 3cb8c4a0834ce..d2d0a50a7c1d5 100644 --- a/offload/plugins-nextgen/common/src/PluginInterface.cpp +++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp @@ -899,6 +899,13 @@ Error GenericDeviceTy::init(GenericPluginTy &Plugin) { return StackSizeEnvarOrErr.takeError(); OMPX_TargetStackSize = std::move(*StackSizeEnvarOrErr); + auto HeapSizeEnvarOrErr = UInt64Envar::create( + "LIBOMPTARGET_HEAP_SIZE", + [this](uint64_t &V) -> Error { return getDeviceHeapSize(V); }, + [this](uint64_t V) -> Error { return setDeviceHeapSize(V); }); + if (!HeapSizeEnvarOrErr) + return HeapSizeEnvarOrErr.takeError(); + OMPX_TargetHeapSize = std::move(*HeapSizeEnvarOrErr); // Update the maximum number of teams and threads after the device // initialization sets the corresponding hardware limit. @@ -931,6 +938,19 @@ Error GenericDeviceTy::unloadBinary(DeviceImageTy *Image) { if (auto Err = callGlobalDestructors(Plugin, *Image)) return Err; + if (OMPX_DebugKind.get() & uint32_t(DeviceDebugKind::AllocationTracker)) { + GenericGlobalHandlerTy &GHandler = Plugin.getGlobalHandler(); + DeviceMemoryPoolTrackingTy ImageDeviceMemoryPoolTracking = {0, 0, ~0U, 0}; + GlobalTy TrackerGlobal("__omp_rtl_device_memory_pool_tracker", + sizeof(DeviceMemoryPoolTrackingTy), + &ImageDeviceMemoryPoolTracking); + if (auto Err = + GHandler.readGlobalFromDevice(*this, *Image, TrackerGlobal)) { + consumeError(std::move(Err)); + } + DeviceMemoryPoolTracking.combine(ImageDeviceMemoryPoolTracking); + } + GenericGlobalHandlerTy &Handler = Plugin.getGlobalHandler(); auto ProfOrErr = Handler.readProfilingGlobals(*this, *Image); if (!ProfOrErr) @@ -956,6 +976,22 @@ Error GenericDeviceTy::deinit(GenericPluginTy &Plugin) { return Err; LoadedImages.clear(); + if (OMPX_DebugKind.get() & uint32_t(DeviceDebugKind::AllocationTracker)) { + // TODO: Write this by default into a file. + printf("\n\n|-----------------------\n" + "| Device memory tracker:\n" + "|-----------------------\n" + "| #Allocations: %lu\n" + "| Byes allocated: %lu\n" + "| Minimal allocation: %lu\n" + "| Maximal allocation: %lu\n" + "|-----------------------\n\n\n", + DeviceMemoryPoolTracking.NumAllocations, + DeviceMemoryPoolTracking.AllocationTotal, + DeviceMemoryPoolTracking.AllocationMin, + DeviceMemoryPoolTracking.AllocationMax); + } + // Delete the memory manager before deinitializing the device. Otherwise, // we may delete device allocations after the device is deinitialized. if (MemoryManager) @@ -1012,6 +1048,18 @@ Expected GenericDeviceTy::loadBinary(GenericPluginTy &Plugin, // Add the image to list. LoadedImages.push_back(Image); + // Setup the global device memory pool if needed. + if (!Plugin.getRecordReplay().isReplaying() && + shouldSetupDeviceMemoryPool()) { + uint64_t HeapSize; + auto SizeOrErr = getDeviceHeapSize(HeapSize); + if (SizeOrErr) { + REPORT("No global device memory pool due to error: %s\n", + toString(std::move(SizeOrErr)).data()); + } else if (auto Err = setupDeviceMemoryPool(Plugin, *Image, HeapSize)) + return std::move(Err); + } + if (auto Err = setupRPCServer(Plugin, *Image)) return std::move(Err); @@ -1026,6 +1074,51 @@ Expected GenericDeviceTy::loadBinary(GenericPluginTy &Plugin, return Image; } +Error GenericDeviceTy::setupDeviceMemoryPool(GenericPluginTy &Plugin, + DeviceImageTy &Image, + uint64_t PoolSize) { + // Free the old pool, if any. + if (DeviceMemoryPool.Ptr) { + if (auto Err = dataDelete(DeviceMemoryPool.Ptr, + TargetAllocTy::TARGET_ALLOC_DEVICE)) + return Err; + } + + DeviceMemoryPool.Size = PoolSize; + auto AllocOrErr = dataAlloc(PoolSize, /*HostPtr=*/nullptr, + TargetAllocTy::TARGET_ALLOC_DEVICE); + if (AllocOrErr) { + DeviceMemoryPool.Ptr = *AllocOrErr; + } else { + auto Err = AllocOrErr.takeError(); + REPORT("Failure to allocate device memory for global memory pool: %s\n", + toString(std::move(Err)).data()); + DeviceMemoryPool.Ptr = nullptr; + DeviceMemoryPool.Size = 0; + } + + // Create the metainfo of the device environment global. + GenericGlobalHandlerTy &GHandler = Plugin.getGlobalHandler(); + if (!GHandler.isSymbolInImage(*this, Image, + "__omp_rtl_device_memory_pool_tracker")) { + DP("Skip the memory pool as there is no tracker symbol in the image."); + return Error::success(); + } + + GlobalTy TrackerGlobal("__omp_rtl_device_memory_pool_tracker", + sizeof(DeviceMemoryPoolTrackingTy), + &DeviceMemoryPoolTracking); + if (auto Err = GHandler.writeGlobalToDevice(*this, Image, TrackerGlobal)) + return Err; + + // Create the metainfo of the device environment global. + GlobalTy DevEnvGlobal("__omp_rtl_device_memory_pool", + sizeof(DeviceMemoryPoolTy), &DeviceMemoryPool); + + // Write device environment values to the device. + return GHandler.writeGlobalToDevice(*this, Image, DevEnvGlobal); +} + Error GenericDeviceTy::setupRPCServer(GenericPluginTy &Plugin, DeviceImageTy &Image) { // The plugin either does not need an RPC server or it is unavailable. diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp index f6681a765aad4..0c9fbd01f8576 100644 --- a/offload/plugins-nextgen/cuda/src/rtl.cpp +++ b/offload/plugins-nextgen/cuda/src/rtl.cpp @@ -1238,6 +1238,11 @@ struct CUDADeviceTy : public GenericDeviceTy { return Info; } + virtual bool shouldSetupDeviceMemoryPool() const override { + /// We use the CUDA malloc for now. + return false; + } + /// Getters and setters for stack and heap sizes. Error getDeviceStackSize(uint64_t &Value) override { return getCtxLimit(CU_LIMIT_STACK_SIZE, Value); @@ -1245,14 +1250,13 @@ struct CUDADeviceTy : public GenericDeviceTy { Error setDeviceStackSize(uint64_t Value) override { return setCtxLimit(CU_LIMIT_STACK_SIZE, Value); } - bool hasDeviceHeapSize() { return true; } - Error getDeviceHeapSize(uint64_t &Value) { + Error getDeviceHeapSize(uint64_t &Value) override { return getCtxLimit(CU_LIMIT_MALLOC_HEAP_SIZE, Value); } - Error setDeviceHeapSize(uint64_t Value) { + Error setDeviceHeapSize(uint64_t Value) override { return setCtxLimit(CU_LIMIT_MALLOC_HEAP_SIZE, Value); } - Error getDeviceMemorySize(uint64_t &Value) { + Error getDeviceMemorySize(uint64_t &Value) override { CUresult Res = cuDeviceTotalMem(&Value, Device); return Plugin::check(Res, "error in getDeviceMemorySize %s"); } diff --git a/offload/plugins-nextgen/host/src/rtl.cpp b/offload/plugins-nextgen/host/src/rtl.cpp index 75f85287e86dc..5758b634a7456 100644 --- a/offload/plugins-nextgen/host/src/rtl.cpp +++ b/offload/plugins-nextgen/host/src/rtl.cpp @@ -393,6 +393,9 @@ struct GenELF64DeviceTy : public GenericDeviceTy { return Info; } + /// This plugin should not setup the device environment or memory pool. + virtual bool shouldSetupDeviceMemoryPool() const override { return false; }; + /// Getters and setters for stack size and heap size not relevant. Error getDeviceStackSize(uint64_t &Value) override { Value = 0; @@ -401,6 +404,11 @@ struct GenELF64DeviceTy : public GenericDeviceTy { Error setDeviceStackSize(uint64_t Value) override { return Plugin::success(); } + Error getDeviceHeapSize(uint64_t &Value) override { + Value = 0; + return Plugin::success(); + } + Error setDeviceHeapSize(uint64_t Value) override { return Plugin::success(); } private: /// Grid values for Generic ELF64 plugins. diff --git a/offload/test/mapping/lambda_mapping.cpp b/offload/test/mapping/lambda_mapping.cpp index b9579bc0c2a91..8f55f50efc7d6 100644 --- a/offload/test/mapping/lambda_mapping.cpp +++ b/offload/test/mapping/lambda_mapping.cpp @@ -5,8 +5,6 @@ // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic // RUN: %libomptarget-compileoptxx-run-and-check-generic -// REQUIRES: libc - #include template diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index f7b37d992f17f..a3864209e17bc 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -8,7 +8,6 @@ // REQUIRES: gpu // XFAIL: nvptx64-nvidia-cuda -// XFAIL: nvptx64-nvidia-cuda-LTO #include #include diff --git a/offload/test/offloading/malloc.c b/offload/test/offloading/malloc.c index 04e72561d3127..7b98e1f1110e5 100644 --- a/offload/test/offloading/malloc.c +++ b/offload/test/offloading/malloc.c @@ -10,7 +10,7 @@ int main() { int Threads = 64; int Teams = 10; - // Allocate ~160 KiB on the device. + // Allocate ~55MB on the device. #pragma omp target map(from : DP) DP = (long unsigned *)malloc(sizeof(long unsigned) * N * Threads * Teams); diff --git a/offload/test/libc/malloc_parallel.c b/offload/test/offloading/malloc_parallel.c similarity index 100% rename from offload/test/libc/malloc_parallel.c rename to offload/test/offloading/malloc_parallel.c diff --git a/openmp/device/include/Allocator.h b/openmp/device/include/Allocator.h index 507ec6327126a..dc4d029ed75f3 100644 --- a/openmp/device/include/Allocator.h +++ b/openmp/device/include/Allocator.h @@ -14,12 +14,18 @@ #include "DeviceTypes.h" +// Forward declaration. +struct KernelEnvironmentTy; + namespace ompx { namespace allocator { static uint64_t constexpr ALIGNMENT = 16; +/// Initialize the allocator according to \p KernelEnvironment +void init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment); + /// Allocate \p Size bytes. [[gnu::alloc_size(1), gnu::assume_aligned(ALIGNMENT), gnu::malloc]] void * alloc(uint64_t Size); diff --git a/openmp/device/src/Allocator.cpp b/openmp/device/src/Allocator.cpp index 34c945c979ffb..aac2a6005158e 100644 --- a/openmp/device/src/Allocator.cpp +++ b/openmp/device/src/Allocator.cpp @@ -18,36 +18,42 @@ #include "Synchronization.h" using namespace ompx; -using namespace allocator; - -// Provide a default implementation of malloc / free for AMDGPU platforms built -// without 'libc' support. -extern "C" { -#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) -[[gnu::weak]] void *malloc(size_t Size) { return allocator::alloc(Size); } -[[gnu::weak]] void free(void *Ptr) { allocator::free(Ptr); } -#else -[[gnu::leaf]] void *malloc(size_t Size); -[[gnu::leaf]] void free(void *Ptr); -#endif -} -static constexpr uint64_t MEMORY_SIZE = /* 1 MiB */ 1024 * 1024; -alignas(ALIGNMENT) static uint8_t Memory[MEMORY_SIZE] = {0}; +[[gnu::used, gnu::retain, gnu::weak, + gnu::visibility( + "protected")]] DeviceMemoryPoolTy __omp_rtl_device_memory_pool; +[[gnu::used, gnu::retain, gnu::weak, + gnu::visibility("protected")]] DeviceMemoryPoolTrackingTy + __omp_rtl_device_memory_pool_tracker; -// Fallback bump pointer interface for platforms without a functioning -// allocator. +/// Stateless bump allocator that uses the __omp_rtl_device_memory_pool +/// directly. struct BumpAllocatorTy final { - uint64_t Offset = 0; void *alloc(uint64_t Size) { Size = utils::roundUp(Size, uint64_t(allocator::ALIGNMENT)); - uint64_t OldData = atomic::add(&Offset, Size, atomic::seq_cst); - if (OldData + Size >= MEMORY_SIZE) + if (config::isDebugMode(DeviceDebugKind::AllocationTracker)) { + atomic::add(&__omp_rtl_device_memory_pool_tracker.NumAllocations, 1, + atomic::seq_cst); + atomic::add(&__omp_rtl_device_memory_pool_tracker.AllocationTotal, Size, + atomic::seq_cst); + atomic::min(&__omp_rtl_device_memory_pool_tracker.AllocationMin, Size, + atomic::seq_cst); + atomic::max(&__omp_rtl_device_memory_pool_tracker.AllocationMax, Size, + atomic::seq_cst); + } + + uint64_t *Data = + reinterpret_cast(&__omp_rtl_device_memory_pool.Ptr); + uint64_t End = + reinterpret_cast(Data) + __omp_rtl_device_memory_pool.Size; + + uint64_t OldData = atomic::add(Data, Size, atomic::seq_cst); + if (OldData + Size > End) __builtin_trap(); - return &Memory[OldData]; + return reinterpret_cast(OldData); } void free(void *) {} @@ -59,20 +65,13 @@ BumpAllocatorTy BumpAllocator; /// ///{ -void *allocator::alloc(uint64_t Size) { -#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) - return BumpAllocator.alloc(Size); -#else - return ::malloc(Size); -#endif +void allocator::init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment) { + // TODO: Check KernelEnvironment for an allocator choice as soon as we have + // more than one. } -void allocator::free(void *Ptr) { -#if defined(__AMDGPU__) && !defined(OMPTARGET_HAS_LIBC) - BumpAllocator.free(Ptr); -#else - ::free(Ptr); -#endif -} +void *allocator::alloc(uint64_t Size) { return BumpAllocator.alloc(Size); } + +void allocator::free(void *Ptr) { BumpAllocator.free(Ptr); } ///} diff --git a/openmp/device/src/Kernel.cpp b/openmp/device/src/Kernel.cpp index 6526a97dd58d6..e5535d082bfeb 100644 --- a/openmp/device/src/Kernel.cpp +++ b/openmp/device/src/Kernel.cpp @@ -41,6 +41,7 @@ inititializeRuntime(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment, synchronize::init(IsSPMD); mapping::init(IsSPMD); state::init(IsSPMD, KernelEnvironment, KernelLaunchEnvironment); + allocator::init(IsSPMD, KernelEnvironment); workshare::init(IsSPMD); } diff --git a/openmp/device/src/Misc.cpp b/openmp/device/src/Misc.cpp index 8250dc40015cc..4f9c77f9eefaa 100644 --- a/openmp/device/src/Misc.cpp +++ b/openmp/device/src/Misc.cpp @@ -100,7 +100,7 @@ void *omp_alloc(size_t size, omp_allocator_handle_t allocator) { case omp_const_mem_alloc: case omp_high_bw_mem_alloc: case omp_low_lat_mem_alloc: - return ompx::allocator::alloc(size); + return malloc(size); default: return nullptr; } @@ -113,7 +113,7 @@ void omp_free(void *ptr, omp_allocator_handle_t allocator) { case omp_const_mem_alloc: case omp_high_bw_mem_alloc: case omp_low_lat_mem_alloc: - ompx::allocator::free(ptr); + free(ptr); return; case omp_null_allocator: default: diff --git a/openmp/device/src/State.cpp b/openmp/device/src/State.cpp index e64ad2bd63f9c..20fdf3c0be753 100644 --- a/openmp/device/src/State.cpp +++ b/openmp/device/src/State.cpp @@ -55,7 +55,6 @@ using namespace ompx; namespace { -<<<<<<< HEAD /// Malloc/Free API implementation /// AMDGCN does not expose a malloc/free API, while /// NVPTX does. FOr this reason, the order of the following malloc/free @@ -140,8 +139,6 @@ void internal_free(void *Ptr) { free(Ptr); } } #endif -======= ->>>>>>> 670c453aeb19 /// A "smart" stack in shared memory. /// /// The stack exposes a malloc/free interface but works like a stack internally. @@ -249,13 +246,13 @@ void memory::freeShared(void *Ptr, uint64_t Bytes, const char *Reason) { } void *memory::allocGlobal(uint64_t Bytes, const char *Reason) { - void *Ptr = allocator::alloc(Bytes); + void *Ptr = malloc(Bytes); if (config::isDebugMode(DeviceDebugKind::CommonIssues) && Ptr == nullptr) printf("nullptr returned by malloc!\n"); return Ptr; } -void memory::freeGlobal(void *Ptr, const char *Reason) { allocator::free(Ptr); } +void memory::freeGlobal(void *Ptr, const char *Reason) { free(Ptr); } ///} diff --git a/openmp/docs/design/Runtimes.rst b/openmp/docs/design/Runtimes.rst index 4e4a2617759d4..64cb1952a5813 100644 --- a/openmp/docs/design/Runtimes.rst +++ b/openmp/docs/design/Runtimes.rst @@ -1513,4 +1513,5 @@ debugging features are supported. * Enable debugging assertions in the device. ``0x01`` * Enable diagnosing common problems during offloading . ``0x4`` + * Enable device malloc statistics (amdgpu only). ``0x8`` * Dump device PGO counters (only if PGO on GPU is enabled). ``0x10`` diff --git a/revert_patches.txt b/revert_patches.txt index 9e465ba90ae6a..b98f337e0d7ac 100644 --- a/revert_patches.txt +++ b/revert_patches.txt @@ -5,3 +5,6 @@ d57230c7 [AMDGPU][MC] Disallow op_sel in some VOP3P dot instructions (#100485) breaks build of ROCmValidationSuite [C2y] Support WG14 N3457, the __COUNTER__ macro (#162662) --- +breaks openmp smoke and openmpapps +[Offload] Remove handling for device memory pool (#163629) +---