@@ -5234,50 +5234,55 @@ Action *Driver::ConstructPhaseAction(
52345234 return C.MakeAction <CompileJobAction>(Input, types::TY_LLVM_BC);
52355235 }
52365236 case phases::Backend: {
5237+ bool IsOffloadHIP = TargetDeviceOffloadKind == Action::OFK_HIP;
5238+ bool IsNewOffloadDriver =
5239+ Args.hasFlag (options::OPT_offload_new_driver,
5240+ options::OPT_no_offload_new_driver, false );
52375241 // Skip a redundant Backend phase for HIP device code when using the new
52385242 // offload driver, where mid-end is done in linker wrapper.
5239- if (TargetDeviceOffloadKind == Action::OFK_HIP &&
5240- Args.hasFlag (options::OPT_offload_new_driver,
5241- options::OPT_no_offload_new_driver, false ) &&
5242- !offloadDeviceOnly ())
5243+ if (IsOffloadHIP && IsNewOffloadDriver && !offloadDeviceOnly ())
52435244 return Input;
5244-
5245- if (isUsingLTO () && TargetDeviceOffloadKind == Action::OFK_None) {
5245+ bool IsOffloadBuild = TargetDeviceOffloadKind != Action::OFK_None;
5246+ bool IsEmitLLVM = Args.hasArg (options::OPT_emit_llvm);
5247+ bool IsEmitAssembly = Args.hasArg (options::OPT_S);
5248+ if (isUsingLTO () && !IsOffloadBuild) {
52465249 types::ID Output;
5247- if (Args.hasArg (options::OPT_ffat_lto_objects) &&
5248- !Args.hasArg (options::OPT_emit_llvm))
5250+ if (Args.hasArg (options::OPT_ffat_lto_objects) && !IsEmitLLVM)
52495251 Output = types::TY_PP_Asm;
5250- else if (Args. hasArg (options::OPT_S) )
5252+ else if (IsEmitAssembly )
52515253 Output = types::TY_LTO_IR;
52525254 else
52535255 Output = types::TY_LTO_BC;
52545256 return C.MakeAction <BackendJobAction>(Input, Output);
52555257 }
5256- if (isUsingOffloadLTO () && TargetDeviceOffloadKind != Action::OFK_None) {
5257- types::ID Output =
5258- Args.hasArg (options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
5258+ if (isUsingOffloadLTO () && IsOffloadBuild) {
5259+ types::ID Output = IsEmitAssembly ? types::TY_LTO_IR : types::TY_LTO_BC;
52595260 return C.MakeAction <BackendJobAction>(Input, Output);
52605261 }
5261- if (Args.hasArg (options::OPT_emit_llvm) ||
5262- TargetDeviceOffloadKind == Action::OFK_SYCL ||
5263- (((Input->getOffloadingToolChain () &&
5264- Input->getOffloadingToolChain ()->getTriple ().isAMDGPU () &&
5265- TargetDeviceOffloadKind != Action::OFK_None) ||
5266- TargetDeviceOffloadKind == Action::OFK_HIP) &&
5267- ((Args.hasFlag (options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
5268- false ) ||
5269- (Args.hasFlag (options::OPT_offload_new_driver,
5270- options::OPT_no_offload_new_driver, false ) &&
5271- (!offloadDeviceOnly () ||
5272- (Input->getOffloadingToolChain () &&
5273- TargetDeviceOffloadKind == Action::OFK_HIP &&
5274- Input->getOffloadingToolChain ()->getTriple ().isSPIRV ())))) ||
5275- TargetDeviceOffloadKind == Action::OFK_OpenMP))) {
5262+
5263+ bool IsOffloadSYCL = TargetDeviceOffloadKind == Action::OFK_SYCL;
5264+ auto OffloadingToolChain = Input->getOffloadingToolChain ();
5265+ bool IsOffloadAMDGPU = OffloadingToolChain &&
5266+ OffloadingToolChain->getTriple ().isAMDGPU () &&
5267+ IsOffloadBuild;
5268+ bool IsRDC =
5269+ Args.hasFlag (options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false );
5270+ bool IsSPIRV =
5271+ OffloadingToolChain && OffloadingToolChain->getTriple ().isSPIRV ();
5272+ bool IsOffloadOpenMP = TargetDeviceOffloadKind == Action::OFK_OpenMP;
5273+
5274+ bool IsLLVMBitcodeOutput =
5275+ IsEmitLLVM || IsOffloadSYCL ||
5276+ ((IsOffloadAMDGPU || IsOffloadHIP) &&
5277+ ((IsRDC || (IsNewOffloadDriver &&
5278+ (!offloadDeviceOnly () || (IsOffloadHIP && IsSPIRV)))) ||
5279+ IsOffloadOpenMP));
5280+
5281+ if (IsLLVMBitcodeOutput) {
52765282 types::ID Output =
5277- Args.hasArg (options::OPT_S) &&
5278- (TargetDeviceOffloadKind == Action::OFK_None ||
5279- offloadDeviceOnly () ||
5280- (TargetDeviceOffloadKind == Action::OFK_HIP &&
5283+ IsEmitAssembly &&
5284+ (!IsOffloadBuild || offloadDeviceOnly () ||
5285+ (IsOffloadHIP &&
52815286 !Args.hasFlag (options::OPT_offload_new_driver,
52825287 options::OPT_no_offload_new_driver,
52835288 C.isOffloadingHostKind (Action::OFK_Cuda))))
0 commit comments