[PATCH] [RFC] Patch for Bug 18808 - clang -O3 -flto drops Target feature flags

suyog sardask01 at gmail.com
Thu Mar 26 03:41:54 PDT 2015


Hi void, dexonsmith, samsonov, rafael,

This is regarding bug 18808 where target feature was set at the front end, but not passed to the linker when using -flto flag (Gold linker)

The option string  "-plugin-opt=-mattr=feature" was not appended in command generated for linker.

Approach for this patch :

In lib/tools/clang/lib/Driver/Tools.cpp file

1. Add a new function getTargetFeatureList() to return the list of target features
2. Modify the getTargetFeature() function to set target-feature separately in clang options
3. In the AddGoldPlugin() function, retrieve the list of target features and append to "-plugin-opt=-mattr=". Multiple features are appended separated by comma.

No make-check regression observed with the patch.

Test case mentioned in 18808 :

$ cat test.c

#include <stdint.h>
#include <stdlib.h>

typedef uint64_t avxreg __attribute__((ext_vector_type(4)));

int main(int argc, char **argv) {
	avxreg x=argc,y=argc;
	for (int i=0; i<argc; i++) {
		int foo = atoi(argv[i]);
		x = y + (avxreg)foo;
		y = x;
	}
	return x.x;
}


Assembly generated before patch :

$ clang -O3 -flto -mavx2 test.c -o test
$ objdump -d test > 1.s
$ cat 1.s

00000000004005d0 <main>:
  4005d0:       55                      push   %rbp
  4005d1:       53                      push   %rbx
  4005d2:       48 83 ec 28             sub    $0x28,%rsp
  4005d6:       48 89 f3                mov    %rsi,%rbx
  4005d9:       89 fd                   mov    %edi,%ebp
  4005db:       48 63 c5                movslq %ebp,%rax
  4005de:       66 48 0f 6e c0          movq   %rax,%xmm0
  4005e3:       66 0f 70 c0 44          pshufd $0x44,%xmm0,%xmm0
  4005e8:       85 c0                   test   %eax,%eax
  4005ea:       7e 51                   jle    40063d <main+0x6d>
  4005ec:       66 0f 6f d0             movdqa %xmm0,%xmm2
  4005f0:       66 0f 7f 14 24          movdqa %xmm2,(%rsp)
  4005f5:       66 0f 7f 44 24 10       movdqa %xmm0,0x10(%rsp)
  4005fb:       48 8b 3b                mov    (%rbx),%rdi
  4005fe:       31 f6                   xor    %esi,%esi
  400600:       ba 0a 00 00 00          mov    $0xa,%edx
  400605:       e8 c6 fe ff ff          callq  4004d0 <strtol at plt>
  40060a:       66 0f 6f 14 24          movdqa (%rsp),%xmm2
  40060f:       48 98                   cltq
  400611:       66 48 0f 6e c0          movq   %rax,%xmm0
  400616:       66 0f 70 c0 44          pshufd $0x44,%xmm0,%xmm0
  40061b:       66 0f d4 d0             paddq  %xmm0,%xmm2
  40061f:       66 0f 6f 4c 24 10       movdqa 0x10(%rsp),%xmm1
  400625:       66 0f d4 c8             paddq  %xmm0,%xmm1
  400629:       66 0f 7f 4c 24 10       movdqa %xmm1,0x10(%rsp)
  40062f:       66 0f 6f 44 24 10       movdqa 0x10(%rsp),%xmm0
  400635:       48 83 c3 08             add    $0x8,%rbx
  400639:       ff cd                   dec    %ebp
  40063b:       75 b3                   jne    4005f0 <main+0x20>
  40063d:       66 48 0f 7e c0          movq   %xmm0,%rax
  400642:       48 83 c4 28             add    $0x28,%rsp
  400646:       5b                      pop    %rbx
  400647:       5d                      pop    %rbp
  400648:       c3                      retq
  400649:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)


Assembly generated after patch :

$ clang -O3 -flto -mavx2 test.c -o test
$ objdump -d test > 2.s
$ cat 2.s

0000000004005d0 <main>:
  4005d0:       55                      push   %rbp
  4005d1:       53                      push   %rbx
  4005d2:       48 83 ec 28             sub    $0x28,%rsp
  4005d6:       48 89 f3                mov    %rsi,%rbx
  4005d9:       89 fd                   mov    %edi,%ebp
  4005db:       48 63 c5                movslq %ebp,%rax
  4005de:       c4 e1 f9 6e c0          vmovq  %rax,%xmm0
  4005e3:       c4 e2 7d 19 c0          vbroadcastsd %xmm0,%ymm0
  4005e8:       85 c0                   test   %eax,%eax
  4005ea:       7e 42                   jle    40062e <main+0x5e>
  4005ec:       0f 1f 40 00             nopl   0x0(%rax)
  4005f0:       c5 fc 11 04 24          vmovups %ymm0,(%rsp)
  4005f5:       48 8b 3b                mov    (%rbx),%rdi
  4005f8:       31 f6                   xor    %esi,%esi
  4005fa:       ba 0a 00 00 00          mov    $0xa,%edx
  4005ff:       c5 f8 77                vzeroupper
  400602:       e8 c9 fe ff ff          callq  4004d0 <strtol at plt>
  400607:       48 98                   cltq
  400609:       c4 e1 f9 6e c0          vmovq  %rax,%xmm0
  40060e:       c4 e2 7d 59 c0          vpbroadcastq %xmm0,%ymm0
  400613:       c5 fe 6f 0c 24          vmovdqu (%rsp),%ymm1
  400618:       c5 fd d4 c9             vpaddq %ymm1,%ymm0,%ymm1
  40061c:       c5 fe 7f 0c 24          vmovdqu %ymm1,(%rsp)
  400621:       c5 fc 10 04 24          vmovups (%rsp),%ymm0
  400626:       48 83 c3 08             add    $0x8,%rbx
  40062a:       ff cd                   dec    %ebp
  40062c:       75 c2                   jne    4005f0 <main+0x20>
  40062e:       c4 e1 f9 7e c0          vmovq  %xmm0,%rax
  400633:       48 83 c4 28             add    $0x28,%rsp
  400637:       5b                      pop    %rbx
  400638:       5d                      pop    %rbp
  400639:       c5 f8 77                vzeroupper
  40063c:       c3                      retq
  40063d:       0f 1f 00                nopl   (%rax)


Visible clearly from above that avx instructions are generated after applying the patch.

Can some one please help in reviewing this patch? 
Also, can someone help in forming a test case for this patch? I couldn't figure out how to write test case for checking the generation of avx instructions.

Regards,
Suyog

REPOSITORY
  rL LLVM

http://reviews.llvm.org/D8629

Files:
  lib/Driver/Tools.cpp

Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -1544,6 +1544,10 @@
   }
 }
 
+static void getTargetFeatureList(const Driver &D, const llvm::Triple &Triple,
+                                 const ArgList &Args,
+                                 std::vector<const char *> &Names, bool ForAS);
+
 static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
                           ArgStringList &CmdArgs) {
   // Tell the linker to load the plugin. This has to come before AddLinkerInputs
@@ -1560,6 +1564,20 @@
   std::string CPU = getCPUName(Args, ToolChain.getTriple());
   if (!CPU.empty())
     CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
+
+  std::vector<const char *> Names;
+  getTargetFeatureList(ToolChain.getDriver(), ToolChain.getTriple(), Args,
+                       Names, false);
+
+  if (!Names.empty()) {
+    std::string List;
+    for (unsigned i = 0; i < Names.size() - 1; ++i) {
+      List.append(Names[i]);
+      List.append(",");
+    }
+    List.append(Names[Names.size() - 1]);
+    CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=-mattr=") + List));
+  }
 }
 
 static void getX86TargetFeatures(const Driver & D,
@@ -1855,10 +1873,11 @@
   }
 }
 
-static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
-                              const ArgList &Args, ArgStringList &CmdArgs,
-                              bool ForAS) {
+static void getTargetFeatureList(const Driver &D, const llvm::Triple &Triple,
+                                 const ArgList &Args,
+                                 std::vector<const char *> &Names, bool ForAS) {
   std::vector<const char *> Features;
+
   switch (Triple.getArch()) {
   default:
     break;
@@ -1911,9 +1930,19 @@
     unsigned Last = LastI->second;
     if (Last != I)
       continue;
+    Names.push_back(Name);
+  }
+}
+
+static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
+                              const ArgList &Args, ArgStringList &CmdArgs,
+                              bool ForAs) {
 
+  std::vector<const char *> Names;
+  getTargetFeatureList(D, Triple, Args, Names, ForAs);
+  for (unsigned i = 0; i < Names.size(); i++) {
     CmdArgs.push_back("-target-feature");
-    CmdArgs.push_back(Name);
+    CmdArgs.push_back(Names[i]);
   }
 }

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8629.22705.patch
Type: text/x-patch
Size: 2431 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150326/4d60e30b/attachment.bin>


More information about the cfe-commits mailing list