[PATCH] D38479: Make -mgeneral-regs-only more like GCC's

Renato Golin via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 4 05:41:41 PDT 2017


rengolin added a comment.

In https://reviews.llvm.org/D38479#886587, @efriedma wrote:

> 1. We don't correctly ignore inline asm clobbers for registers which aren't allocatable (https://bugs.llvm.org/show_bug.cgi?id=30792)


This looks like a different (but related) issue. That should be fixed in the back-end, regardless of the new error messages.

> 2. We don't diagnose calls which need vector registers according to the C calling convention.

The function that checks for it returns true for vectors (`lib/Sema/SemaExprCXX.cpp:7487`). However, the tests cover floating point, but they don't cover vector calls (arm_neon.h).

> 3. We don't diagnose operations which have to be lowered to libcalls which need vector registers according to the C calling convention (fptosi, @llvm.sin.*, etc.).

Yup. That's bad.

> All three of these could be addressesed in the AArch64 backend in a straightforward manner.

I worry about declarations and front-end optimisations, which may move the line info to a completely different place (where it's used, for example). But I have no basis for that worry. :)

> Diagnosing floating-point operations in Sema in addition to whatever backend fixes we might want is fine, I guess, but I don't really like making "-mgeneral-regs-only" into "-mno-implicit-float" plus some diagnostics; other frontends don't benefit from this checking, and using no-implicit-float is asking for an obscure miscompile if IR generation or an optimization accidentally produces a floating-point value.

I agree with both statements. But it would be good to have the errors in Sema in addition to the back-end fixes, if there are cases where Clang's diagnostics is more precise on line info and carat position.



================
Comment at: lib/Sema/SemaExprCXX.cpp:7477
+static bool typeHasFloatingOrVectorComponent(
+    QualType Ty, llvm::SmallDenseMap<const RecordType *, bool, 8> &TypeCache) {
+  if (Ty.isNull())
----------------
The `TypeCache` object seems local.

It doesn't look like it needs to survive outside of this function, as per its usage and the comment:

    // We may see recursive types in broken code.

and it just adds another argument passing.


https://reviews.llvm.org/D38479





More information about the cfe-commits mailing list