Files
clang-p2996/llvm/test/Transforms/CodeExtractor/InheritTargetAttributes.ll
Sean Silva a0a802abe3 Fix - CodeExtractor : Inherit Target Dependent Attributes from the parent function.
When extracting a set of blocks make sure to inherit all of the target
dependent attributes to make sure that the function will be valid for
lowering. One example is the "target-features" attribute for x86, if the
extracted region has functionality that relies on a specific feature it
will fail to be lowered.
This also allows for extracted functions to be valid for inlining, at
least back into the parent function, as the target attributes are tested
when inlining for compatibility.

Patch by River Riddle!

Differential Revision: https://reviews.llvm.org/D22713

llvm-svn: 277315
2016-08-01 03:15:32 +00:00

41 lines
1.6 KiB
LLVM

; 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" }