Successfully identified regression in *gcc* in CI configuration 
tcwg_bmk_llvm_tk1/llvm-master-arm-spec2k6-O3_LTO.  So far, this commit has 
regressed CI configurations:
 - tcwg_bmk_llvm_tk1/llvm-master-arm-spec2k6-O3_LTO

Culprit:
<cut>
commit c77230856eac2d28eb7bf10985846885c3c8727b
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Sat Jul 3 00:13:29 2021 +0200

    d: RHS value lost when a target_expr modifies LHS in a cond_expr
    
    To prevent the RHS of an assignment modifying the LHS before the
    assignment proper, a target_expr is forced so that function calls that
    return with slot optimization modify the temporary instead.  This did
    not work for conditional expressions however, to give one example.  So
    now the RHS is always forced to a temporary.
    
            PR d/101282
    
    gcc/d/ChangeLog:
    
            * d-codegen.cc (build_assign): Force target_expr on RHS for non-POD
            assignment expressions.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/torture/pr101282.d: New test.
</cut>

Results regressed to (for first_bad == c77230856eac2d28eb7bf10985846885c3c8727b)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_abe stage1 -- --set gcc_override_configure=--with-mode=arm --set 
gcc_override_configure=--disable-libsanitizer:
-8
# build_abe linux:
-7
# build_abe glibc:
-6
# build_abe stage2 -- --set gcc_override_configure=--with-mode=arm --set 
gcc_override_configure=--disable-libsanitizer:
-5
# build_llvm true:
-3
# true:
0
# benchmark -O3_LTO_marm -- 
artifacts/build-c77230856eac2d28eb7bf10985846885c3c8727b/results_id:
1
# 447.dealII,dealII_base.default                                regressed by 103

from (for last_good == 6feb628a706e86eb3f303aff388c74bdb29e7381)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_abe stage1 -- --set gcc_override_configure=--with-mode=arm --set 
gcc_override_configure=--disable-libsanitizer:
-8
# build_abe linux:
-7
# build_abe glibc:
-6
# build_abe stage2 -- --set gcc_override_configure=--with-mode=arm --set 
gcc_override_configure=--disable-libsanitizer:
-5
# build_llvm true:
-3
# true:
0
# benchmark -O3_LTO_marm -- 
artifacts/build-6feb628a706e86eb3f303aff388c74bdb29e7381/results_id:
1

Artifacts of last_good build: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/build-6feb628a706e86eb3f303aff388c74bdb29e7381/
Results ID of last_good: 
tk1_32/tcwg_bmk_llvm_tk1/bisect-llvm-master-arm-spec2k6-O3_LTO/1951
Artifacts of first_bad build: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/build-c77230856eac2d28eb7bf10985846885c3c8727b/
Results ID of first_bad: 
tk1_32/tcwg_bmk_llvm_tk1/bisect-llvm-master-arm-spec2k6-O3_LTO/1938
Build top page/logs: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/

Configuration details:


Reproduce builds:
<cut>
mkdir investigate-gcc-c77230856eac2d28eb7bf10985846885c3c8727b
cd investigate-gcc-c77230856eac2d28eb7bf10985846885c3c8727b

git clone https://git.linaro.org/toolchain/jenkins-scripts

mkdir -p artifacts/manifests
curl -o artifacts/manifests/build-baseline.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/manifests/build-baseline.sh
 --fail
curl -o artifacts/manifests/build-parameters.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/manifests/build-parameters.sh
 --fail
curl -o artifacts/test.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/test.sh
 --fail
chmod +x artifacts/test.sh

# Reproduce the baseline build (build all pre-requisites)
./jenkins-scripts/tcwg_bmk-build.sh @@ artifacts/manifests/build-baseline.sh

# Save baseline build state (which is then restored in artifacts/test.sh)
rsync -a --del --delete-excluded --exclude bisect/ --exclude artifacts/ 
--exclude gcc/ ./ ./bisect/baseline/

cd gcc

# Reproduce first_bad build
git checkout --detach c77230856eac2d28eb7bf10985846885c3c8727b
../artifacts/test.sh

# Reproduce last_good build
git checkout --detach 6feb628a706e86eb3f303aff388c74bdb29e7381
../artifacts/test.sh

cd ..
</cut>

History of pending regressions and results: 
https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/ci/tcwg_bmk_llvm_tk1/llvm-master-arm-spec2k6-O3_LTO

Artifacts: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/artifact/artifacts/
Build log: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tk1-llvm-master-arm-spec2k6-O3_LTO/14/consoleText

Full commit (up to 1000 lines):
<cut>
commit c77230856eac2d28eb7bf10985846885c3c8727b
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Sat Jul 3 00:13:29 2021 +0200

    d: RHS value lost when a target_expr modifies LHS in a cond_expr
    
    To prevent the RHS of an assignment modifying the LHS before the
    assignment proper, a target_expr is forced so that function calls that
    return with slot optimization modify the temporary instead.  This did
    not work for conditional expressions however, to give one example.  So
    now the RHS is always forced to a temporary.
    
            PR d/101282
    
    gcc/d/ChangeLog:
    
            * d-codegen.cc (build_assign): Force target_expr on RHS for non-POD
            assignment expressions.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/torture/pr101282.d: New test.
---
 gcc/d/d-codegen.cc                      |  7 +++++++
 gcc/testsuite/gdc.dg/torture/pr101282.d | 23 +++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index 9a9447371aa..ce7c17baaaf 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -1344,6 +1344,13 @@ build_assign (tree_code code, tree lhs, tree rhs)
       d_mark_addressable (lhs);
       CALL_EXPR_RETURN_SLOT_OPT (rhs) = true;
     }
+  /* If modifying an LHS whose type is marked TREE_ADDRESSABLE.  */
+  else if (code == MODIFY_EXPR && TREE_ADDRESSABLE (TREE_TYPE (lhs))
+          && TREE_SIDE_EFFECTS (rhs) && TREE_CODE (rhs) != TARGET_EXPR)
+    {
+      /* LHS may be referenced by the RHS expression, so force a temporary.  */
+      rhs = force_target_expr (rhs);
+    }
 
   /* The LHS assignment replaces the temporary in TARGET_EXPR_SLOT.  */
   if (TREE_CODE (rhs) == TARGET_EXPR)
diff --git a/gcc/testsuite/gdc.dg/torture/pr101282.d 
b/gcc/testsuite/gdc.dg/torture/pr101282.d
new file mode 100644
index 00000000000..b75d5fc678f
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/torture/pr101282.d
@@ -0,0 +1,23 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101282
+// { dg-do run }
+
+void main()
+{
+    struct S101282
+    {
+        int impl;
+        S101282 opUnary(string op : "-")()
+        {
+            return S101282(-impl);
+        }
+        int opCmp(int i)
+        {
+            return (impl < i) ? -1 : (impl > i) ? 1 : 0;
+        }
+    }
+    auto a = S101282(120);
+    a = -a;
+    assert(a.impl == -120);
+    a = a >= 0 ? a : -a;
+    assert(a.impl == 120);
+}
</cut>
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to