Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Tulio Magno Quites Machado Filho
b14e74d250 Backport 2 fixes from upstream
These patches are mandatory in order to test LLVM 19, e.g. when testing
the daily snapshots.
2024-04-16 16:45:30 -03:00
3 changed files with 119 additions and 1 deletions

View file

@ -0,0 +1,87 @@
From 259fcdabfd843d01fccd9a1aeb44642e9043a883 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett@linaro.org>
Date: Wed, 15 Mar 2023 15:19:11 +0000
Subject: [PATCH] [gcc-c-torture] Disable frame-address.c test due to incorrect
tail call prevention
These checks were added to the original test by:
https://github.com/gcc-mirror/gcc/commit/0f149d5215a22a03406a82ec1669bf65b329a4df
Since 6b545db83c5a4e2c79e0b289e840be2c5fbbf327, clang has learned
to see through this tail call prevention.
First seen by us on our SVE bot which runs the test suite at -O3:
https://lab.llvm.org/buildbot/#/builders/197/builds/4192
Clang is correct here, this is why:
```
int check_fa_work (const char *c, const char *f)
{
const char d = 0;
if (c >= &d)
return c >= f && f >= &d;
else
return c <= f && f <= &d;
}
```
This function only ever returns 0 or 1 due to the `&&`.
```
int check_fa_mid (const char *c)
{
const char *f = __builtin_frame_address (0);
/* Prevent a tail call to check_fa_work, eliding the current stack frame. */
return check_fa_work (c, f) != 0;
}
```
This function returns whether the result of check_fa_work is not equal to 0.
Clang has realised that if check_fa_work returns 0, check_fa_mid does also.
Same for 1. Meaning you can tail call check_fa_work.
check_fa_work returns 0, 0 != 0 is False, so check_fa_mid returns 0
check_fa_work returns 1, 1 != 0 is True, so check_fa_mid returns 1
Giving you asm like:
```
check_fa_mid: // @check_fa_mid
stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
mov x29, sp
mov x1, x29
ldp x29, x30, [sp], #16 // 16-byte Folded Reload
b check_fa_work
```
Which means we have one less frame and the test fails.
A correct way to do it would be "==" which would have to invert the result.
However we cannot modify the test files, so disable the test instead.
I have filed a bug with gcc:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109146
Reviewed By: lenary
Differential Revision: https://reviews.llvm.org/D146143
---
.../Regression/C/gcc-c-torture/execute/CMakeLists.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt b/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
index acbc0798..630fa7e3 100644
--- a/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
@@ -140,6 +140,10 @@ file(GLOB UnsupportedTests CONFIGURE_DEPENDS
# Size of array element is not a multiple of its alignment.
pr36093.c
pr43783.c
+
+ # Uses an incorrect method to prevent tailcalls which clang at -O1 or above
+ # can see through and tail call regardless.
+ frame-address.c
)
list(APPEND TestsToSkip ${UnsupportedTests})
--
2.44.0

View file

@ -0,0 +1,26 @@
From d10245e73a71cee2beb737863ffe8f146f4d47e0 Mon Sep 17 00:00:00 2001
From: antoine moynault <antoine.moynault@linaro.org>
Date: Thu, 21 Dec 2023 16:41:50 +0100
Subject: [PATCH] [gcc-c-torture] use -fwrapv for 950704-1.c (signed overflow)
(#70)
test fails since #76044
---
SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt b/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
index 4788755c..03425811 100644
--- a/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/CMakeLists.txt
@@ -181,6 +181,7 @@ file(GLOB TestRequiresFWrapV CONFIGURE_DEPENDS
20040409-1.c
20040409-2.c
20040409-3.c
+ 950704-1.c
)
# Tests that require -Wno-return-type
--
2.44.0

View file

@ -6,7 +6,7 @@
Name: llvm-test-suite
Version: %{llvm_test_suite_version}%{?rc_ver:~rc%{rc_ver}}
Release: 1%{?dist}
Release: 2%{?dist}
Summary: C/C++ Compiler Test Suite
License: NCSA and BSD and GPLv1 and GPLv2+ and GPLv2 and MIT and Python and Public Domain and CRC32 and AML and Rdisc and ASL 2.0 and LGPLv3
@ -28,6 +28,8 @@ Source2: pkg_test_suite.sh
BuildArch: noarch
Patch0: 0001-Fix-extra-Python3-print-statements.patch
Patch1: 0001-gcc-c-torture-Disable-frame-address.c-test-due-to-in.patch
Patch2: 0001-gcc-c-torture-use-fwrapv-for-950704-1.c-signed-overf.patch
# We need python3-devel for pathfix.py.
BuildRequires: python3-devel
@ -82,6 +84,9 @@ cp -R %{_builddir}/%{test_suite_srcdir}/* %{buildroot}%{_datadir}/llvm-test-suit
%changelog
* Tue Apr 16 2024 Tulio Magno Quites Machado Filho <tuliom@redhat.com> - 16.0.6-2
- Backport 2 fixes from upstream
* Mon Jul 10 2023 Tulio Magno Quites Machado Filho <tuliom@redhat.com> - 16.0.6-1
- Update to LLVM 16.0.6