1818#include " llvm/ADT/PostOrderIterator.h"
1919#include " llvm/ADT/SmallVector.h"
2020#include " llvm/ADT/Twine.h"
21+ #include " llvm/Analysis/TargetTransformInfo.h"
2122#include " llvm/Analysis/VectorUtils.h"
2223#include " llvm/IR/Argument.h"
2324#include " llvm/IR/BasicBlock.h"
3233#include " llvm/IR/Instruction.h"
3334#include " llvm/IR/Instructions.h"
3435#include " llvm/IR/Intrinsics.h"
36+ #include " llvm/IR/IntrinsicsDirectX.h"
3537#include " llvm/IR/LLVMContext.h"
3638#include " llvm/IR/Module.h"
3739#include " llvm/IR/Type.h"
@@ -281,17 +283,20 @@ T getWithDefaultOverride(const cl::opt<T> &ClOption,
281283
282284class ScalarizerVisitor : public InstVisitor <ScalarizerVisitor, bool > {
283285public:
284- ScalarizerVisitor (DominatorTree *DT, ScalarizerPassOptions Options)
285- : DT(DT), ScalarizeVariableInsertExtract(getWithDefaultOverride(
286- ClScalarizeVariableInsertExtract,
287- Options.ScalarizeVariableInsertExtract)),
286+ ScalarizerVisitor (DominatorTree *DT, const TargetTransformInfo *TTI,
287+ ScalarizerPassOptions Options)
288+ : DT(DT), TTI(TTI), ScalarizeVariableInsertExtract(getWithDefaultOverride(
289+ ClScalarizeVariableInsertExtract,
290+ Options.ScalarizeVariableInsertExtract)),
288291 ScalarizeLoadStore (getWithDefaultOverride(ClScalarizeLoadStore,
289292 Options.ScalarizeLoadStore)),
290293 ScalarizeMinBits(getWithDefaultOverride(ClScalarizeMinBits,
291294 Options.ScalarizeMinBits)) {}
292295
293296 bool visit (Function &F);
294297
298+ bool isTriviallyScalarizable (Intrinsic::ID ID);
299+
295300 // InstVisitor methods. They return true if the instruction was scalarized,
296301 // false if nothing changed.
297302 bool visitInstruction (Instruction &I) { return false ; }
@@ -335,6 +340,7 @@ class ScalarizerVisitor : public InstVisitor<ScalarizerVisitor, bool> {
335340 SmallVector<WeakTrackingVH, 32 > PotentiallyDeadInstrs;
336341
337342 DominatorTree *DT;
343+ const TargetTransformInfo *TTI;
338344
339345 const bool ScalarizeVariableInsertExtract;
340346 const bool ScalarizeLoadStore;
@@ -358,6 +364,7 @@ ScalarizerLegacyPass::ScalarizerLegacyPass(const ScalarizerPassOptions &Options)
358364
359365void ScalarizerLegacyPass::getAnalysisUsage (AnalysisUsage &AU) const {
360366 AU.addRequired <DominatorTreeWrapperPass>();
367+ AU.addRequired <TargetTransformInfoWrapperPass>();
361368 AU.addPreserved <DominatorTreeWrapperPass>();
362369}
363370
@@ -445,7 +452,9 @@ bool ScalarizerLegacyPass::runOnFunction(Function &F) {
445452 return false ;
446453
447454 DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
448- ScalarizerVisitor Impl (DT, Options);
455+ const TargetTransformInfo *TTI =
456+ &getAnalysis<TargetTransformInfoWrapperPass>().getTTI (F);
457+ ScalarizerVisitor Impl (DT, TTI, Options);
449458 return Impl.visit (F);
450459}
451460
@@ -689,8 +698,10 @@ bool ScalarizerVisitor::splitBinary(Instruction &I, const Splitter &Split) {
689698 return true ;
690699}
691700
692- static bool isTriviallyScalariable (Intrinsic::ID ID) {
693- return isTriviallyVectorizable (ID);
701+ bool ScalarizerVisitor::isTriviallyScalarizable (Intrinsic::ID ID) {
702+
703+ return TTI->isTargetIntrinsicTriviallyScalarizable (ID) ||
704+ isTriviallyVectorizable (ID);
694705}
695706
696707// / If a call to a vector typed intrinsic function, split into a scalar call per
@@ -705,7 +716,8 @@ bool ScalarizerVisitor::splitCall(CallInst &CI) {
705716 return false ;
706717
707718 Intrinsic::ID ID = F->getIntrinsicID ();
708- if (ID == Intrinsic::not_intrinsic || !isTriviallyScalariable (ID))
719+
720+ if (ID == Intrinsic::not_intrinsic || !isTriviallyScalarizable (ID))
709721 return false ;
710722
711723 // unsigned NumElems = VT->getNumElements();
@@ -1249,7 +1261,8 @@ bool ScalarizerVisitor::finish() {
12491261
12501262PreservedAnalyses ScalarizerPass::run (Function &F, FunctionAnalysisManager &AM) {
12511263 DominatorTree *DT = &AM.getResult <DominatorTreeAnalysis>(F);
1252- ScalarizerVisitor Impl (DT, Options);
1264+ const TargetTransformInfo *TTI = &AM.getResult <TargetIRAnalysis>(F);
1265+ ScalarizerVisitor Impl (DT, TTI, Options);
12531266 bool Changed = Impl.visit (F);
12541267 PreservedAnalyses PA;
12551268 PA.preserve <DominatorTreeAnalysis>();
0 commit comments