Index: llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h +++ llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h @@ -61,6 +61,7 @@ return TLOF.get(); } + void addEarlyAsPossiblePasses(PassManagerBase &PM) override; TargetIRAnalysis getTargetIRAnalysis() override; }; // NVPTXTargetMachine. Index: llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -167,6 +167,10 @@ return new NVPTXPassConfig(this, PM); } +void NVPTXTargetMachine::addEarlyAsPossiblePasses(PassManagerBase &PM) { + PM.add(createNVVMReflectPass()); +} + TargetIRAnalysis NVPTXTargetMachine::getTargetIRAnalysis() { return TargetIRAnalysis([this](const Function &F) { return TargetTransformInfo(NVPTXTTIImpl(this, F)); @@ -228,7 +232,12 @@ disablePass(&FuncletLayoutID); disablePass(&PatchableFunctionID); + // NVVMReflectPass is added in addEarlyAsPossiblePasses, so hopefully running + // it here does nothing. But since we need it for correctness when lowering + // to NVPTX, run it here too, in case whoever built our pass pipeline didn't + // call addEarlyAsPossiblePasses. addPass(createNVVMReflectPass()); + if (getOptLevel() != CodeGenOpt::None) addPass(createNVPTXImageOptimizerPass()); addPass(createNVPTXAssignValidGlobalNamesPass());