[clang] [clang codegen] Emit int TBAA metadata on more FP math libcalls (PR #100302)
Matt Arsenault via cfe-commits
cfe-commits at lists.llvm.org
Sun Jul 28 01:03:11 PDT 2024
================
@@ -4,37 +4,76 @@
// RUN: %clang_cc1 -triple=aarch64-unknown-linux-gnu -fmath-errno -O3 -new-struct-path-tbaa -emit-llvm -o - -x c++ %s | FileCheck %s -check-prefixes=CHECK,NewStructPathTBAA
extern "C" float expf(float);
+extern "C" double remainder(double, double);
+extern "C" double fabs(double);
// Emit int TBAA metadata on FP math libcalls, which is useful for alias analysis
// CHECK-LABEL: define dso_local float @foo(
-// CHECK-SAME: ptr nocapture noundef readonly [[NUM:%.*]], float noundef [[R2INV:%.*]], i32 noundef [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
+// CHECK-SAME: ptr nocapture noundef readonly [[NUM:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[NUM]], i64 40
// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2:![0-9]+]]
-// CHECK-NEXT: [[CALL:%.*]] = tail call float @expf(float noundef [[TMP0]]) #[[ATTR2:[0-9]+]], !tbaa [[TBAA6:![0-9]+]]
+// CHECK-NEXT: [[CALL:%.*]] = tail call float @expf(float noundef [[TMP0]]) #[[ATTR4:[0-9]+]], !tbaa [[TBAA6:![0-9]+]]
// CHECK-NEXT: [[MUL:%.*]] = fmul float [[TMP0]], [[CALL]]
// CHECK-NEXT: ret float [[MUL]]
//
-extern "C" float foo (float num[], float r2inv, int n) {
- const float expm2 = expf(num[10]); // Emit TBAA metadata on @expf
+extern "C" float foo (float num[]) {
+ const float expm2 = expf(num[10]); // Emit TBAA metadata on @expf
float tmp = expm2 * num[10];
return tmp;
}
+
+//
+// Negative test: fabs cannot set errno
+// CHECK-LABEL: define dso_local double @foo_fabs(
+// CHECK-SAME: ptr nocapture noundef readonly [[NUM:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {
+// CHECK-NEXT: [[ENTRY:.*:]]
+// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[NUM]], i64 80
+// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
+// CHECK-NEXT: [[TMP1:%.*]] = tail call double @llvm.fabs.f64(double [[TMP0]])
+// CHECK-NEXT: [[MUL:%.*]] = fmul double [[TMP0]], [[TMP1]]
+// CHECK-NEXT: ret double [[MUL]]
+//
+extern "C" double foo_fabs (double num[]) {
+ const double expm2 = fabs(num[10]); // Don't emit TBAA metadata
+ double tmp = expm2 * num[10];
+ return tmp;
+}
+
+// CHECK-LABEL: define dso_local double @foo_remainder(
+// CHECK-SAME: ptr nocapture noundef readonly [[NUM:%.*]], double noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] {
+// CHECK-NEXT: [[ENTRY:.*:]]
+// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[NUM]], i64 80
+// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8]]
+// CHECK-NEXT: [[CALL:%.*]] = tail call double @remainder(double noundef [[TMP0]], double noundef [[A]]) #[[ATTR4]], !tbaa [[TBAA6]]
+// CHECK-NEXT: [[MUL:%.*]] = fmul double [[TMP0]], [[CALL]]
+// CHECK-NEXT: ret double [[MUL]]
+//
+extern "C" double foo_remainder (double num[], double a) {
+ const double expm2 = remainder(num[10], a); // Emit TBAA metadata
+ double tmp = expm2 * num[10];
+ return tmp;
+}
+
----------------
arsenm wrote:
Test a few more functions for good measure? Also test some cases with out arguments, like frexp.
Also test sincos? it has out float arguments so I'm not sure you apply this
https://github.com/llvm/llvm-project/pull/100302
More information about the cfe-commits
mailing list