llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: Shivam Gupta (xgupta)

<details>
<summary>Changes</summary>

Apply expression-specific floating-point options when emitting fneg and call 
instructions.

This prevents these instructions from retaining fast-math flags disabled by 
local FP pragmas, such as #pragma clang fp reassociate(off).

Builtin calls are excluded because their lowering handles floating-point 
options separately.

Fixes #<!-- -->51905

---
Full diff: https://github.com/llvm/llvm-project/pull/212141.diff


2 Files Affected:

- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+9-1) 
- (modified) clang/test/CodeGen/fp-reassoc-pragma.cpp (+16) 


``````````diff
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 8783b43846434..1d26fde39885f 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -682,6 +682,12 @@ class ScalarExprEmitter
     if (E->getCallReturnType(CGF.getContext())->isReferenceType())
       return EmitLoadOfLValue(E);
 
+    std::optional<CodeGenFunction::CGFPOptionsRAII> FPOptsRAII;
+    const FunctionDecl *FD = E->getDirectCallee();
+    bool IsBuiltin = FD && FD->getBuiltinID() != 0;
+    if (!IsBuiltin && E->getType()->hasFloatingRepresentation())
+      FPOptsRAII.emplace(CGF, E);
+
     Value *V = CGF.EmitCallExpr(E).getScalarVal();
 
     EmitLValueAlignmentAssumption(E, V);
@@ -3707,8 +3713,10 @@ Value *ScalarExprEmitter::VisitMinus(const UnaryOperator 
*E,
     Op = Visit(E->getSubExpr());
 
   // Generate a unary FNeg for FP ops.
-  if (Op->getType()->isFPOrFPVectorTy())
+  if (Op->getType()->isFPOrFPVectorTy()) {
+    CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
     return Builder.CreateFNeg(Op, "fneg");
+  }
 
   // Emit unary minus with EmitSub so we handle overflow cases etc.
   BinOpInfo BinOp;
diff --git a/clang/test/CodeGen/fp-reassoc-pragma.cpp 
b/clang/test/CodeGen/fp-reassoc-pragma.cpp
index 8b9329c40174b..45d5ecde34484 100644
--- a/clang/test/CodeGen/fp-reassoc-pragma.cpp
+++ b/clang/test/CodeGen/fp-reassoc-pragma.cpp
@@ -1,4 +1,6 @@
 // RUN: %clang_cc1 -O3 -triple %itanium_abi_triple -emit-llvm -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -O0 -triple %itanium_abi_triple -funsafe-math-optimizations 
-emit-llvm -o - %s | FileCheck %s --check-prefix=UNSAFE
+
 // Simple case
 float fp_reassoc_simple(float a, float b, float c) {
 // CHECK: _Z17fp_reassoc_simplefff
@@ -90,3 +92,17 @@ float fp_reassoc_call_helper(float a, float b, float c) {
 #pragma clang fp reassociate(on)
   return helper_func(a, b, c);
 }
+
+
+double fp_reassoc_call_helper(bool flag, double x, double y) {
+  return flag ? x : y;
+}
+
+#pragma clang fp reassociate(off)
+double fp_reassoc_off_fneg_call(double x) {
+  // UNSAFE-LABEL: _Z24fp_reassoc_off_fneg_calld
+  // UNSAFE: fcmp nsz arcp afn
+  // UNSAFE: fneg nsz arcp afn
+  // UNSAFE: call nsz arcp afn
+  return fp_reassoc_call_helper(x < 0, -x, x);
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/212141
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to