[PATCH] D100118: [clang] Add support for new builtin __arithmetic_fence to control floating point optimization, and new clang option fprotect-parens

Melanie Blower via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 23 10:28:10 PDT 2021


mibintc marked 9 inline comments as done.
mibintc added a comment.

A couple inline replies to go along with the updated patch



================
Comment at: clang/include/clang/Driver/Options.td:1757
+  LangOpts<"ProtectParens">, DefaultFalse,
+  PosFlag<SetTrue, [CC1Option], 
+          "Determines whether the optimizer honors parentheses when "
----------------
aaron.ballman wrote:
> Should this option also be exposed to clang-cl (should it be a `CoreOption`)?
I don't know the answer to this, do you have a recommendation? 


================
Comment at: clang/lib/Sema/SemaChecking.cpp:6427-6430
+    if (const VectorType *VT = dyn_cast<VectorType>(ArgTy.getCanonicalType()))
+      return VT->getElementType().getTypePtr()->isFloatingType();
+    if (const ComplexType *CT = dyn_cast<ComplexType>(ArgTy.getCanonicalType()))
+      return CT->getElementType().getTypePtr()->isFloatingType();
----------------
aaron.ballman wrote:
> 
I found there was a boolean function, so i got rid of the lambda. 


================
Comment at: clang/lib/Sema/SemaCoroutine.cpp:294
 
-static Expr *buildBuiltinCall(Sema &S, SourceLocation Loc, Builtin::ID Id,
-                              MultiExprArg CallArgs) {
----------------
I moved this function to public because another file is also using the same logic


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4026
+      !E->isLValue() &&
+      (ExprTy->isFloatingType() || (ExprTy->isComplexType()))) {
+    return BuildBuiltinCallExpr(R, Builtin::BI__arithmetic_fence, E);
----------------
aaron.ballman wrote:
> Do you have to worry about vector types here as well?
Oh yes, i didn't get this one. 


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4027
+      (ExprTy->isFloatingType() || (ExprTy->isComplexType()))) {
+    return BuildBuiltinCallExpr(R, Builtin::BI__arithmetic_fence, E);
+  }
----------------
aaron.ballman wrote:
> One worry I have about this is that the AST will be a bit mysterious for people writing AST matchers. The source code will have parens in it, but the AST will have a `ParenExpr` node or not only depending on the language options. This may also cause problems for other parts of the code that are checking for properly-parenthesized expressions (like && and || within the same expression), so we should probably have a test case like:
> ```
> bool func(float f1, float f2, float f3) {
>   return (f1 == f2 && f1 == f3) || f2 == f3; // Should not warn here
> }
> ```
I added an AST test case 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100118



More information about the cfe-commits mailing list