================
@@ -482,5 +482,35 @@ ParsedTargetAttr 
RISCVTargetInfo::parseTargetAttr(StringRef Features) const {
       Ret.Tune = AttrString;
     }
   }
+
+  StringRef MCPU = this->getTargetOpts().CPU;
+  StringRef MTune = this->getTargetOpts().TuneCPU;
+
+  // attr-cpu override march only if arch isn't present.
+  if (FoundArch) {
+    // If tune-cpu infer from CPU, then try to keep it.
+    // Otherwise, just use current tune option.
+    if (Ret.Tune.empty() && MTune.empty()) {
+      if (!Ret.CPU.empty())
+        Ret.Tune = Ret.CPU; // Keep attr-cpu in tune-cpu
+      else if (!MCPU.empty())
+        Ret.Tune = MCPU; // Keep mcpu in tune-cpu
+    }
+
+    // Reassign mcpu due to attr-arch=<Adding-Extension> need
+    // target-feature from mcpu/march.
+    // Use attr-cpu will affect target-feature.
+    Ret.CPU = MCPU;
+
+    // arch=<full-arch-string> need keep target feature clean,
+    // use the baseline cpu.
+    if (llvm::find(Ret.Features, "__RISCV_TargetAttrNeedOverride") !=
+        Ret.Features.end())
+      Ret.CPU =
----------------
topperc wrote:

`RISCVProcessorModel` defines names that can be used for -mcpu and -mtune. 
`RISCVTuneProcessorModel` defines name that can only be used for -mtune. These 
just associate scheduler models with strings. You need to look at C++ code to 
see how -mcpu and -mtune are propagated.

This code gets the TuneCPU from the tune-cpu function attribute if present. 
Otherwise its the same as the CPU. Where CPU either comes from the target-cpu 
attribute or the TargetCPU in TargetMachine. There is no TuneCPU in 
TargetMachine so it can only be set differently through the tune-cpu attribute.

```
const RISCVSubtarget *                                                          
 
RISCVTargetMachine::getSubtargetImpl(const Function &F) const {                 
 
  Attribute CPUAttr = F.getFnAttribute("target-cpu");                           
 
  Attribute TuneAttr = F.getFnAttribute("tune-cpu");                            
 
  Attribute FSAttr = F.getFnAttribute("target-features");                       
 
                                                                                
 
  std::string CPU =                                                             
 
      CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;         
 
  std::string TuneCPU =                                                         
 
      TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
```

The lookup function for the scheduler is here
```
void MCSubtargetInfo::InitMCProcessorInfo(StringRef CPU, StringRef TuneCPU,     
 
                                          StringRef FS) {                       
 
  FeatureBits = getFeatures(CPU, TuneCPU, FS, ProcDesc, ProcFeatures);          
 
  FeatureString = std::string(FS);                                              
 
                                                                                
 
  if (!TuneCPU.empty())                                                         
 
    CPUSchedModel = &getSchedModelForCPU(TuneCPU);                              
 
  else                                                                          
 
    CPUSchedModel = &MCSchedModel::Default;                                     
 
} 
```

https://github.com/llvm/llvm-project/pull/75804
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to