Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
This revision was automatically updated to reflect the committed changes. Closed by commit rL277166: Initial support for vectorization using svml (short vector math library). (authored by mmasten). Changed prior to commit: https://reviews.llvm.org/D19544?vs=65152&id=66141#toc Repository: rL LLVM https://reviews.llvm.org/D19544 Files: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls.ll Index: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h === --- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h +++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h @@ -85,8 +85,9 @@ /// addVectorizableFunctionsFromVecLib for filling up the tables of /// vectorizable functions. enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use Accelerate framework. +SVML// Intel short vector math library. }; TargetLibraryInfoImpl(); Index: llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls.ll === --- llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls.ll +++ llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls.ll @@ -0,0 +1,185 @@ +; RUN: opt -vector-library=SVML -loop-vectorize -S < %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: @sin_f32 +; CHECK: <4 x float> @__svml_sinf4 +; CHECK: ret + +declare float @sinf(float) #0 + +define void @sin_f32(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %tmp = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %tmp to float + %call = tail call fast float @sinf(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; CHECK-LABEL: @cos_f32 +; CHECK: <4 x float> @__svml_cosf4 +; CHECK: ret + +declare float @cosf(float) #0 + +define void @cos_f32(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %tmp = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %tmp to float + %call = tail call fast float @cosf(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; CHECK-LABEL: @exp_f32 +; CHECK: <4 x float> @__svml_expf4 +; CHECK: ret + +declare float @expf(float) #0 + +define void @exp_f32(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %tmp = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %tmp to float + %call = tail call fast float @expf(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; CHECK-LABEL: @exp_f32_intrin +; CHECK: <4 x float> @__svml_expf4 +; CHECK: ret + +declare float @llvm.exp.f32(float) #0 + +define void @exp_f32_intrin(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %tmp = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %tmp to float + %call = tail call fast float @llvm.exp.f32(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.b
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. I was just recently given commit privileges, so I can do it. Thanks Hal. https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
hfinkel added a comment. In https://reviews.llvm.org/D19544#492258, @mmasten wrote: > I think this is just saying that some of the weird types are not supported on > all targets. For now, is it ok to proceed with checking this code in? Correct. In https://reviews.llvm.org/D19544#493403, @mmasten wrote: > Thanks Michael. The tests have been updated. > > Matt Do you need someone to commit this for you? https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. Thanks Michael. The tests have been updated. Matt https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten updated this revision to Diff 65152. https://reviews.llvm.org/D19544 Files: include/llvm/Analysis/TargetLibraryInfo.h lib/Analysis/TargetLibraryInfo.cpp test/Transforms/LoopVectorize/X86/svml-calls.ll Index: lib/Analysis/TargetLibraryInfo.cpp === --- lib/Analysis/TargetLibraryInfo.cpp +++ lib/Analysis/TargetLibraryInfo.cpp @@ -23,6 +23,8 @@ "No vector functions library"), clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate", "Accelerate framework"), + clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", + "Intel SVML library"), clEnumValEnd)); const char *const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = { @@ -1074,6 +1076,75 @@ addVectorizableFunctions(VecFuncs); break; } + case SVML: { +const VecDesc VecFuncs[] = { +{"sin", "__svml_sin2", 2}, +{"sin", "__svml_sin4", 4}, +{"sin", "__svml_sin8", 8}, + +{"sinf", "__svml_sinf4", 4}, +{"sinf", "__svml_sinf8", 8}, +{"sinf", "__svml_sinf16", 16}, + +{"cos", "__svml_cos2", 2}, +{"cos", "__svml_cos4", 4}, +{"cos", "__svml_cos8", 8}, + +{"cosf", "__svml_cosf4", 4}, +{"cosf", "__svml_cosf8", 8}, +{"cosf", "__svml_cosf16", 16}, + +{"pow", "__svml_pow2", 2}, +{"pow", "__svml_pow4", 4}, +{"pow", "__svml_pow8", 8}, + +{"powf", "__svml_powf4", 4}, +{"powf", "__svml_powf8", 8}, +{"powf", "__svml_powf16", 16}, + +{"llvm.pow.f64", "__svml_pow2", 2}, +{"llvm.pow.f64", "__svml_pow4", 4}, +{"llvm.pow.f64", "__svml_pow8", 8}, + +{"llvm.pow.f32", "__svml_powf4", 4}, +{"llvm.pow.f32", "__svml_powf8", 8}, +{"llvm.pow.f32", "__svml_powf16", 16}, + +{"exp", "__svml_exp2", 2}, +{"exp", "__svml_exp4", 4}, +{"exp", "__svml_exp8", 8}, + +{"expf", "__svml_expf4", 4}, +{"expf", "__svml_expf8", 8}, +{"expf", "__svml_expf16", 16}, + +{"llvm.exp.f64", "__svml_exp2", 2}, +{"llvm.exp.f64", "__svml_exp4", 4}, +{"llvm.exp.f64", "__svml_exp8", 8}, + +{"llvm.exp.f32", "__svml_expf4", 4}, +{"llvm.exp.f32", "__svml_expf8", 8}, +{"llvm.exp.f32", "__svml_expf16", 16}, + +{"log", "__svml_log2", 2}, +{"log", "__svml_log4", 4}, +{"log", "__svml_log8", 8}, + +{"logf", "__svml_logf4", 4}, +{"logf", "__svml_logf8", 8}, +{"logf", "__svml_logf16", 16}, + +{"llvm.log.f64", "__svml_log2", 2}, +{"llvm.log.f64", "__svml_log4", 4}, +{"llvm.log.f64", "__svml_log8", 8}, + +{"llvm.log.f32", "__svml_logf4", 4}, +{"llvm.log.f32", "__svml_logf8", 8}, +{"llvm.log.f32", "__svml_logf16", 16}, +}; +addVectorizableFunctions(VecFuncs); +break; + } case NoLibrary: break; } Index: include/llvm/Analysis/TargetLibraryInfo.h === --- include/llvm/Analysis/TargetLibraryInfo.h +++ include/llvm/Analysis/TargetLibraryInfo.h @@ -85,8 +85,9 @@ /// addVectorizableFunctionsFromVecLib for filling up the tables of /// vectorizable functions. enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use Accelerate framework. +SVML// Intel short vector math library. }; TargetLibraryInfoImpl(); Index: test/Transforms/LoopVectorize/X86/svml-calls.ll === --- test/Transforms/LoopVectorize/X86/svml-calls.ll +++ test/Transforms/LoopVectorize/X86/svml-calls.ll @@ -0,0 +1,185 @@ +; RUN: opt -vector-library=SVML -loop-vectorize -S < %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: @sin_f32 +; CHECK: <4 x float> @__svml_sinf4 +; CHECK: ret + +declare float @sinf(float) #0 + +define void @sin_f32(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %tmp = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %tmp to float + %call = tail call fast float @sinf(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; CHECK-LABEL: @cos_f32 +; CHECK: <4 x float> @__svm
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mzolotukhin accepted this revision. mzolotukhin added a comment. This revision is now accepted and ready to land. LGTM with a small nit: could you please run `opt -instnamer` on your test (it'll replace `%0`, `%1`,... with `%tmp0`, `%tmp1` etc, making it easier to modify test in future)? Thanks, Michael https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. I think this is just saying that some of the weird types are not supported on all targets. For now, is it ok to proceed with checking this code in? Thanks, Matt https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten updated this revision to Diff 64571. https://reviews.llvm.org/D19544 Files: include/llvm/Analysis/TargetLibraryInfo.h lib/Analysis/TargetLibraryInfo.cpp test/Transforms/LoopVectorize/X86/svml-calls.ll Index: lib/Analysis/TargetLibraryInfo.cpp === --- lib/Analysis/TargetLibraryInfo.cpp +++ lib/Analysis/TargetLibraryInfo.cpp @@ -23,6 +23,8 @@ "No vector functions library"), clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate", "Accelerate framework"), + clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", + "Intel SVML library"), clEnumValEnd)); const char *const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = { @@ -1074,6 +1076,75 @@ addVectorizableFunctions(VecFuncs); break; } + case SVML: { +const VecDesc VecFuncs[] = { +{"sin", "__svml_sin2", 2}, +{"sin", "__svml_sin4", 4}, +{"sin", "__svml_sin8", 8}, + +{"sinf", "__svml_sinf4", 4}, +{"sinf", "__svml_sinf8", 8}, +{"sinf", "__svml_sinf16", 16}, + +{"cos", "__svml_cos2", 2}, +{"cos", "__svml_cos4", 4}, +{"cos", "__svml_cos8", 8}, + +{"cosf", "__svml_cosf4", 4}, +{"cosf", "__svml_cosf8", 8}, +{"cosf", "__svml_cosf16", 16}, + +{"pow", "__svml_pow2", 2}, +{"pow", "__svml_pow4", 4}, +{"pow", "__svml_pow8", 8}, + +{"powf", "__svml_powf4", 4}, +{"powf", "__svml_powf8", 8}, +{"powf", "__svml_powf16", 16}, + +{"llvm.pow.f64", "__svml_pow2", 2}, +{"llvm.pow.f64", "__svml_pow4", 4}, +{"llvm.pow.f64", "__svml_pow8", 8}, + +{"llvm.pow.f32", "__svml_powf4", 4}, +{"llvm.pow.f32", "__svml_powf8", 8}, +{"llvm.pow.f32", "__svml_powf16", 16}, + +{"exp", "__svml_exp2", 2}, +{"exp", "__svml_exp4", 4}, +{"exp", "__svml_exp8", 8}, + +{"expf", "__svml_expf4", 4}, +{"expf", "__svml_expf8", 8}, +{"expf", "__svml_expf16", 16}, + +{"llvm.exp.f64", "__svml_exp2", 2}, +{"llvm.exp.f64", "__svml_exp4", 4}, +{"llvm.exp.f64", "__svml_exp8", 8}, + +{"llvm.exp.f32", "__svml_expf4", 4}, +{"llvm.exp.f32", "__svml_expf8", 8}, +{"llvm.exp.f32", "__svml_expf16", 16}, + +{"log", "__svml_log2", 2}, +{"log", "__svml_log4", 4}, +{"log", "__svml_log8", 8}, + +{"logf", "__svml_logf4", 4}, +{"logf", "__svml_logf8", 8}, +{"logf", "__svml_logf16", 16}, + +{"llvm.log.f64", "__svml_log2", 2}, +{"llvm.log.f64", "__svml_log4", 4}, +{"llvm.log.f64", "__svml_log8", 8}, + +{"llvm.log.f32", "__svml_logf4", 4}, +{"llvm.log.f32", "__svml_logf8", 8}, +{"llvm.log.f32", "__svml_logf16", 16}, +}; +addVectorizableFunctions(VecFuncs); +break; + } case NoLibrary: break; } Index: include/llvm/Analysis/TargetLibraryInfo.h === --- include/llvm/Analysis/TargetLibraryInfo.h +++ include/llvm/Analysis/TargetLibraryInfo.h @@ -85,8 +85,9 @@ /// addVectorizableFunctionsFromVecLib for filling up the tables of /// vectorizable functions. enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use Accelerate framework. +SVML// Intel short vector math library. }; TargetLibraryInfoImpl(); Index: test/Transforms/LoopVectorize/X86/svml-calls.ll === --- test/Transforms/LoopVectorize/X86/svml-calls.ll +++ test/Transforms/LoopVectorize/X86/svml-calls.ll @@ -0,0 +1,185 @@ +; RUN: opt -vector-library=SVML -loop-vectorize -S < %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: @sin_f32 +; CHECK: <4 x float> @__svml_sinf4 +; CHECK: ret + +declare float @sinf(float) nounwind readnone + +define void @sin_f32(float* nocapture %varray) { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %0 = trunc i64 %indvars.iv to i32 + %conv = sitofp i32 %0 to float + %call = tail call fast float @sinf(float %conv) + %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 1000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; CHECK-LABEL: @cos_f32 +; CHECK: <4 x fl
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
spatel added a subscriber: davide. spatel added a comment. In https://reviews.llvm.org/D19544#488589, @mmasten wrote: > In the process of writing test cases, I noticed that a loop with a call to > llvm.log.f32 was not getting vectorized due to cost modeling. When forcing > vectorization on the loop and throwing -fveclib=SVML, the loop was vectorized > with a widened intrinsic instead of the svml call. Is this correct? I would > have expected to get the svml call. In light of this, wouldn't it be better > to represent the math calls with vector intrinsics and let CodeGenPrepare or > the backends decide how to lower them? I don't know the answer, but I'm curious about this too for an unrelated change in LibCallSimplifier (cc @davide). The LangRef has this boilerplate for all target-independent math intrinsics: "Not all targets support all types however." Is that only intended for the weird types (x86_fp80, ppc_fp128, fp128?), or does it mean that we shouldn't create these intrinsics for vectors with standard FP types (eg, v4f32)? https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. In the process of writing test cases, I noticed that a loop with a call to llvm.log.f32 was not getting vectorized due to cost modeling. When forcing vectorization on the loop and throwing -fveclib=SVML, the loop was vectorized with a widened intrinsic instead of the svml call. Is this correct? I would have expected to get the svml call. In light of this, wouldn't it be better to represent the math calls with vector intrinsics and let CodeGenPrepare or the backends decide how to lower them? Thanks, Matt https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
hfinkel added a comment. In https://reviews.llvm.org/D19544#485677, @mmasten wrote: > Thanks for reviewing. One concern I have going forward is the number of > entries that will appear in the switch statement inside > addVectorizableFunctionsFromVecLib(). I assume that the right thing to do is > to replace this with something that is TableGen'd? I completely agree; this seems like a good candidate to be TableGen'd. > Also, I just wanted to point out that some of these entries will result in > svml calls that are not legal. E.g., __svml_sinf32 does not actually exist in > the library, but can be legalized in case one explicitly sets a vector length > of 32. Although these types of cases are probably not common, I wanted to > bring this to your attention since the legalization piece of this work will > be reviewed and committed separately. If needed, I can remove those entries > until the legalization is in place. Yes, let's start only with the directly-legal calls. https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. Thanks for reviewing. One concern I have going forward is the number of entries that will appear in the switch statement inside addVectorizableFunctionsFromVecLib(). I assume that the right thing to do is to replace this with something that is TableGen'd? Also, I just wanted to point out that some of these entries will result in svml calls that are not legal. E.g., __svml_sinf32 does not actually exist in the library, but can be legalized in case one explicitly sets a vector length of 32. Although these types of cases are probably not common, I wanted to bring this to your attention since the legalization piece of this work will be reviewed and committed separately. If needed, I can remove those entries until the legalization is in place. https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
hfinkel added a comment. In https://reviews.llvm.org/D19544#484439, @spatel wrote: > Hi Matt - > > This looks like the right first step in the path that Hal suggested, except I > think we need a test case for each function that you want to enable. Please > see test/Transforms/LoopVectorize/X86/veclib-calls.ll as a reference for how > to do that. Agreed. Once this has regression tests it should be good to go. Thanks for continuing to work on this! https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
spatel added a comment. Hi Matt - This looks like the right first step in the path that Hal suggested, except I think we need a test case for each function that you want to enable. Please see test/Transforms/LoopVectorize/X86/veclib-calls.ll as a reference for how to do that. https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a comment. Hello all, Just wanted to see if you guys have some time to review. Thanks, Matt https://reviews.llvm.org/D19544 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten added a subscriber: cfe-commits. mmasten updated this revision to Diff 61110. http://reviews.llvm.org/D19544 Files: include/clang/Frontend/CodeGenOptions.def include/clang/Frontend/CodeGenOptions.h lib/CodeGen/BackendUtil.cpp lib/Frontend/CompilerInvocation.cpp Index: lib/CodeGen/BackendUtil.cpp === --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -288,6 +288,9 @@ case CodeGenOptions::Accelerate: TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate); break; + case CodeGenOptions::SVML: +TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML); +break; default: break; } Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -452,6 +452,8 @@ StringRef Name = A->getValue(); if (Name == "Accelerate") Opts.setVecLib(CodeGenOptions::Accelerate); +else if (Name == "SVML") + Opts.setVecLib(CodeGenOptions::SVML); else if (Name == "none") Opts.setVecLib(CodeGenOptions::NoLibrary); else Index: include/clang/Frontend/CodeGenOptions.h === --- include/clang/Frontend/CodeGenOptions.h +++ include/clang/Frontend/CodeGenOptions.h @@ -50,8 +50,9 @@ }; enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use the Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use the Accelerate framework. +SVML// Intel short vector math library. }; enum ObjCDispatchMethodKind { Index: include/clang/Frontend/CodeGenOptions.def === --- include/clang/Frontend/CodeGenOptions.def +++ include/clang/Frontend/CodeGenOptions.def @@ -221,7 +221,7 @@ ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NoInlining) // Vector functions library to use. -ENUM_CODEGENOPT(VecLib, VectorLibrary, 1, NoLibrary) +ENUM_CODEGENOPT(VecLib, VectorLibrary, 2, NoLibrary) /// The default TLS model to use. ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel) Index: lib/CodeGen/BackendUtil.cpp === --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -288,6 +288,9 @@ case CodeGenOptions::Accelerate: TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate); break; + case CodeGenOptions::SVML: +TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML); +break; default: break; } Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -452,6 +452,8 @@ StringRef Name = A->getValue(); if (Name == "Accelerate") Opts.setVecLib(CodeGenOptions::Accelerate); +else if (Name == "SVML") + Opts.setVecLib(CodeGenOptions::SVML); else if (Name == "none") Opts.setVecLib(CodeGenOptions::NoLibrary); else Index: include/clang/Frontend/CodeGenOptions.h === --- include/clang/Frontend/CodeGenOptions.h +++ include/clang/Frontend/CodeGenOptions.h @@ -50,8 +50,9 @@ }; enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use the Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use the Accelerate framework. +SVML// Intel short vector math library. }; enum ObjCDispatchMethodKind { Index: include/clang/Frontend/CodeGenOptions.def === --- include/clang/Frontend/CodeGenOptions.def +++ include/clang/Frontend/CodeGenOptions.def @@ -221,7 +221,7 @@ ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NoInlining) // Vector functions library to use. -ENUM_CODEGENOPT(VecLib, VectorLibrary, 1, NoLibrary) +ENUM_CODEGENOPT(VecLib, VectorLibrary, 2, NoLibrary) /// The default TLS model to use. ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19544: Pass for translating math intrinsics to math library calls.
mmasten updated this revision to Diff 6. http://reviews.llvm.org/D19544 Files: include/llvm/Analysis/TargetLibraryInfo.h lib/Analysis/TargetLibraryInfo.cpp Index: lib/Analysis/TargetLibraryInfo.cpp === --- lib/Analysis/TargetLibraryInfo.cpp +++ lib/Analysis/TargetLibraryInfo.cpp @@ -23,6 +23,8 @@ "No vector functions library"), clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate", "Accelerate framework"), + clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", + "Intel SVML library"), clEnumValEnd)); const char *const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = { @@ -1079,6 +1081,92 @@ addVectorizableFunctions(VecFuncs); break; } + case SVML: { +const VecDesc VecFuncs[] = { +{"sin", "__svml_sin2", 2}, +{"sin", "__svml_sin4", 4}, +{"sin", "__svml_sin8", 8}, +{"sin", "__svml_sin16", 16}, +{"sin", "__svml_sin32", 32}, +{"sinf", "__svml_sinf2", 2}, +{"sinf", "__svml_sinf4", 4}, +{"sinf", "__svml_sinf8", 8}, +{"sinf", "__svml_sinf16", 16}, +{"sinf", "__svml_sinf32", 32}, +{"cos", "__svml_cos2", 2}, +{"cos", "__svml_cos4", 4}, +{"cos", "__svml_cos8", 8}, +{"cos", "__svml_cos16", 16}, +{"cos", "__svml_cos32", 32}, +{"cosf", "__svml_cosf2", 2}, +{"cosf", "__svml_cosf4", 4}, +{"cosf", "__svml_cosf8", 8}, +{"cosf", "__svml_cosf16", 16}, +{"cosf", "__svml_cosf32", 32}, +{"pow", "__svml_pow2", 2}, +{"pow", "__svml_pow4", 4}, +{"pow", "__svml_pow8", 8}, +{"pow", "__svml_pow16", 16}, +{"pow", "__svml_pow32", 32}, +{"powf", "__svml_powf2", 2}, +{"powf", "__svml_powf4", 4}, +{"powf", "__svml_powf8", 8}, +{"powf", "__svml_powf16", 16}, +{"powf", "__svml_powf32", 32}, +{"llvm.pow.f64", "__svml_pow2", 2}, +{"llvm.pow.f64", "__svml_pow4", 4}, +{"llvm.pow.f64", "__svml_pow8", 8}, +{"llvm.pow.f64", "__svml_pow16", 16}, +{"llvm.pow.f64", "__svml_pow32", 32}, +{"llvm.pow.f32", "__svml_powf2", 2}, +{"llvm.pow.f32", "__svml_powf4", 4}, +{"llvm.pow.f32", "__svml_powf8", 8}, +{"llvm.pow.f32", "__svml_powf16", 16}, +{"llvm.pow.f32", "__svml_powf32", 32}, +{"exp", "__svml_exp2", 2}, +{"exp", "__svml_exp4", 4}, +{"exp", "__svml_exp8", 8}, +{"exp", "__svml_exp16", 16}, +{"exp", "__svml_exp32", 32}, +{"expf", "__svml_expf2", 2}, +{"expf", "__svml_expf4", 4}, +{"expf", "__svml_expf8", 8}, +{"expf", "__svml_expf16", 16}, +{"expf", "__svml_expf32", 32}, +{"llvm.exp.f64", "__svml_exp2", 2}, +{"llvm.exp.f64", "__svml_exp4", 4}, +{"llvm.exp.f64", "__svml_exp8", 8}, +{"llvm.exp.f64", "__svml_exp16", 16}, +{"llvm.exp.f64", "__svml_exp32", 32}, +{"llvm.exp.f32", "__svml_expf2", 2}, +{"llvm.exp.f32", "__svml_expf4", 4}, +{"llvm.exp.f32", "__svml_expf8", 8}, +{"llvm.exp.f32", "__svml_expf16", 16}, +{"llvm.exp.f32", "__svml_expf32", 32}, +{"log", "__svml_log2", 2}, +{"log", "__svml_log4", 4}, +{"log", "__svml_log8", 8}, +{"log", "__svml_log16", 16}, +{"log", "__svml_log32", 32}, +{"logf", "__svml_logf2", 2}, +{"logf", "__svml_logf4", 4}, +{"logf", "__svml_logf8", 8}, +{"logf", "__svml_logf16", 16}, +{"logf", "__svml_logf32", 32}, +{"llvm.log.f64", "__svml_log2", 2}, +{"llvm.log.f64", "__svml_log4", 4}, +{"llvm.log.f64", "__svml_log8", 8}, +{"llvm.log.f64", "__svml_log16", 16}, +{"llvm.log.f64", "__svml_log32", 32}, +{"llvm.log.f32", "__svml_logf2", 2}, +{"llvm.log.f32", "__svml_logf4", 4}, +{"llvm.log.f32", "__svml_logf8", 8}, +{"llvm.log.f32", "__svml_logf16", 16}, +{"llvm.log.f32", "__svml_logf32", 32}, +}; +addVectorizableFunctions(VecFuncs); +break; + } case NoLibrary: break; } Index: include/llvm/Analysis/TargetLibraryInfo.h === --- include/llvm/Analysis/TargetLibraryInfo.h +++ include/llvm/Analysis/TargetLibraryInfo.h @@ -85,8 +85,9 @@ /// addVectorizableFunctionsFromVecLib for filling up the tables of /// vectorizable functions. enum VectorLibrary { -NoLibrary, // Don't use any vector library. -Accelerate // Use Accelerate framework. +NoLibrary, // Don't use any vector library. +Accelerate, // Use Accelerate framework. +SVML// Intel short vector math library. }; TargetLibraryInfoImpl(); ___ cfe-commits maili