LLVM  16.0.0git

A helper class used for scoring candidates for two consecutive lanes. More...

[legend]

## Public Member Functions

LookAheadHeuristics (const TargetLibraryInfo &TLI, const DataLayout &DL, ScalarEvolution &SE, const BoUpSLP &R, int NumLanes, int MaxLevel)

int getShallowScore (Value *V1, Value *V2, Instruction *U1, Instruction *U2, ArrayRef< Value * > MainAltOps) const

int getScoreAtLevelRec (Value *LHS, Value *RHS, Instruction *U1, Instruction *U2, int CurrLevel, ArrayRef< Value * > MainAltOps) const
Go through the operands of LHS and RHS recursively until MaxLevel, and return the cummulative score. More...

## Static Public Attributes

static const int ScoreConsecutiveLoads = 4

static const int ScoreSplatLoads = 3
The same load multiple times. More...

static const int ScoreReversedLoads = 3

static const int ScoreMaskedGatherCandidate = 1

static const int ScoreConsecutiveExtracts = 4
ExtractElementInst from same vector and consecutive indexes. More...

static const int ScoreReversedExtracts = 3
ExtractElementInst from same vector and reversed indices. More...

static const int ScoreConstants = 2
Constants. More...

static const int ScoreSameOpcode = 2
Instructions with the same opcode. More...

static const int ScoreAltOpcodes = 1
Instructions with alt opcodes (e.g, add + sub). More...

static const int ScoreSplat = 1
Identical instructions (a.k.a. splat or broadcast). More...

static const int ScoreUndef = 1
Matching with an undef is preferable to failing. More...

static const int ScoreFail = 0
Score for failing to find a decent match. More...

static const int ScoreAllUserVectorized = 1
Score if all users are vectorized. More...

## Detailed Description

A helper class used for scoring candidates for two consecutive lanes.

Definition at line 1157 of file SLPVectorizer.cpp.

## Constructor & Destructor Documentation

 llvm::slpvectorizer::BoUpSLP::LookAheadHeuristics::LookAheadHeuristics ( const TargetLibraryInfo & TLI, const DataLayout & DL, ScalarEvolution & SE, const BoUpSLP & R, int NumLanes, int MaxLevel )
inline

Definition at line 1166 of file SLPVectorizer.cpp.

## ◆ getScoreAtLevelRec()

 int llvm::slpvectorizer::BoUpSLP::LookAheadHeuristics::getScoreAtLevelRec ( Value * LHS, Value * RHS, Instruction * U1, Instruction * U2, int CurrLevel, ArrayRef< Value * > MainAltOps ) const
inline

Go through the operands of LHS and RHS recursively until MaxLevel, and return the cummulative score.

U1 and U2 are the users of LHS and RHS (that is LHS and RHS are operands of U1 and U2), except at the beginning of the recursion where these are set to nullptr.

For example:

///  A[0]  B[0]  A[1]  B[1]  C[0] D[0]  B[1] A[1]
///     \ /         \ /         \ /        \ /
///      +           +           +          +
///     G1          G2          G3         G4
/// 

The getScoreAtLevelRec(G1, G2) function will try to match the nodes at each level recursively, accumulating the score. It starts from matching the additions at level 0, then moves on to the loads (level 1). The score of G1 and G2 is higher than G1 and G3, because {A[0],A[1]} and {B[0],B[1]} match with LookAheadHeuristics::ScoreConsecutiveLoads, while {A[0],C[0]} has a score of LookAheadHeuristics::ScoreFail. Please note that the order of the operands does not matter, as we evaluate the score of all profitable combinations of operands. In other words the score of G1 and G4 is the same as G1 and G2. This heuristic is based on ideas described in: Look-ahead SLP: Auto-vectorization in the presence of commutative operations, CGO 2018 by Vasileios Porpodas, Rodrigo C. O. Rocha, Luís F. W. Góes

Definition at line 1374 of file SLPVectorizer.cpp.

Referenced by llvm::slpvectorizer::BoUpSLP::findBestRootPair().

## ◆ getShallowScore()

 int llvm::slpvectorizer::BoUpSLP::LookAheadHeuristics::getShallowScore ( Value * V1, Value * V2, Instruction * U1, Instruction * U2, ArrayRef< Value * > MainAltOps ) const
inline
Returns
the score of placing V1 and V2 in consecutive lanes. U1 and U2 are the users of V1 and V2. Also, checks if V1 and V2 are compatible with instructions in MainAltOps.

Definition at line 1217 of file SLPVectorizer.cpp.

## ◆ ScoreAllUserVectorized

static

Score if all users are vectorized.

Definition at line 1211 of file SLPVectorizer.cpp.

## ◆ ScoreAltOpcodes

static

Instructions with alt opcodes (e.g, add + sub).

Definition at line 1203 of file SLPVectorizer.cpp.

## ◆ ScoreConsecutiveExtracts

static

ExtractElementInst from same vector and consecutive indexes.

Definition at line 1195 of file SLPVectorizer.cpp.

static

Definition at line 1184 of file SLPVectorizer.cpp.

## ◆ ScoreConstants

static

Constants.

Definition at line 1199 of file SLPVectorizer.cpp.

## ◆ ScoreFail

static

Score for failing to find a decent match.

Definition at line 1209 of file SLPVectorizer.cpp.

static

Definition at line 1193 of file SLPVectorizer.cpp.

## ◆ ScoreReversedExtracts

static

ExtractElementInst from same vector and reversed indices.

Definition at line 1197 of file SLPVectorizer.cpp.

static

Definition at line 1191 of file SLPVectorizer.cpp.

## ◆ ScoreSameOpcode

static

Instructions with the same opcode.

Definition at line 1201 of file SLPVectorizer.cpp.

## ◆ ScoreSplat

static

Identical instructions (a.k.a. splat or broadcast).

Definition at line 1205 of file SLPVectorizer.cpp.

static

This should have a better score than ScoreSplat because it in x86 for a 2-lane vector we can represent it with movddup (reg), xmm0 which has a throughput of 0.5 versus 0.5 for a vector load and 1.0 for a broadcast.

Definition at line 1189 of file SLPVectorizer.cpp.