[llvm] [GlobalISel] Diagnose inline assembly constraint lowering errors (PR #135782)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Wed May 7 02:50:16 PDT 2025
https://github.com/Pierre-vh updated https://github.com/llvm/llvm-project/pull/135782
>From 8e5d146907bcd551e0622abf3e1c69ce7b4c79d8 Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Tue, 15 Apr 2025 14:10:12 +0200
Subject: [PATCH 1/6] [GlobalISel] Diagnose inline assembly constraint lowering
errors
Instead of printing something to dbgs (which is not visible to all users),
emit a diagnostic like the DAG does. We still crash later because we fail to
select the inline assembly, but at least now users will know why it's crashing.
In a future patch we could also recover from the error like the DAG does, so the
lowering can keep going until it either crashes or gives a different error later.
---
.../CodeGen/GlobalISel/InlineAsmLowering.cpp | 75 +++++++++++--------
1 file changed, 42 insertions(+), 33 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
index 81f25b21a0409..97d665c8fbf94 100644
--- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
@@ -16,6 +16,7 @@
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
+#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Module.h"
#define DEBUG_TYPE "inline-asm-lowering"
@@ -212,6 +213,17 @@ static bool buildAnyextOrCopy(Register Dst, Register Src,
return true;
}
+static bool reportInlineAsmConstraintError(const CallBase &Call,
+ const GISelAsmOperandInfo &Info,
+ Twine Msg) {
+ LLVMContext &Ctx = Call.getContext();
+ Ctx.diagnose(DiagnosticInfoInlineAsm(
+ Call, "invalid constraint '" + Info.ConstraintCode + "': " + Msg));
+ // TODO(?): Allow selection to continue by recovering/leaving the gMIR in a
+ // good state, like the DAG does.
+ return false;
+}
+
bool InlineAsmLowering::lowerInlineAsm(
MachineIRBuilder &MIRBuilder, const CallBase &Call,
std::function<ArrayRef<Register>(const Value &Val)> GetOrCreateVRegs)
@@ -243,8 +255,8 @@ bool InlineAsmLowering::lowerInlineAsm(
OpInfo.CallOperandVal = const_cast<Value *>(Call.getArgOperand(ArgNo));
if (isa<BasicBlock>(OpInfo.CallOperandVal)) {
- LLVM_DEBUG(dbgs() << "Basic block input operands not supported yet\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo, "basic block input operands not supported yet");
}
Type *OpTy = OpInfo.CallOperandVal->getType();
@@ -258,9 +270,8 @@ bool InlineAsmLowering::lowerInlineAsm(
// FIXME: Support aggregate input operands
if (!OpTy->isSingleValueType()) {
- LLVM_DEBUG(
- dbgs() << "Aggregate input operands are not supported yet\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo, "aggregate input operands not supported yet");
}
OpInfo.ConstraintVT =
@@ -344,9 +355,8 @@ bool InlineAsmLowering::lowerInlineAsm(
// Find a register that we can use.
if (OpInfo.Regs.empty()) {
- LLVM_DEBUG(dbgs()
- << "Couldn't allocate output register for constraint\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo, "couldn't allocate output register for constraint");
}
// Add information to the INLINEASM instruction to know that this
@@ -389,13 +399,14 @@ bool InlineAsmLowering::lowerInlineAsm(
const InlineAsm::Flag MatchedOperandFlag(Inst->getOperand(InstFlagIdx).getImm());
if (MatchedOperandFlag.isMemKind()) {
- LLVM_DEBUG(dbgs() << "Matching input constraint to mem operand not "
- "supported. This should be target specific.\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo,
+ "matching input constraint to mem operand not supported; this "
+ "should be target specific");
}
if (!MatchedOperandFlag.isRegDefKind() && !MatchedOperandFlag.isRegDefEarlyClobberKind()) {
- LLVM_DEBUG(dbgs() << "Unknown matching constraint\n");
- return false;
+ return reportInlineAsmConstraintError(Call, OpInfo,
+ "unknown matching constraint");
}
// We want to tie input to register in next operand.
@@ -425,9 +436,10 @@ bool InlineAsmLowering::lowerInlineAsm(
if (OpInfo.ConstraintType == TargetLowering::C_Other &&
OpInfo.isIndirect) {
- LLVM_DEBUG(dbgs() << "Indirect input operands with unknown constraint "
- "not supported yet\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo,
+ "indirect input operands with unknown constraint not supported "
+ "yet");
}
if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
@@ -437,9 +449,8 @@ bool InlineAsmLowering::lowerInlineAsm(
if (!lowerAsmOperandForConstraint(OpInfo.CallOperandVal,
OpInfo.ConstraintCode, Ops,
MIRBuilder)) {
- LLVM_DEBUG(dbgs() << "Don't support constraint: "
- << OpInfo.ConstraintCode << " yet\n");
- return false;
+ return reportInlineAsmConstraintError(Call, OpInfo,
+ "unsupported constraint");
}
assert(Ops.size() > 0 &&
@@ -456,9 +467,9 @@ bool InlineAsmLowering::lowerInlineAsm(
if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
if (!OpInfo.isIndirect) {
- LLVM_DEBUG(dbgs()
- << "Cannot indirectify memory input operands yet\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo,
+ "indirect memory input operands are not supported yet");
}
assert(OpInfo.isIndirect && "Operand must be indirect to be a mem!");
@@ -482,18 +493,15 @@ bool InlineAsmLowering::lowerInlineAsm(
"Unknown constraint type!");
if (OpInfo.isIndirect) {
- LLVM_DEBUG(dbgs() << "Can't handle indirect register inputs yet "
- "for constraint '"
- << OpInfo.ConstraintCode << "'\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo, "indirect register inputs are not supported yet");
}
// Copy the input into the appropriate registers.
if (OpInfo.Regs.empty()) {
- LLVM_DEBUG(
- dbgs()
- << "Couldn't allocate input register for register constraint\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo,
+ "couldn't allocate input register for register constraint");
}
unsigned NumRegs = OpInfo.Regs.size();
@@ -503,9 +511,10 @@ bool InlineAsmLowering::lowerInlineAsm(
"source registers");
if (NumRegs > 1) {
- LLVM_DEBUG(dbgs() << "Input operands with multiple input registers are "
- "not supported yet\n");
- return false;
+ return reportInlineAsmConstraintError(
+ Call, OpInfo,
+ "input operands with multiple input registers are not supported "
+ "yet");
}
InlineAsm::Flag Flag(InlineAsm::Kind::RegUse, NumRegs);
>From a7debaa8caa22a6aad4459f9d3c0160c05e85ddf Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Fri, 25 Apr 2025 10:32:27 +0200
Subject: [PATCH 2/6] add some tests
---
.../CodeGen/GlobalISel/InlineAsmLowering.cpp | 66 +++++++++----------
.../GlobalISel/inline-asm-lowering-errors.ll | 13 ++++
2 files changed, 44 insertions(+), 35 deletions(-)
create mode 100644 llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
index 97d665c8fbf94..d4a38f180f011 100644
--- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
@@ -213,17 +213,6 @@ static bool buildAnyextOrCopy(Register Dst, Register Src,
return true;
}
-static bool reportInlineAsmConstraintError(const CallBase &Call,
- const GISelAsmOperandInfo &Info,
- Twine Msg) {
- LLVMContext &Ctx = Call.getContext();
- Ctx.diagnose(DiagnosticInfoInlineAsm(
- Call, "invalid constraint '" + Info.ConstraintCode + "': " + Msg));
- // TODO(?): Allow selection to continue by recovering/leaving the gMIR in a
- // good state, like the DAG does.
- return false;
-}
-
bool InlineAsmLowering::lowerInlineAsm(
MachineIRBuilder &MIRBuilder, const CallBase &Call,
std::function<ArrayRef<Register>(const Value &Val)> GetOrCreateVRegs)
@@ -243,6 +232,16 @@ bool InlineAsmLowering::lowerInlineAsm(
TargetLowering::AsmOperandInfoVector TargetConstraints =
TLI->ParseConstraints(DL, TRI, Call);
+ const auto ConstraintError = [&](const GISelAsmOperandInfo &Info, Twine Msg) {
+ LLVMContext &Ctx = MIRBuilder.getContext();
+ Ctx.diagnose(DiagnosticInfoInlineAsm(
+ Call, "invalid constraint '" + Info.ConstraintCode + "' in '" +
+ MF.getName() + "': " + Msg));
+ // TODO: Recover if fallback isn't used. Otherwise let the fallback to DAG
+ // kick in.
+ return false;
+ };
+
ExtraFlags ExtraInfo(Call);
unsigned ArgNo = 0; // ArgNo - The argument of the CallInst.
unsigned ResNo = 0; // ResNo - The result number of the next output.
@@ -255,8 +254,8 @@ bool InlineAsmLowering::lowerInlineAsm(
OpInfo.CallOperandVal = const_cast<Value *>(Call.getArgOperand(ArgNo));
if (isa<BasicBlock>(OpInfo.CallOperandVal)) {
- return reportInlineAsmConstraintError(
- Call, OpInfo, "basic block input operands not supported yet");
+ return ConstraintError(OpInfo,
+ "basic block input operands not supported yet");
}
Type *OpTy = OpInfo.CallOperandVal->getType();
@@ -270,8 +269,8 @@ bool InlineAsmLowering::lowerInlineAsm(
// FIXME: Support aggregate input operands
if (!OpTy->isSingleValueType()) {
- return reportInlineAsmConstraintError(
- Call, OpInfo, "aggregate input operands not supported yet");
+ return ConstraintError(OpInfo,
+ "aggregate input operands not supported yet");
}
OpInfo.ConstraintVT =
@@ -355,8 +354,8 @@ bool InlineAsmLowering::lowerInlineAsm(
// Find a register that we can use.
if (OpInfo.Regs.empty()) {
- return reportInlineAsmConstraintError(
- Call, OpInfo, "couldn't allocate output register for constraint");
+ return ConstraintError(
+ OpInfo, "could not allocate output register for constraint");
}
// Add information to the INLINEASM instruction to know that this
@@ -399,14 +398,13 @@ bool InlineAsmLowering::lowerInlineAsm(
const InlineAsm::Flag MatchedOperandFlag(Inst->getOperand(InstFlagIdx).getImm());
if (MatchedOperandFlag.isMemKind()) {
- return reportInlineAsmConstraintError(
- Call, OpInfo,
+ return ConstraintError(
+ OpInfo,
"matching input constraint to mem operand not supported; this "
"should be target specific");
}
if (!MatchedOperandFlag.isRegDefKind() && !MatchedOperandFlag.isRegDefEarlyClobberKind()) {
- return reportInlineAsmConstraintError(Call, OpInfo,
- "unknown matching constraint");
+ return ConstraintError(OpInfo, "unknown matching constraint");
}
// We want to tie input to register in next operand.
@@ -436,8 +434,8 @@ bool InlineAsmLowering::lowerInlineAsm(
if (OpInfo.ConstraintType == TargetLowering::C_Other &&
OpInfo.isIndirect) {
- return reportInlineAsmConstraintError(
- Call, OpInfo,
+ return ConstraintError(
+ OpInfo,
"indirect input operands with unknown constraint not supported "
"yet");
}
@@ -449,8 +447,7 @@ bool InlineAsmLowering::lowerInlineAsm(
if (!lowerAsmOperandForConstraint(OpInfo.CallOperandVal,
OpInfo.ConstraintCode, Ops,
MIRBuilder)) {
- return reportInlineAsmConstraintError(Call, OpInfo,
- "unsupported constraint");
+ return ConstraintError(OpInfo, "unsupported constraint");
}
assert(Ops.size() > 0 &&
@@ -467,9 +464,8 @@ bool InlineAsmLowering::lowerInlineAsm(
if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
if (!OpInfo.isIndirect) {
- return reportInlineAsmConstraintError(
- Call, OpInfo,
- "indirect memory input operands are not supported yet");
+ return ConstraintError(
+ OpInfo, "indirect memory input operands are not supported yet");
}
assert(OpInfo.isIndirect && "Operand must be indirect to be a mem!");
@@ -493,15 +489,15 @@ bool InlineAsmLowering::lowerInlineAsm(
"Unknown constraint type!");
if (OpInfo.isIndirect) {
- return reportInlineAsmConstraintError(
- Call, OpInfo, "indirect register inputs are not supported yet");
+ return ConstraintError(
+ OpInfo, "indirect register inputs are not supported yet");
}
// Copy the input into the appropriate registers.
if (OpInfo.Regs.empty()) {
- return reportInlineAsmConstraintError(
- Call, OpInfo,
- "couldn't allocate input register for register constraint");
+ return ConstraintError(
+ OpInfo,
+ "could not allocate input register for register constraint");
}
unsigned NumRegs = OpInfo.Regs.size();
@@ -511,8 +507,8 @@ bool InlineAsmLowering::lowerInlineAsm(
"source registers");
if (NumRegs > 1) {
- return reportInlineAsmConstraintError(
- Call, OpInfo,
+ return ConstraintError(
+ OpInfo,
"input operands with multiple input registers are not supported "
"yet");
}
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
new file mode 100644
index 0000000000000..95f9b9ba5505a
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
@@ -0,0 +1,13 @@
+; RUN: llc -S -mtriple=amdgcn -mcpu=fiji -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' %s -o - 2> %t.err
+
+; CHECK: error: invalid constraint '' in 'aggregates': aggregate input operands not supported yet
+define amdgpu_kernel void @aggregates([4 x i8] %val) {
+ tail call void asm sideeffect "s_nop", "r"([4 x i8] %val)
+ ret void
+}
+
+; CHECK: error: error: invalid constraint '{s999}' in 'bad_output': could not allocate output register for constraint
+define amdgpu_kernel void @bad_output() {
+ tail call i32 asm sideeffect "s_nop", "={s999}"()
+ ret void
+}
>From b1ff22f9e36c281be8a603da3090ca688eff9796 Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Mon, 28 Apr 2025 15:07:04 +0200
Subject: [PATCH 3/6] fix tests
---
.../CodeGen/GlobalISel/InlineAsmLowering.cpp | 3 +--
.../GlobalISel/inline-asm-lowering-errors.ll | 24 ++++++++++++++++---
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
index d4a38f180f011..1b103c8fc6226 100644
--- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
@@ -235,8 +235,7 @@ bool InlineAsmLowering::lowerInlineAsm(
const auto ConstraintError = [&](const GISelAsmOperandInfo &Info, Twine Msg) {
LLVMContext &Ctx = MIRBuilder.getContext();
Ctx.diagnose(DiagnosticInfoInlineAsm(
- Call, "invalid constraint '" + Info.ConstraintCode + "' in '" +
- MF.getName() + "': " + Msg));
+ Call, "invalid constraint '" + Info.ConstraintCode + "': " + Msg));
// TODO: Recover if fallback isn't used. Otherwise let the fallback to DAG
// kick in.
return false;
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
index 95f9b9ba5505a..fad7a920153fe 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
@@ -1,13 +1,31 @@
-; RUN: llc -S -mtriple=amdgcn -mcpu=fiji -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' %s -o - 2> %t.err
+; RUN: not llc -mtriple=amdgcn -mcpu=fiji -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' %s -o - 2>&1 | FileCheck %s
-; CHECK: error: invalid constraint '' in 'aggregates': aggregate input operands not supported yet
+; CHECK: error: invalid constraint '': aggregate input operands not supported yet
define amdgpu_kernel void @aggregates([4 x i8] %val) {
tail call void asm sideeffect "s_nop", "r"([4 x i8] %val)
ret void
}
-; CHECK: error: error: invalid constraint '{s999}' in 'bad_output': could not allocate output register for constraint
+; CHECK: error: invalid constraint '{s999}': could not allocate output register for constraint
define amdgpu_kernel void @bad_output() {
tail call i32 asm sideeffect "s_nop", "={s999}"()
ret void
}
+
+; CHECK: error: invalid constraint '{s998}': could not allocate input register for register constraint
+define amdgpu_kernel void @bad_input() {
+ tail call void asm sideeffect "s_nop", "{s998}"(i32 undef)
+ ret void
+}
+; CHECK: error: invalid constraint '{s997}': indirect register inputs are not supported yet
+define amdgpu_kernel void @indirect_input() {
+ tail call void asm sideeffect "s_nop", "*{s997}"(ptr elementtype(i32) undef)
+ ret void
+}
+
+; CHECK: error: invalid constraint 'i': unsupported constraint
+define amdgpu_kernel void @badimm() {
+ tail call void asm sideeffect "s_nop", "i"(i32 undef)
+ ret
+ void
+}
>From 37703e73459c3734c35992e8426ad7b6aaa9fed3 Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Mon, 28 Apr 2025 15:12:35 +0200
Subject: [PATCH 4/6] undef -> poison
---
.../CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
index fad7a920153fe..46494d06a7f21 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
@@ -14,18 +14,18 @@ define amdgpu_kernel void @bad_output() {
; CHECK: error: invalid constraint '{s998}': could not allocate input register for register constraint
define amdgpu_kernel void @bad_input() {
- tail call void asm sideeffect "s_nop", "{s998}"(i32 undef)
+ tail call void asm sideeffect "s_nop", "{s998}"(i32 poison)
ret void
}
; CHECK: error: invalid constraint '{s997}': indirect register inputs are not supported yet
define amdgpu_kernel void @indirect_input() {
- tail call void asm sideeffect "s_nop", "*{s997}"(ptr elementtype(i32) undef)
+ tail call void asm sideeffect "s_nop", "*{s997}"(ptr elementtype(i32) poison)
ret void
}
; CHECK: error: invalid constraint 'i': unsupported constraint
define amdgpu_kernel void @badimm() {
- tail call void asm sideeffect "s_nop", "i"(i32 undef)
+ tail call void asm sideeffect "s_nop", "i"(i32 poison)
ret
void
}
>From 34e68740dcb0d2a87adb6c0a99d2002b6ba9846c Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Wed, 7 May 2025 11:26:53 +0200
Subject: [PATCH 5/6] Fix tests
---
.../CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll | 3 +--
.../CodeGen/AMDGPU/GlobalISel/inline-asm-mismatched-size.ll | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
index 46494d06a7f21..8f99749e76d79 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-lowering-errors.ll
@@ -26,6 +26,5 @@ define amdgpu_kernel void @indirect_input() {
; CHECK: error: invalid constraint 'i': unsupported constraint
define amdgpu_kernel void @badimm() {
tail call void asm sideeffect "s_nop", "i"(i32 poison)
- ret
- void
+ ret void
}
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-mismatched-size.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-mismatched-size.ll
index 0b0c7b7df2570..1f7700b14e618 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-mismatched-size.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inline-asm-mismatched-size.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
-; RUN: llc -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' -mtriple=amdgcn -mcpu=fiji -stop-after=irtranslator -verify-machineinstrs %s -o - 2>%t | FileCheck %s
+; RUN: not llc -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' -mtriple=amdgcn -mcpu=fiji -stop-after=irtranslator -verify-machineinstrs %s -o - 2>%t | FileCheck %s
; RUN: FileCheck -check-prefix=ERR %s < %t
; ERR: remark: <unknown>:0:0: unable to translate instruction: call: ' %sgpr = call <4 x i32> asm sideeffect "; def $0", "={s[8:12]}"()' (in function: return_type_is_too_big_vector)
>From ef0316a63924c85e35de14a692b1c015d4ad866d Mon Sep 17 00:00:00 2001
From: pvanhout <pierre.vanhoutryve at amd.com>
Date: Wed, 7 May 2025 11:49:58 +0200
Subject: [PATCH 6/6] Test updates
---
llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll | 6 +++++-
llvm/test/CodeGen/AArch64/arm64-preserve-all.ll | 2 +-
llvm/test/CodeGen/AArch64/arm64-preserve-most.ll | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
index 29c320da6c0a7..12795c5609c96 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
@@ -1,13 +1,17 @@
-; RUN: llc -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' -verify-machineinstrs %s -o %t.out 2> %t.err
+; RUN: not llc -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' -verify-machineinstrs %s -o - > %t.out 2> %t.err
; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-OUT < %t.out
; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-ERR < %t.err
; RUN: not --crash llc -global-isel -mtriple aarch64_be %s -o - 2>&1 | FileCheck %s --check-prefix=BIG-ENDIAN
+
; This file checks that the fallback path to selection dag works.
; The test is fragile in the sense that it must be updated to expose
; something that fails with global-isel.
; When we cannot produce a test case anymore, that means we can remove
; the fallback path.
+; -o - > %t.out is used instead of -o %t.out because llc does not write the output
+; file if an error is emitted, but it will still print to stdout.
+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "aarch64--"
diff --git a/llvm/test/CodeGen/AArch64/arm64-preserve-all.ll b/llvm/test/CodeGen/AArch64/arm64-preserve-all.ll
index 778f4e2f9ec01..c04e3111fd16e 100644
--- a/llvm/test/CodeGen/AArch64/arm64-preserve-all.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-preserve-all.ll
@@ -43,7 +43,7 @@ define preserve_allcc void @preserve_all() {
define dso_local void @normal_cc_caller() {
entry:
%v = alloca i32, align 4
- call void asm sideeffect "mov x9, $0", "N,~{x9}"(i32 48879) #2
+ call void asm sideeffect "mov x9, $0", "n,~{x9}"(i32 48879) #2
call void asm sideeffect "movi v9.2d, #0","~{v9}" () #2
diff --git a/llvm/test/CodeGen/AArch64/arm64-preserve-most.ll b/llvm/test/CodeGen/AArch64/arm64-preserve-most.ll
index f8196860aa34f..9e97dace29012 100644
--- a/llvm/test/CodeGen/AArch64/arm64-preserve-most.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-preserve-most.ll
@@ -29,7 +29,7 @@ define preserve_mostcc void @preserve_most() {
define dso_local void @normal_cc_caller() {
entry:
%v = alloca i32, align 4
- call void asm sideeffect "mov x9, $0", "N,~{x9}"(i32 48879) #2
+ call void asm sideeffect "mov x9, $0", "n,~{x9}"(i32 48879) #2
call preserve_mostcc void @preserve_most()
%0 = load i32, ptr %v, align 4
%1 = call i32 asm sideeffect "mov ${0:w}, w9", "=r,r"(i32 %0) #2
More information about the llvm-commits
mailing list