<div dir="ltr">Hi Ahmed,<div><br></div><div>A quick note: I think this is going to fail in the presence of the target attribute. I.e. if someone decorates a function with __attribute__((target("avx512"))) this is unlikely to catch that.</div><div><br></div><div>Also, should we do this for all of the x86 OSes?</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 27, 2015 at 3:31 PM Ahmed Bougacha via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ab<br>
Date: Thu Aug 27 17:30:38 2015<br>
New Revision: 246229<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=246229&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=246229&view=rev</a><br>
Log:<br>
[X86] Conditionalize Darwin MaxVectorAlign on the presence of AVX.<br>
<br>
There's no point in using a larger alignment if we have no instructions<br>
that would benefit from it.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D12389" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12389</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Basic/Targets.cpp<br>
    cfe/trunk/test/CodeGen/vector-alignment.c<br>
<br>
Modified: cfe/trunk/lib/Basic/Targets.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=246229&r1=246228&r2=246229&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=246229&r1=246228&r2=246229&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Targets.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Targets.cpp Thu Aug 27 17:30:38 2015<br>
@@ -3629,13 +3629,21 @@ public:<br>
     LongDoubleWidth = 128;<br>
     LongDoubleAlign = 128;<br>
     SuitableAlign = 128;<br>
-    MaxVectorAlign = 256;<br>
     SizeType = UnsignedLong;<br>
     IntPtrType = SignedLong;<br>
     DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";<br>
     HasAlignMac68kSupport = true;<br>
   }<br>
<br>
+  bool handleTargetFeatures(std::vector<std::string> &Features,<br>
+                            DiagnosticsEngine &Diags) override {<br>
+    if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,<br>
+                                                                  Diags))<br>
+      return false;<br>
+    // Now that we know if we have AVX, we can decide how to align vectors.<br>
+    MaxVectorAlign = hasFeature("avx") ? 256 : 128;<br>
+    return true;<br>
+  }<br>
 };<br>
<br>
 // x86-32 Windows target<br>
@@ -3986,13 +3994,22 @@ public:<br>
   DarwinX86_64TargetInfo(const llvm::Triple &Triple)<br>
       : DarwinTargetInfo<X86_64TargetInfo>(Triple) {<br>
     Int64Type = SignedLongLong;<br>
-    MaxVectorAlign = 256;<br>
     // The 64-bit iOS simulator uses the builtin bool type for Objective-C.<br>
     llvm::Triple T = llvm::Triple(Triple);<br>
     if (T.isiOS())<br>
       UseSignedCharForObjCBool = false;<br>
     DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";<br>
   }<br>
+<br>
+  bool handleTargetFeatures(std::vector<std::string> &Features,<br>
+                            DiagnosticsEngine &Diags) override {<br>
+    if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,<br>
+                                                                  Diags))<br>
+      return false;<br>
+    // Now that we know if we have AVX, we can decide how to align vectors.<br>
+    MaxVectorAlign = hasFeature("avx") ? 256 : 128;<br>
+    return true;<br>
+  }<br>
 };<br>
<br>
 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {<br>
<br>
Modified: cfe/trunk/test/CodeGen/vector-alignment.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/vector-alignment.c?rev=246229&r1=246228&r2=246229&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/vector-alignment.c?rev=246229&r1=246228&r2=246229&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/vector-alignment.c (original)<br>
+++ cfe/trunk/test/CodeGen/vector-alignment.c Thu Aug 27 17:30:38 2015<br>
@@ -1,38 +1,51 @@<br>
-// RUN: %clang_cc1 -w -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s<br>
+// RUN: %clang_cc1 -w -triple x86_64-apple-darwin10 \<br>
+// RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix=ALL --check-prefix=SSE<br>
+// RUN: %clang_cc1 -w -triple   i386-apple-darwin10 \<br>
+// RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix=ALL --check-prefix=SSE<br>
+// RUN: %clang_cc1 -w -triple x86_64-apple-darwin10 -target-feature +avx \<br>
+// RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX<br>
+// RUN: %clang_cc1 -w -triple   i386-apple-darwin10 -target-feature +avx \<br>
+// RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix=ALL --check-prefix=AVX<br>
 // rdar://11759609<br>
<br>
 // At or below target max alignment with no aligned attribute should align based<br>
 // on the size of vector.<br>
 double __attribute__((vector_size(16))) v1;<br>
-// CHECK: @v1 {{.*}}, align 16<br>
+// SSE: @v1 {{.*}}, align 16<br>
+// AVX: @v1 {{.*}}, align 16<br>
 double __attribute__((vector_size(32))) v2;<br>
-// CHECK: @v2 {{.*}}, align 32<br>
+// SSE: @v2 {{.*}}, align 16<br>
+// AVX: @v2 {{.*}}, align 32<br>
<br>
 // Alignment above target max alignment with no aligned attribute should align<br>
 // based on the target max.<br>
 double __attribute__((vector_size(64))) v3;<br>
-// CHECK: @v3 {{.*}}, align 32<br>
+// SSE: @v3 {{.*}}, align 16<br>
+// AVX: @v3 {{.*}}, align 32<br>
 double __attribute__((vector_size(1024))) v4;<br>
-// CHECK: @v4 {{.*}}, align 32<br>
+// SSE: @v4 {{.*}}, align 16<br>
+// AVX: @v4 {{.*}}, align 32<br>
<br>
 // Aliged attribute should always override.<br>
 double __attribute__((vector_size(16), aligned(16))) v5;<br>
-// CHECK: @v5 {{.*}}, align 16<br>
+// ALL: @v5 {{.*}}, align 16<br>
 double __attribute__((vector_size(16), aligned(64))) v6;<br>
-// CHECK: @v6 {{.*}}, align 64<br>
+// ALL: @v6 {{.*}}, align 64<br>
 double __attribute__((vector_size(32), aligned(16))) v7;<br>
-// CHECK: @v7 {{.*}}, align 16<br>
+// ALL: @v7 {{.*}}, align 16<br>
 double __attribute__((vector_size(32), aligned(64))) v8;<br>
-// CHECK: @v8 {{.*}}, align 64<br>
+// ALL: @v8 {{.*}}, align 64<br>
<br>
 // Check non-power of 2 widths.<br>
 double __attribute__((vector_size(24))) v9;<br>
-// CHECK: @v9 {{.*}}, align 32<br>
+// SSE: @v9 {{.*}}, align 16<br>
+// AVX: @v9 {{.*}}, align 32<br>
 double __attribute__((vector_size(40))) v10;<br>
-// CHECK: @v10 {{.*}}, align 32<br>
+// SSE: @v10 {{.*}}, align 16<br>
+// AVX: @v10 {{.*}}, align 32<br>
<br>
 // Check non-power of 2 widths with aligned attribute.<br>
 double __attribute__((vector_size(24), aligned(64))) v11;<br>
-// CHECK: @v11 {{.*}}, align 64<br>
+// ALL: @v11 {{.*}}, align 64<br>
 double __attribute__((vector_size(80), aligned(16))) v12;<br>
-// CHECK: @v12 {{.*}}, align 16<br>
+// ALL: @v12 {{.*}}, align 16<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>