Index: llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -21,6 +21,7 @@ #include "SPIRVSubtarget.h" #include "SPIRVUtils.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" +#include "llvm/Support/ModRef.h" using namespace llvm; @@ -49,19 +50,23 @@ // Based on the LLVM function attributes, get a SPIR-V FunctionControl. static uint32_t getFunctionControl(const Function &F) { + MemoryEffects MemEffects = F.getMemoryEffects(); + uint32_t FuncControl = static_cast(SPIRV::FunctionControl::None); - if (F.hasFnAttribute(Attribute::AttrKind::AlwaysInline)) { + + if (F.hasFnAttribute(Attribute::AttrKind::AlwaysInline)) FuncControl |= static_cast(SPIRV::FunctionControl::Inline); - } - if (F.hasFnAttribute(Attribute::AttrKind::ReadNone)) { + + if (F.hasFnAttribute(Attribute::AttrKind::ReadNone) || + MemEffects.doesNotAccessMemory()) FuncControl |= static_cast(SPIRV::FunctionControl::Pure); - } - if (F.hasFnAttribute(Attribute::AttrKind::ReadOnly)) { + else if (F.hasFnAttribute(Attribute::AttrKind::ReadOnly) || + MemEffects.onlyReadsMemory()) FuncControl |= static_cast(SPIRV::FunctionControl::Const); - } - if (F.hasFnAttribute(Attribute::AttrKind::NoInline)) { + + if (F.hasFnAttribute(Attribute::AttrKind::NoInline)) FuncControl |= static_cast(SPIRV::FunctionControl::DontInline); - } + return FuncControl; }