zahiraam added inline comments.

================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:821
+        (Precision == LangOptions::ExcessPrecisionKind::FPP_Standard ||
+         Precision == LangOptions::ExcessPrecisionKind::FPP_Fast)) {
       if (Ty->isAnyComplexType()) {
----------------
rjmccall wrote:
> zahiraam wrote:
> > zahiraam wrote:
> > > rjmccall wrote:
> > > > rjmccall wrote:
> > > > > Let's make the language option be canonically correct: if the target 
> > > > > doesn't want us to emit `_Float16` with excess precision, we should 
> > > > > either diagnose or ignore the frontend option, but in either case 
> > > > > clients like this should be able to just look at the LangOpt.  We 
> > > > > should do this in the frontend, not the driver.
> > > > > 
> > > > > Also, we have a similar function in the complex emitter, right?
> > > > > 
> > > > > To allow for multiple types with independent excess precision in the 
> > > > > future, please sink the checks down to where we've recognized that 
> > > > > we're dealing with a certain type, like:
> > > > > 
> > > > > ```
> > > > > if (auto *CT = Ty->getAs<ComplexType>()) {
> > > > >   QualType ElementType = CT->getElementType();
> > > > >   if (ElementType->isFloat16Type() &&
> > > > >       CGF.getContext().getLangOpts().getFloat16ExcessPrecision() != 
> > > > > LangOptions::ExcessPrecisionKind::FPP_None)
> > > > >     return CGF.getContext().getComplexType(CGF.getContext().FloatTy);
> > > > > }
> > > > > ```
> > > > > 
> > > > > You might also consider adding a `useFloat16ExcessPrecision()` 
> > > > > convenience function to LangOpts for this.
> > > > Sorry, I'm waffling about the right way to handle this.  Let me lay out 
> > > > what I'm thinking.
> > > > 
> > > > 1. It's best if, by the time we get into the main compiler operation, 
> > > > there's a single place we can check to ask if a particular type should 
> > > > use excess precision.  This code can actually be relatively hot, so we 
> > > > want it to be cheap to check, and for correctness we want it to be a 
> > > > simple condition.
> > > > 
> > > > 2. I don't like the design of `-fexcess-precision`.  It mashes the 
> > > > handling of all of the types together, and I'd like excess precision 
> > > > for different types to be independently controllable.  In principle, 
> > > > I'd even like excess precision to be specifiable when the target 
> > > > doesn't need it.  It makes sense for the driver to worry about all 
> > > > these poorly-designed options and just give precise controls to the 
> > > > frontend.
> > > > 
> > > > 3. The problem with that is that the driver doesn't have all the 
> > > > information it would need in order to pick the right default.  Or, 
> > > > well, it has the information, but it would have to parse it out of the 
> > > > command line in a way that we currently try to avoid in the driver.  
> > > > For example, to pick the default for `_Float16`, we need to know if 
> > > > AVX512FP16 is enabled in the target, and as far as I know, the first 
> > > > time that anything knows that for sure is after we construct a 
> > > > TargetInfo object in CompilerInstance.
> > > > 
> > > > 4. So I'm leaning back towards the idea that we should just pass 
> > > > `-fexcess-precision` down to the frontend instead of processing it in 
> > > > the driver, and then the frontend can reconcile that option with the 
> > > > precise target info and turn it into a bunch of derived, type-specific 
> > > > language options.  Most of the compiler will at least still be able to 
> > > > consider only those type-specific language options.
> > > > 
> > > > But I'd like to get some driver experts to think about it.
> > > Removing the check 
> > > CGF.getTarget().shouldEmitFloat16WithExcessPrecision()) here is not 
> > > correct as it will perform excess precision for non-x86 architecture.  
> > > So, for now it needs to stay until we decide what needs to be done.
> > > Would it be a good alternative (may be not cheap though) to have 
> > > LangOptions::useFloat16Precision() take a target as argument?
> > > Sorry, I'm waffling about the right way to handle this.  Let me lay out 
> > > what I'm thinking.
> > > 
> > > 1. It's best if, by the time we get into the main compiler operation, 
> > > there's a single place we can check to ask if a particular type should 
> > > use excess precision.  This code can actually be relatively hot, so we 
> > > want it to be cheap to check, and for correctness we want it to be a 
> > > simple condition.
> > May be in LangOptions::useFloat16Precision()? We could also have 
> > LangOptions::useBFloat16Precision and son on?
> > > 
> > > 2. I don't like the design of `-fexcess-precision`.  It mashes the 
> > > handling of all of the types together, and I'd like excess precision for 
> > > different types to be independently controllable.  In principle, I'd even 
> > > like excess precision to be specifiable when the target doesn't need it.  
> > > It makes sense for the driver to worry about all these poorly-designed 
> > > options and just give precise controls to the frontend.
> > > 
> > Why would we want "excess precision to be specifiable for targets that 
> > don't it"? 
> > 
> > > 3. The problem with that is that the driver doesn't have all the 
> > > information it would need in order to pick the right default.  Or, well, 
> > > it has the information, but it would have to parse it out of the command 
> > > line in a way that we currently try to avoid in the driver.  For example, 
> > > to pick the default for `_Float16`, we need to know if AVX512FP16 is 
> > > enabled in the target, and as far as I know, the first time that anything 
> > > knows that for sure is after we construct a TargetInfo object in 
> > > CompilerInstance.
> > > 
> > > 4. So I'm leaning back towards the idea that we should just pass 
> > > `-fexcess-precision` down to the frontend instead of processing it in the 
> > > driver, and then the frontend can reconcile that option with the precise 
> > > target info and turn it into a bunch of derived, type-specific language 
> > > options.  Most of the compiler will at least still be able to consider 
> > > only those type-specific language options.
> > > 
> > > But I'd like to get some driver experts to think about it.
> > 
> > Should we include some driver people to weigh in on this now? 
> > Unless you want to keep this design now and think about the other 
> > alternative later? If we do that, we will have to keep the target test in 
> > getPromotionType.  Please advise.
> > May be in LangOptions::useFloat16Precision()? We could also have 
> > LangOptions::useBFloat16Precision and son on?
> 
> Yeah, I think we want to add methods like that when we add new kinds of 
> excess precision.
> 
> Maybe it would be helpful to think about the future directions here.  We 
> don't need to tackle this now, but when I was doing this review, I did notice 
> that there's a `#pragma` for controlling excess precision, and it's 
> misimplemented: it promotes operands and thus formally changes types instead 
> of just changing code generation.  So ultimately we're going to want to end 
> up expressing whatever that pragma can do as part of `FPOptions` / 
> `FPOptionsOverride`, and IRGen will be asking individual expressions whether 
> to do them with promoted arithmetic (and what type to promote to!).
> 
> > Why would we want "excess precision to be specifiable for targets that 
> > don't it"?
> 
> Testing, or maybe reproducibility.  Mostly I don't want to preclude it.
> 
> > Should we include some driver people to weigh in on this now? 
> 
> I've asked if anyone else at Apple has a suggestion, but it would be good to 
> reach out more broadly, yeah.  Not sure if there's a more specific person to 
> ping than @aaron.ballman .
I renamed the option to Float16ExcessPrecision, but didn't remove the check for 
TargetInfo in getPromotionType (it would perform excess precision for non-x86 
targets). I am wondering if useFloat16ExcessPrecision shouldn't be taking a 
target as argument or may be having it a virtual function of TargetInfo.




CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D136176/new/

https://reviews.llvm.org/D136176

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to