LLVM 22.0.0git
AMDGPUUniformIntrinsicCombine.cpp File Reference

This pass simplifies certain intrinsic calls when the arguments are uniform. More...

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "amdgpu-uniform-intrinsic-combine"

Functions

static bool isDivergentUseWithNew (const Use &U, const UniformityInfo &UI, const ValueMap< const Value *, bool > &Tracker)
 Wrapper for querying uniformity info that first checks locally tracked instructions.
static bool optimizeUniformIntrinsic (IntrinsicInst &II, const UniformityInfo &UI, ValueMap< const Value *, bool > &Tracker)
 Optimizes uniform intrinsics calls if their operand can be proven uniform.
static bool runUniformIntrinsicCombine (Function &F, const UniformityInfo &UI)
 Iterates over intrinsic calls in the Function to optimize.
 INITIALIZE_PASS_BEGIN (AMDGPUUniformIntrinsicCombineLegacy, DEBUG_TYPE, "AMDGPU Uniform Intrinsic Combine", false, false) INITIALIZE_PASS_END(AMDGPUUniformIntrinsicCombineLegacy

Variables

 DEBUG_TYPE
AMDGPU Uniform Intrinsic Combine
AMDGPU Uniform Intrinsic false

Detailed Description

This pass simplifies certain intrinsic calls when the arguments are uniform.

It's true that this pass has transforms that can lead to a situation where some instruction whose operand was previously recognized as statically uniform is later on no longer recognized as statically uniform. However, the semantics of how programs execute don't (and must not, for this precise reason) care about static uniformity, they only ever care about dynamic uniformity. And every instruction that's downstream and cares about dynamic uniformity must be convergent (and isel will introduce v_readfirstlane for them if their operands can't be proven statically uniform).

Definition in file AMDGPUUniformIntrinsicCombine.cpp.

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "amdgpu-uniform-intrinsic-combine"

Definition at line 38 of file AMDGPUUniformIntrinsicCombine.cpp.

Function Documentation

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( AMDGPUUniformIntrinsicCombineLegacy ,
DEBUG_TYPE ,
"AMDGPU Uniform Intrinsic Combine" ,
false ,
false  )

◆ isDivergentUseWithNew()

bool isDivergentUseWithNew ( const Use & U,
const UniformityInfo & UI,
const ValueMap< const Value *, bool > & Tracker )
static

Wrapper for querying uniformity info that first checks locally tracked instructions.

Definition at line 47 of file AMDGPUUniformIntrinsicCombine.cpp.

References llvm::ValueMap< KeyT, ValueT, Config >::end(), llvm::ValueMap< KeyT, ValueT, Config >::find(), and llvm::GenericUniformityInfo< ContextT >::isDivergentUse().

Referenced by optimizeUniformIntrinsic().

◆ optimizeUniformIntrinsic()

◆ runUniformIntrinsicCombine()

bool runUniformIntrinsicCombine ( Function & F,
const UniformityInfo & UI )
static

Iterates over intrinsic calls in the Function to optimize.

Definition at line 116 of file AMDGPUUniformIntrinsicCombine.cpp.

References llvm::dyn_cast(), F, I, II, instructions, llvm::make_early_inc_range(), and optimizeUniformIntrinsic().

Referenced by llvm::AMDGPUUniformIntrinsicCombinePass::run().

Variable Documentation

◆ Combine

AMDGPU Uniform Intrinsic Combine

Definition at line 187 of file AMDGPUUniformIntrinsicCombine.cpp.

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 186 of file AMDGPUUniformIntrinsicCombine.cpp.

◆ false

AMDGPU Uniform Intrinsic false

Definition at line 187 of file AMDGPUUniformIntrinsicCombine.cpp.