[PATCH] D22713: Fix - CodeExtractor : Inherit Target Dependent Attributes from the parent function.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 31 20:23:14 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL277315: Fix - CodeExtractor : Inherit Target Dependent Attributes from the parent… (authored by silvas).

Changed prior to commit:
  https://reviews.llvm.org/D22713?vs=66083&id=66275#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D22713

Files:
  llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
  llvm/trunk/test/Transforms/CodeExtractor/InheritTargetAttributes.ll

Index: llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
+++ llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
@@ -351,7 +351,22 @@
   // If the old function is no-throw, so is the new one.
   if (oldFunction->doesNotThrow())
     newFunction->setDoesNotThrow();
-  
+
+  // Inherit the uwtable attribute if we need to.
+  if (oldFunction->hasUWTable())
+    newFunction->setHasUWTable();
+
+  // Inherit all of the target dependent attributes.
+  //  (e.g. If the extracted region contains a call to an x86.sse
+  //  instruction we need to make sure that the extracted region has the
+  //  "target-features" attribute allowing it to be lowered.
+  // FIXME: This should be changed to check to see if a specific
+  //           attribute can not be inherited.
+  AttributeSet OldFnAttrs = oldFunction->getAttributes().getFnAttributes();
+  AttrBuilder AB(OldFnAttrs, AttributeSet::FunctionIndex);
+  for (auto Attr : AB.td_attrs())
+    newFunction->addFnAttr(Attr.first, Attr.second);
+
   newFunction->getBasicBlockList().push_back(newRootNode);
 
   // Create an iterator to name all of the arguments we inserted.
Index: llvm/trunk/test/Transforms/CodeExtractor/InheritTargetAttributes.ll
===================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/InheritTargetAttributes.ll
+++ llvm/trunk/test/Transforms/CodeExtractor/InheritTargetAttributes.ll
@@ -0,0 +1,40 @@
+; RUN: opt < %s -partial-inliner | llc -filetype=null
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+; This testcase checks to see if CodeExtractor properly inherits
+;   target specific attributes for the extracted function. This can
+;   cause certain instructions that depend on the attributes to not
+;   be lowered. Like in this test where we try to 'select' the blendvps
+;   intrinsic on x86 that requires the +sse4.1 target feature.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: nounwind readnone
+declare <4 x float> @llvm.x86.sse41.blendvps(<4 x float>, <4 x float>, <4 x float>) #0
+
+; Function Attrs: nounwind uwtable
+define <4 x float> @inlinedFunc(i1, <4 x float>, <4 x float>, <4 x float>) #1 {
+entry:
+  br i1 %0, label %if.then, label %return
+if.then:
+; Target intrinsic that requires sse4.1
+  %target.call = call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %1, <4 x float> %2, <4 x float> %3)
+  br label %return
+return:             ; preds = %entry
+  %retval = phi <4 x float> [ zeroinitializer, %entry ], [ %target.call, %if.then ]
+  ret <4 x float> %retval
+}
+
+; Function Attrs: nounwind uwtable
+define <4 x float> @dummyCaller(i1, <4 x float>, <4 x float>, <4 x float>) #1 {
+entry:
+  %val = call <4 x float> @inlinedFunc(i1 %0, <4 x float> %1, <4 x float> %2, <4 x float> %3)
+  ret <4 x float> %val
+}
+
+
+attributes #0 = { nounwind readnone }
+attributes #1 = { nounwind uwtable "target-cpu"="x86-64" "target-features"="+sse4.1" }
+
+; CHECK: define {{.*}} @inlinedFunc.1_if.then{{.*}} [[COUNT1:#[0-9]+]]
+; CHECK: [[COUNT1]] = { {{.*}} "target-cpu"="x86-64" "target-features"="+sse4.1" }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22713.66275.patch
Type: text/x-patch
Size: 3267 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160801/3b23084f/attachment.bin>


More information about the llvm-commits mailing list