https://github.com/xgupta updated 
https://github.com/llvm/llvm-project/pull/212141

>From 2b98375c6ffd40f9952d183917dc25fb1e51ff3b Mon Sep 17 00:00:00 2001
From: Shivam Gupta <[email protected]>
Date: Sun, 26 Jul 2026 20:47:26 +0530
Subject: [PATCH 1/3] [clang][CodeGen] Respect FP pragma options for fneg and
 calls

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
---
 clang/lib/CodeGen/CGExprScalar.cpp       | 10 +++++++++-
 clang/test/CodeGen/fp-reassoc-pragma.cpp | 16 ++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

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);
+}

>From 790398200adec03fdabcfcaf0fa3a83c5d0d7a7d Mon Sep 17 00:00:00 2001
From: Shivam Gupta <[email protected]>
Date: Tue, 4 Aug 2026 15:08:54 +0530
Subject: [PATCH 2/3] Addressed test case's review comments

---
 clang/test/CodeGen/fp-reassoc-pragma.cpp | 41 ++++++++++++------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/clang/test/CodeGen/fp-reassoc-pragma.cpp 
b/clang/test/CodeGen/fp-reassoc-pragma.cpp
index 45d5ecde34484..ce32a93c6620c 100644
--- a/clang/test/CodeGen/fp-reassoc-pragma.cpp
+++ b/clang/test/CodeGen/fp-reassoc-pragma.cpp
@@ -1,15 +1,18 @@
 // 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
 
+float func(float);
+
 // Simple case
 float fp_reassoc_simple(float a, float b, float c) {
 // CHECK: _Z17fp_reassoc_simplefff
 // CHECK: %[[A:.+]] = fadd reassoc float %b, %c
-// CHECK: %[[M:.+]] = fmul reassoc float %b, %[[A]]
-// CHECK-NEXT: fadd reassoc float %c, %[[M]]
+// CHECK: %[[C:.+]] = tail call reassoc {{.*}} @_Z4funcf(float {{.*}} %[[A]])
+// CHECK: %[[N:.+]] = fneg reassoc float %[[C]]
+// CHECK: call reassoc {{.*}} @_Z4funcf(float {{.*}} %[[N]])
 #pragma clang fp reassociate(on)
-  a = b + c;
-  return a * b + c;
+  a = func(b + c);
+  return func(-a);
 }
 
 // Reassoc pragma should only apply to its scope
@@ -67,10 +70,19 @@ float fp_file_scope_stop(float a, float b, float c) {
 #pragma clang fp reassociate(off)
 float fp_reassoc_off(float a, float b, float c) {
   // CHECK: _Z14fp_reassoc_offfff
-  // CHECK: %[[D1:.+]] = fdiv float %a, %c
-  // CHECK-NEXT: %[[D2:.+]] = fdiv float %b, %c
-  // CHECK-NEXT: fadd float %[[D1]], %[[D2]]
-  return (a / c) + (b / c);
+  // CHECK: %[[N:.+]] = fneg float %a
+  // CHECK: %[[C:.+]] = tail call noundef float @_Z4funcf(float noundef %[[N]])
+  // CHECK: %[[D1:.+]] = fdiv float %[[C]], %c
+  // CHECK: %[[D2:.+]] = fdiv float %b, %c
+  // CHECK: fadd float %[[D2]], %[[D1]]
+  //
+  // UNSAFE: _Z14fp_reassoc_offfff
+  // UNSAFE: %[[N:.+]] = fneg nsz arcp afn float
+  // UNSAFE: %[[C:.+]] = call nsz arcp afn noundef float @_Z4funcf(float 
noundef %[[N]])
+  // UNSAFE: %[[D1:.+]] = fdiv nsz arcp afn float %[[C]]
+  // UNSAFE: %[[D2:.+]] = fdiv nsz arcp afn float
+  // UNSAFE: fadd nsz arcp afn float %[[D1]], %[[D2]]
+  return (func(-a) / c) + (b / c);
 }
 
 // Takes latest flag
@@ -93,16 +105,3 @@ float fp_reassoc_call_helper(float a, float b, float c) {
   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);
-}

>From 173fb97dfbc195216b61579caf963e45b8c6efaf Mon Sep 17 00:00:00 2001
From: Shivam Gupta <[email protected]>
Date: Wed, 5 Aug 2026 14:47:48 +0530
Subject: [PATCH 3/3] Address review comments

---
 clang/lib/CodeGen/CGExprScalar.cpp            |  6 +--
 .../v8.2a-neon-intrinsics-constrained.c       | 44 +++++++++----------
 .../test/CodeGen/constrained-math-builtins.c  | 16 +++----
 3 files changed, 31 insertions(+), 35 deletions(-)

diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 1d26fde39885f..48e5ec527260f 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -682,11 +682,7 @@ 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);
+    CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
 
     Value *V = CGF.EmitCallExpr(E).getScalarVal();
 
diff --git a/clang/test/CodeGen/AArch64/v8.2a-neon-intrinsics-constrained.c 
b/clang/test/CodeGen/AArch64/v8.2a-neon-intrinsics-constrained.c
index 02ddbf2950829..dac8b931ff210 100644
--- a/clang/test/CodeGen/AArch64/v8.2a-neon-intrinsics-constrained.c
+++ b/clang/test/CodeGen/AArch64/v8.2a-neon-intrinsics-constrained.c
@@ -36,7 +36,7 @@
 // CONSTRAINED-NEXT:    [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <4 x i16>
 // CONSTRAINED-NEXT:    [[TMP1:%.*]] = bitcast <4 x i16> [[TMP0]] to <8 x i8>
 // CONSTRAINED-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half>
-// CONSTRAINED-NEXT:    [[VSQRT_I:%.*]] = call <4 x half> 
@llvm.experimental.constrained.sqrt.v4f16(<4 x half> [[TMP2]], metadata 
!"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2:[0-9]+]]
+// CONSTRAINED-NEXT:    [[VSQRT_I:%.*]] = call <4 x half> 
@llvm.experimental.constrained.sqrt.v4f16(<4 x half> [[TMP2]], metadata 
!"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2:[0-9]+]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[VSQRT_I]]
 //
 float16x4_t test_vsqrt_f16(float16x4_t a) {
@@ -58,7 +58,7 @@ float16x4_t test_vsqrt_f16(float16x4_t a) {
 // CONSTRAINED-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <8 x i16>
 // CONSTRAINED-NEXT:    [[TMP1:%.*]] = bitcast <8 x i16> [[TMP0]] to <16 x i8>
 // CONSTRAINED-NEXT:    [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half>
-// CONSTRAINED-NEXT:    [[VSQRT_I:%.*]] = call <8 x half> 
@llvm.experimental.constrained.sqrt.v8f16(<8 x half> [[TMP2]], metadata 
!"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[VSQRT_I:%.*]] = call <8 x half> 
@llvm.experimental.constrained.sqrt.v8f16(<8 x half> [[TMP2]], metadata 
!"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[VSQRT_I]]
 //
 float16x8_t test_vsqrtq_f16(float16x8_t a) {
@@ -92,7 +92,7 @@ float16x8_t test_vsqrtq_f16(float16x8_t a) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfma_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
@@ -126,7 +126,7 @@ float16x4_t test_vfma_f16(float16x4_t a, float16x4_t b, 
float16x4_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmaq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
@@ -162,7 +162,7 @@ float16x8_t test_vfmaq_f16(float16x8_t a, float16x8_t b, 
float16x8_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfms_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
@@ -198,7 +198,7 @@ float16x4_t test_vfms_f16(float16x4_t a, float16x4_t b, 
float16x4_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmsq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
@@ -234,7 +234,7 @@ float16x8_t test_vfmsq_f16(float16x8_t a, float16x8_t b, 
float16x8_t c) {
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <4 x half> [[TMP6]], <4 x 
half> [[TMP6]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
 // CONSTRAINED-NEXT:    [[FMLA:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[FMLA1:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
-// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[FMLA]], <4 x half> 
[[LANE]], <4 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[FMLA]], <4 x half> 
[[LANE]], <4 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[FMLA2]]
 //
 float16x4_t test_vfma_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
@@ -270,7 +270,7 @@ float16x4_t test_vfma_lane_f16(float16x4_t a, float16x4_t 
b, float16x4_t c) {
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <4 x half> [[TMP6]], <4 x 
half> [[TMP6]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 
3>
 // CONSTRAINED-NEXT:    [[FMLA:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[FMLA1:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x 
half>
-// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[FMLA]], <8 x half> 
[[LANE]], <8 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[FMLA]], <8 x half> 
[[LANE]], <8 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[FMLA2]]
 //
 float16x8_t test_vfmaq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) {
@@ -306,7 +306,7 @@ float16x8_t test_vfmaq_lane_f16(float16x8_t a, float16x8_t 
b, float16x4_t c) {
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <8 x half> [[TMP8]], <8 x 
half> [[TMP8]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[LANE]], <4 x half> 
[[TMP7]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[LANE]], <4 x half> 
[[TMP7]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfma_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) {
@@ -342,7 +342,7 @@ float16x4_t test_vfma_laneq_f16(float16x4_t a, float16x4_t 
b, float16x8_t c) {
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <8 x half> [[TMP8]], <8 x 
half> [[TMP8]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 
7>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[LANE]], <8 x half> 
[[TMP7]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[LANE]], <8 x half> 
[[TMP7]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmaq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
@@ -384,7 +384,7 @@ float16x8_t test_vfmaq_laneq_f16(float16x8_t a, float16x8_t 
b, float16x8_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfma_n_f16(float16x4_t a, float16x4_t b, float16_t c) {
@@ -434,7 +434,7 @@ float16x4_t test_vfma_n_f16(float16x4_t a, float16x4_t b, 
float16_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmaq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {
@@ -452,7 +452,7 @@ float16x8_t test_vfmaq_n_f16(float16x8_t a, float16x8_t b, 
float16_t c) {
 // CONSTRAINED-SAME: half noundef [[A:%.*]], half noundef [[B:%.*]], <4 x 
half> noundef [[C:%.*]]) #[[ATTR0]] {
 // CONSTRAINED-NEXT:  [[ENTRY:.*:]]
 // CONSTRAINED-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x half> [[C]], i32 
3
-// CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[B]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[B]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret half [[TMP0]]
 //
 float16_t test_vfmah_lane_f16(float16_t a, float16_t b, float16x4_t c) {
@@ -470,7 +470,7 @@ float16_t test_vfmah_lane_f16(float16_t a, float16_t b, 
float16x4_t c) {
 // CONSTRAINED-SAME: half noundef [[A:%.*]], half noundef [[B:%.*]], <8 x 
half> noundef [[C:%.*]]) #[[ATTR0]] {
 // CONSTRAINED-NEXT:  [[ENTRY:.*:]]
 // CONSTRAINED-NEXT:    [[EXTRACT:%.*]] = extractelement <8 x half> [[C]], i32 
7
-// CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[B]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[B]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret half [[TMP0]]
 //
 float16_t test_vfmah_laneq_f16(float16_t a, float16_t b, float16x8_t c) {
@@ -508,7 +508,7 @@ float16_t test_vfmah_laneq_f16(float16_t a, float16_t b, 
float16x8_t c) {
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <4 x half> [[TMP6]], <4 x 
half> [[TMP6]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
 // CONSTRAINED-NEXT:    [[FMLA:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[FMLA1:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
-// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[FMLA]], <4 x half> 
[[LANE]], <4 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[FMLA]], <4 x half> 
[[LANE]], <4 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[FMLA2]]
 //
 float16x4_t test_vfms_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
@@ -546,7 +546,7 @@ float16x4_t test_vfms_lane_f16(float16x4_t a, float16x4_t 
b, float16x4_t c) {
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <4 x half> [[TMP6]], <4 x 
half> [[TMP6]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 
3>
 // CONSTRAINED-NEXT:    [[FMLA:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[FMLA1:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x 
half>
-// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[FMLA]], <8 x half> 
[[LANE]], <8 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[FMLA2:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[FMLA]], <8 x half> 
[[LANE]], <8 x half> [[FMLA1]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[FMLA2]]
 //
 float16x8_t test_vfmsq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) {
@@ -584,7 +584,7 @@ float16x8_t test_vfmsq_lane_f16(float16x8_t a, float16x8_t 
b, float16x4_t c) {
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <8 x half> [[TMP8]], <8 x 
half> [[TMP8]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[LANE]], <4 x half> 
[[TMP7]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[LANE]], <4 x half> 
[[TMP7]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfms_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) {
@@ -622,7 +622,7 @@ float16x4_t test_vfms_laneq_f16(float16x4_t a, float16x4_t 
b, float16x8_t c) {
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
 // CONSTRAINED-NEXT:    [[LANE:%.*]] = shufflevector <8 x half> [[TMP8]], <8 x 
half> [[TMP8]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 
7>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[LANE]], <8 x half> 
[[TMP7]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[LANE]], <8 x half> 
[[TMP7]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmsq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
@@ -666,7 +666,7 @@ float16x8_t test_vfmsq_laneq_f16(float16x8_t a, float16x8_t 
b, float16x8_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <8 x i8> [[TMP3]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <4 x half> 
@llvm.experimental.constrained.fma.v4f16(<4 x half> [[TMP7]], <4 x half> 
[[TMP8]], <4 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <4 x half> [[TMP9]]
 //
 float16x4_t test_vfms_n_f16(float16x4_t a, float16x4_t b, float16_t c) {
@@ -718,7 +718,7 @@ float16x4_t test_vfms_n_f16(float16x4_t a, float16x4_t b, 
float16_t c) {
 // CONSTRAINED-NEXT:    [[TMP6:%.*]] = bitcast <16 x i8> [[TMP3]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half>
 // CONSTRAINED-NEXT:    [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half>
-// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP9:%.*]] = call <8 x half> 
@llvm.experimental.constrained.fma.v8f16(<8 x half> [[TMP7]], <8 x half> 
[[TMP8]], <8 x half> [[TMP6]], metadata !"round.tonearest", metadata 
!"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret <8 x half> [[TMP9]]
 //
 float16x8_t test_vfmsq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {
@@ -742,7 +742,7 @@ float16x8_t test_vfmsq_n_f16(float16x8_t a, float16x8_t b, 
float16_t c) {
 // CONSTRAINED-NEXT:    [[FNEG:%.*]] = fneg float [[CONV]]
 // CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fptrunc.f16.f32(float [[FNEG]], metadata 
!"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x half> [[C]], i32 
3
-// CONSTRAINED-NEXT:    [[TMP1:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[TMP0]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP1:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[TMP0]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret half [[TMP1]]
 //
 float16_t test_vfmsh_lane_f16(float16_t a, float16_t b, float16x4_t c) {
@@ -766,7 +766,7 @@ float16_t test_vfmsh_lane_f16(float16_t a, float16_t b, 
float16x4_t c) {
 // CONSTRAINED-NEXT:    [[FNEG:%.*]] = fneg float [[CONV]]
 // CONSTRAINED-NEXT:    [[TMP0:%.*]] = call half 
@llvm.experimental.constrained.fptrunc.f16.f32(float [[FNEG]], metadata 
!"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    [[EXTRACT:%.*]] = extractelement <8 x half> [[C]], i32 
7
-// CONSTRAINED-NEXT:    [[TMP1:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[TMP0]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
+// CONSTRAINED-NEXT:    [[TMP1:%.*]] = call half 
@llvm.experimental.constrained.fma.f16(half [[TMP0]], half [[EXTRACT]], half 
[[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR2]]
 // CONSTRAINED-NEXT:    ret half [[TMP1]]
 //
 float16_t test_vfmsh_laneq_f16(float16_t a, float16_t b, float16x8_t c) {
diff --git a/clang/test/CodeGen/constrained-math-builtins.c 
b/clang/test/CodeGen/constrained-math-builtins.c
index 68b9e75283c54..ae07cce05b307 100644
--- a/clang/test/CodeGen/constrained-math-builtins.c
+++ b/clang/test/CodeGen/constrained-math-builtins.c
@@ -123,17 +123,17 @@ __builtin_atan2(f,f);        __builtin_atan2f(f,f);       
__builtin_atan2l(f,f);
 
   __builtin_fmax(f,f);       __builtin_fmaxf(f,f);      __builtin_fmaxl(f,f); 
__builtin_fmaxf128(f,f);
 
-// CHECK: call double @llvm.experimental.constrained.maxnum.f64(double 
%{{.*}}, double %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call float @llvm.experimental.constrained.maxnum.f32(float %{{.*}}, 
float %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call x86_fp80 @llvm.experimental.constrained.maxnum.f80(x86_fp80 
%{{.*}}, x86_fp80 %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call fp128 @llvm.experimental.constrained.maxnum.f128(fp128 %{{.*}}, 
fp128 %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz double @llvm.experimental.constrained.maxnum.f64(double 
%{{.*}}, double %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz float @llvm.experimental.constrained.maxnum.f32(float 
%{{.*}}, float %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz x86_fp80 @llvm.experimental.constrained.maxnum.f80(x86_fp80 
%{{.*}}, x86_fp80 %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz fp128 @llvm.experimental.constrained.maxnum.f128(fp128 
%{{.*}}, fp128 %{{.*}}, metadata !"fpexcept.strict")
 
   __builtin_fmin(f,f);       __builtin_fminf(f,f);      __builtin_fminl(f,f); 
__builtin_fminf128(f,f);
 
-// CHECK: call double @llvm.experimental.constrained.minnum.f64(double 
%{{.*}}, double %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call float @llvm.experimental.constrained.minnum.f32(float %{{.*}}, 
float %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call x86_fp80 @llvm.experimental.constrained.minnum.f80(x86_fp80 
%{{.*}}, x86_fp80 %{{.*}}, metadata !"fpexcept.strict")
-// CHECK: call fp128 @llvm.experimental.constrained.minnum.f128(fp128 %{{.*}}, 
fp128 %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz double @llvm.experimental.constrained.minnum.f64(double 
%{{.*}}, double %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz float @llvm.experimental.constrained.minnum.f32(float 
%{{.*}}, float %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz x86_fp80 @llvm.experimental.constrained.minnum.f80(x86_fp80 
%{{.*}}, x86_fp80 %{{.*}}, metadata !"fpexcept.strict")
+// CHECK: call nsz fp128 @llvm.experimental.constrained.minnum.f128(fp128 
%{{.*}}, fp128 %{{.*}}, metadata !"fpexcept.strict")
 
   __builtin_llrint(f);     __builtin_llrintf(f);    __builtin_llrintl(f); 
__builtin_llrintf128(f);
 

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

Reply via email to