From: Diogo N. Sampaio Date: Tue, 3 Sep 2019 09:16:44 +0000 (+0000) Subject: [ARM NEON] Avoid duplicated decarations X-Git-Tag: llvmorg-11-init~10213 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7a65f5ebee3fd89d195a4051d349a6ce2d2df21e;p=platform%2Fupstream%2Fllvm.git [ARM NEON] Avoid duplicated decarations Summary: The declaration of arm neon intrinsics that are "big endian safe" print the same code for big and small endian targets. This patch avoids duplicates by checking if an intrinsic is safe to have a single definition. (decreases header 11k lines out of 73k). Reviewers: t.p.northover, ostannard, labrinea Reviewed By: ostannard Subscribers: kristof.beyls, cfe-commits, olista01 Tags: #clang Differential Revision: https://reviews.llvm.org/D66588 llvm-svn: 370716 --- diff --git a/clang/utils/TableGen/NeonEmitter.cpp b/clang/utils/TableGen/NeonEmitter.cpp index b21f6b1..d5a9744 100644 --- a/clang/utils/TableGen/NeonEmitter.cpp +++ b/clang/utils/TableGen/NeonEmitter.cpp @@ -332,6 +332,17 @@ class Intrinsic { NeonEmitter &Emitter; std::stringstream OS; + bool isBigEndianSafe() const { + if (BigEndianSafe) + return true; + + for (const auto &T : Types){ + if (T.isVector() && T.getNumElements() > 1) + return false; + } + return true; + } + public: Intrinsic(Record *R, StringRef Name, StringRef Proto, TypeSpec OutTS, TypeSpec InTS, ClassKind CK, ListInit *Body, NeonEmitter &Emitter, @@ -1293,7 +1304,7 @@ void Intrinsic::emitReverseVariable(Variable &Dest, Variable &Src) { } void Intrinsic::emitArgumentReversal() { - if (BigEndianSafe) + if (isBigEndianSafe()) return; // Reverse all vector arguments. @@ -1314,7 +1325,7 @@ void Intrinsic::emitArgumentReversal() { } void Intrinsic::emitReturnReversal() { - if (BigEndianSafe) + if (isBigEndianSafe()) return; if (!getReturnType().isVector() || getReturnType().isVoid() || getReturnType().getNumElements() == 1) @@ -1578,7 +1589,10 @@ std::pair Intrinsic::DagEmitter::emitDagCall(DagInit *DI) { Intr.Dependencies.insert(&Callee); // Now create the call itself. - std::string S = CallPrefix.str() + Callee.getMangledName(true) + "("; + std::string S = ""; + if (!Callee.isBigEndianSafe()) + S += CallPrefix.str(); + S += Callee.getMangledName(true) + "("; for (unsigned I = 0; I < DI->getNumArgs() - 1; ++I) { if (I != 0) S += ", "; @@ -1889,6 +1903,11 @@ Intrinsic::DagEmitter::emitDagArg(Init *Arg, std::string ArgName) { } std::string Intrinsic::generate() { + // Avoid duplicated code for big and little endian + if (isBigEndianSafe()) { + generateImpl(false, "", ""); + return OS.str(); + } // Little endian intrinsics are simple and don't require any argument // swapping. OS << "#ifdef __LITTLE_ENDIAN__\n";