[clang] Don't emit int TBAA metadata on more complex FP math libcalls. (PR #107598)

Zahira Ammarguellat via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 17 04:50:54 PDT 2024


https://github.com/zahiraam updated https://github.com/llvm/llvm-project/pull/107598

>From 0763f8d25194e18a040d4cd4cde7c88b6fccbb44 Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Fri, 6 Sep 2024 08:01:25 -0700
Subject: [PATCH 1/7] Don't emit int TBAA metadata on more complex FP math
 libcalls.

---
 clang/lib/CodeGen/CGBuiltin.cpp               | 15 +++++++--
 .../test/CodeGen/complex-math-libcalls-tbaa.c | 31 +++++++++++++++++++
 2 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/CodeGen/complex-math-libcalls-tbaa.c

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index e4d169d2ad6030..a84c9ca4be8a72 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -699,9 +699,20 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
     bool ConstWithoutErrnoAndExceptions =
         Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
     // Restrict to target with errno, for example, MacOS doesn't set errno.
-    // TODO: Support builtin function with complex type returned, eg: cacosh
+    bool CallWithPointerArgsOrPointerReturnType = false;
+    if (Call.isScalar()) {
+      if (CallBase *CB = dyn_cast<CallBase>(Call.getScalarVal())) {
+        for (Value *A : CB->args())
+          if (A->getType()->isPointerTy())
+            CallWithPointerArgsOrPointerReturnType = true;
+        CallWithPointerArgsOrPointerReturnType =
+          CallWithPointerArgsOrPointerReturnType ||
+          CB->getFunctionType()->getReturnType()->isPointerTy();
+      }
+    }
     if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&
-        !CGF.Builder.getIsFPConstrained() && Call.isScalar()) {
+        !CGF.Builder.getIsFPConstrained() && Call.isScalar() &&
+        !CallWithPointerArgsOrPointerReturnType) {
       // Emit "int" TBAA metadata on FP math libcalls.
       clang::QualType IntTy = Context.IntTy;
       TBAAAccessInfo TBAAInfo = CGF.CGM.getTBAAAccessInfo(IntTy);
diff --git a/clang/test/CodeGen/complex-math-libcalls-tbaa.c b/clang/test/CodeGen/complex-math-libcalls-tbaa.c
new file mode 100644
index 00000000000000..957dae6361b6f6
--- /dev/null
+++ b/clang/test/CodeGen/complex-math-libcalls-tbaa.c
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 %s -O3  -fmath-errno -emit-llvm -triple x86_64-unknown-unknown -o - %s | FileCheck %s -check-prefixes=CHECK
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple x86_64-pc-win64 -o - %s | FileCheck %s -check-prefixes=CHECK
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple i686-unknown-unknown -o - %s | FileCheck %s -check-prefixes=CHECK
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple powerpc-unknown-unknown -o - %s | FileCheck %s -check-prefixes=CHECK-PPC
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple armv7-none-linux-gnueabi -o - %s | FileCheck %s -check-prefixes=CHECK-TBAA,TBAA
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple armv7-none-linux-gnueabihf -o - %s | FileCheck %s -check-prefixes=CHECK-ARM,TBAA
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple thumbv7k-apple-watchos2.0 -o - -target-abi aapcs16 %s | FileCheck %s -check-prefixes=CHECK-THUMB,TBAA
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple aarch64-unknown-unknown -o - %s | FileCheck %s -check-prefixes=CHECK-AARCH,TBAA
+// RUN: %clang_cc1 %s -O3 -fmath-errno -emit-llvm -triple spir -o - %s | FileCheck %s -check-prefixes=CHECK-SPIR
+
+_Complex long double foo() {
+  _Complex long double cld;
+  long double v2 = __builtin_cargl(cld);
+  _Complex long double tmp = v2 * cld;
+  return tmp;
+}
+// CHECK: tail call x86_fp80 @cargl(ptr noundef nonnull byval({ {{.*}}, {{.*}} })
+// CHECK-PPC: tail call ppc_fp128 @cargl(ptr noundef nonnull byval({ ppc_fp128, ppc_fp128 })
+// CHECK-TBAA: tail call double @cargl([2 x i64] noundef undef) #[[ATTR1:[0-9]+]], !tbaa [[TBAA3:![0-9]+]]
+
+// CHECK-ARM: tail call double @cargl({ double, double } noundef undef) #[[ATTR1:[0-9]+]], !tbaa [[TBAA3:![0-9]+]]
+
+// CHECK-THUMB: tail call double @cargl([2 x double] noundef undef) #[[ATTR1:[0-9]+]], !tbaa [[TBAA3:![0-9]+]]
+
+// CHECK-AARCH: tail call fp128 @cargl([2 x fp128] noundef alignstack(16) undef) #[[ATTR1:[0-9]+]], !tbaa [[TBAA3:![0-9]+]]
+
+// CHECK-SPIR: tail call spir_func double @cargl(ptr noundef nonnull byval({ {{.*}}, {{.*}} })
+
+// TBAA: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
+// TBAA: [[META4]] = !{!"int", [[META5:![0-9]+]], i64 0}
+// TBAA: [[META5]] = !{!"omnipotent char", [[META6:![0-9]+]], i64 0}

>From 358407997bee2c218bfc3a7e11704fd3191b8abb Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Fri, 6 Sep 2024 08:19:17 -0700
Subject: [PATCH 2/7] Fix format.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index a84c9ca4be8a72..3b9d994041ecab 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -706,8 +706,8 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
           if (A->getType()->isPointerTy())
             CallWithPointerArgsOrPointerReturnType = true;
         CallWithPointerArgsOrPointerReturnType =
-          CallWithPointerArgsOrPointerReturnType ||
-          CB->getFunctionType()->getReturnType()->isPointerTy();
+            CallWithPointerArgsOrPointerReturnType ||
+            CB->getFunctionType()->getReturnType()->isPointerTy();
       }
     }
     if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&

>From 72d939befeea47c609de5bfc3850c7376a6e5865 Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Fri, 6 Sep 2024 11:55:30 -0700
Subject: [PATCH 3/7] Added fix to the failed LIT tests.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 3b9d994041ecab..ed8a977c8088ab 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -700,7 +700,7 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
         Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
     // Restrict to target with errno, for example, MacOS doesn't set errno.
     bool CallWithPointerArgsOrPointerReturnType = false;
-    if (Call.isScalar()) {
+    if (Call.isScalar() && Call.getScalarVal()) {
       if (CallBase *CB = dyn_cast<CallBase>(Call.getScalarVal())) {
         for (Value *A : CB->args())
           if (A->getType()->isPointerTy())

>From 9ad690aa2406a8ee1e36bb20203e8d3ad165361f Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Thu, 12 Sep 2024 07:11:03 -0700
Subject: [PATCH 4/7] Addressed review comments.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index ed8a977c8088ab..24d53f32e72a1c 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -686,6 +686,20 @@ static Value *EmitSignBit(CodeGenFunction &CGF, Value *V) {
   return CGF.Builder.CreateICmpSLT(V, Zero);
 }
 
+static bool hasPointerArgsOrPointerReturnType(const Value *V) {
+  if (const CallBase *CB = dyn_cast<CallBase>(V)) {
+    for (const Value *A : CB->args()) {
+      if (A->getType()->isPointerTy()) {
+        return true;
+      }
+    }
+    if (CB->getFunctionType()->getReturnType()->isPointerTy()) {
+      return true;
+    }
+  }
+  return false;
+}
+
 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
                               const CallExpr *E, llvm::Constant *calleeValue) {
   CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
@@ -699,17 +713,8 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
     bool ConstWithoutErrnoAndExceptions =
         Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
     // Restrict to target with errno, for example, MacOS doesn't set errno.
-    bool CallWithPointerArgsOrPointerReturnType = false;
-    if (Call.isScalar() && Call.getScalarVal()) {
-      if (CallBase *CB = dyn_cast<CallBase>(Call.getScalarVal())) {
-        for (Value *A : CB->args())
-          if (A->getType()->isPointerTy())
-            CallWithPointerArgsOrPointerReturnType = true;
-        CallWithPointerArgsOrPointerReturnType =
-            CallWithPointerArgsOrPointerReturnType ||
-            CB->getFunctionType()->getReturnType()->isPointerTy();
-      }
-    }
+    bool CallWithPointerArgsOrPointerReturnType =
+        hasPointerArgsOrPointerReturnType(Call.getScalarVal());
     if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&
         !CGF.Builder.getIsFPConstrained() && Call.isScalar() &&
         !CallWithPointerArgsOrPointerReturnType) {

>From 19bb4674def16828b02d762e1f5e603da0c9ffcb Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Thu, 12 Sep 2024 11:45:43 -0700
Subject: [PATCH 5/7] Added fix for the LIT failures.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 24d53f32e72a1c..59bb0208e67fe3 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -714,6 +714,7 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
         Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
     // Restrict to target with errno, for example, MacOS doesn't set errno.
     bool CallWithPointerArgsOrPointerReturnType =
+        Call.isScalar() && Call.getScalarVal() &&
         hasPointerArgsOrPointerReturnType(Call.getScalarVal());
     if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&
         !CGF.Builder.getIsFPConstrained() && Call.isScalar() &&

>From c34d2eaf5a652a9f58b282336acb5e357a526cfe Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Mon, 16 Sep 2024 09:42:09 -0700
Subject: [PATCH 6/7] Addressed review comments.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 38 ++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 59bb0208e67fe3..0dad858640b75f 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -686,15 +686,15 @@ static Value *EmitSignBit(CodeGenFunction &CGF, Value *V) {
   return CGF.Builder.CreateICmpSLT(V, Zero);
 }
 
-static bool hasPointerArgsOrPointerReturnType(const Value *V) {
-  if (const CallBase *CB = dyn_cast<CallBase>(V)) {
-    for (const Value *A : CB->args()) {
-      if (A->getType()->isPointerTy()) {
-        return true;
+static bool hasPointerArgsOrPointerReturnType(Value *V) {
+  if (V) {
+    if (const CallBase *CB = dyn_cast<CallBase>(V)) {
+      for (const Value *A : CB->args()) {
+        if (A->getType()->isPointerTy())
+          return true;
       }
-    }
-    if (CB->getFunctionType()->getReturnType()->isPointerTy()) {
-      return true;
+      if (CB->getFunctionType()->getReturnType()->isPointerTy())
+        return true;
     }
   }
   return false;
@@ -713,17 +713,17 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
     bool ConstWithoutErrnoAndExceptions =
         Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
     // Restrict to target with errno, for example, MacOS doesn't set errno.
-    bool CallWithPointerArgsOrPointerReturnType =
-        Call.isScalar() && Call.getScalarVal() &&
-        hasPointerArgsOrPointerReturnType(Call.getScalarVal());
-    if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&
-        !CGF.Builder.getIsFPConstrained() && Call.isScalar() &&
-        !CallWithPointerArgsOrPointerReturnType) {
-      // Emit "int" TBAA metadata on FP math libcalls.
-      clang::QualType IntTy = Context.IntTy;
-      TBAAAccessInfo TBAAInfo = CGF.CGM.getTBAAAccessInfo(IntTy);
-      Instruction *Inst = cast<llvm::Instruction>(Call.getScalarVal());
-      CGF.CGM.DecorateInstructionWithTBAA(Inst, TBAAInfo);
+    if (Call.isScalar()) {
+      Value *Val = Call.getScalarVal();
+      if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno &&
+          !CGF.Builder.getIsFPConstrained() &&
+          !hasPointerArgsOrPointerReturnType(Val)) {
+        // Emit "int" TBAA metadata on FP math libcalls.
+        clang::QualType IntTy = Context.IntTy;
+        TBAAAccessInfo TBAAInfo = CGF.CGM.getTBAAAccessInfo(IntTy);
+        Instruction *Inst = cast<llvm::Instruction>(Val);
+        CGF.CGM.DecorateInstructionWithTBAA(Inst, TBAAInfo);
+      }
     }
   }
   return Call;

>From a31a946fcf8125444a7469c003b3dde7790306d9 Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <zahira.ammarguellat at intel.com>
Date: Tue, 17 Sep 2024 04:50:26 -0700
Subject: [PATCH 7/7] Addressed missed review comment.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 0dad858640b75f..8d294628bf5fbf 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -689,12 +689,11 @@ static Value *EmitSignBit(CodeGenFunction &CGF, Value *V) {
 static bool hasPointerArgsOrPointerReturnType(Value *V) {
   if (V) {
     if (const CallBase *CB = dyn_cast<CallBase>(V)) {
-      for (const Value *A : CB->args()) {
-        if (A->getType()->isPointerTy())
+      if (llvm::any_of(CB->args(), [](const Value *A) {
+            return A->getType()->isPointerTy();
+          }))
+        if (CB->getFunctionType()->getReturnType()->isPointerTy())
           return true;
-      }
-      if (CB->getFunctionType()->getReturnType()->isPointerTy())
-        return true;
     }
   }
   return false;



More information about the cfe-commits mailing list