[clang] [Clang] Allow mixed scalar type constraints for inline asm (PR #65465)
Dávid Ferenc Szabó via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 18 08:25:03 PDT 2023
https://github.com/dfszabo updated https://github.com/llvm/llvm-project/pull/65465
>From 69e13118b0669b3e54c5fffc1f5ac60d8b6b2d62 Mon Sep 17 00:00:00 2001
From: dfszabo <szabodavidferenc at gmail.com>
Date: Wed, 6 Sep 2023 13:07:19 +0200
Subject: [PATCH] [Clang] Allow mixed scalar type constraints for inline asm
GCC supports code like "asm volatile ("" : "=r" (i) : "0" (f))" where i is integer type and f is floating point type. Currently this code produces an error with Clang. The change allows mixed scalar types between input and output constraints.
---
clang/test/CodeGen/inline-asm-fp-to-int.c | 8 ++++++++
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 7 +++++--
2 files changed, 13 insertions(+), 2 deletions(-)
create mode 100644 clang/test/CodeGen/inline-asm-fp-to-int.c
diff --git a/clang/test/CodeGen/inline-asm-fp-to-int.c b/clang/test/CodeGen/inline-asm-fp-to-int.c
new file mode 100644
index 000000000000000..cdcdb4c90516a4b
--- /dev/null
+++ b/clang/test/CodeGen/inline-asm-fp-to-int.c
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 %s -emit-llvm -o /dev/null
+
+unsigned test(float f)
+{
+ unsigned i;
+ asm volatile ("" : "=r" (i) : "0" (f));
+ return i;
+}
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index bd1940994a87f0f..50aec396c78b809 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -5687,8 +5687,11 @@ TargetLowering::ParseConstraints(const DataLayout &DL,
std::pair<unsigned, const TargetRegisterClass *> InputRC =
getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
Input.ConstraintVT);
- if ((OpInfo.ConstraintVT.isInteger() !=
- Input.ConstraintVT.isInteger()) ||
+ const bool OpInfoIsScalar = OpInfo.ConstraintVT.isInteger() ||
+ OpInfo.ConstraintVT.isFloatingPoint();
+ const bool InputIsScalar = Input.ConstraintVT.isInteger() ||
+ Input.ConstraintVT.isFloatingPoint();
+ if ((!OpInfoIsScalar && !InputIsScalar) ||
(MatchRC.second != InputRC.second)) {
report_fatal_error("Unsupported asm: input constraint"
" with a matching output constraint of"
More information about the cfe-commits
mailing list