Bug#864311: llvm-toolchain-3.9: armhf SIGILL when compiling rustc 1.17.0, need to backport upstream D31265

Ximin Luo infinity0 at debian.org
Tue Jun 6 18:40:27 UTC 2017


Source: llvm-toolchain-3.9
Version: 1:3.9.1-9
Severity: important
Tags: upstream patch

Dear Maintainer,

LLVM 3.9 cannot compile rustc 1.17.0 on armhf, one needs to apply this patch (already in LLVM trunk):

https://reviews.llvm.org/D31265

It is attached as a debdiff for your convenience.

For more info see:

https://github.com/rust-lang/llvm/pull/67
https://github.com/rust-lang/rust/issues/41291 (failure on Fedora)
https://github.com/rust-lang/rust/issues/42477 (failure on Debian)

This may affect other projects besides rustc; I'll leave it to you whether to treat this as RC for stretch. We're not targetting rustc 1.17.0 for stretch so it is not RC for rustc's purposes.

X

-- System Information:
Debian Release: 9.0
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'buildd-unstable'), (300, 'unstable'), (100, 'experimental'), (1, 'experimental-debug')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.9.0-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.utf8, LC_CTYPE=en_GB.utf8 (charmap=UTF-8), LANGUAGE=en_GB:en (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
-------------- next part --------------
diff -Nru llvm-toolchain-3.9-3.9.1/debian/changelog llvm-toolchain-3.9-3.9.1/debian/changelog
--- llvm-toolchain-3.9-3.9.1/debian/changelog	2017-06-04 18:04:00.000000000 +0000
+++ llvm-toolchain-3.9-3.9.1/debian/changelog	2017-06-06 12:27:50.000000000 +0000
@@ -1,3 +1,10 @@
+llvm-toolchain-3.9 (1:3.9.1-9.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix a rustc armhf SIGILL by backporting upstream D31265.
+
+ -- Ximin Luo <infinity0 at asachi.debian.org>  Tue, 06 Jun 2017 12:27:50 +0000
+
 llvm-toolchain-3.9 (1:3.9.1-9) unstable; urgency=medium
 
   * debian/patches/fix-R_AARCH64_MOVW_UABS_G3-relocation.patch:
diff -Nru llvm-toolchain-3.9-3.9.1/debian/patches/rust-0032-Fix-computeKnownBits-for-ARMISD-CMOV.patch llvm-toolchain-3.9-3.9.1/debian/patches/rust-0032-Fix-computeKnownBits-for-ARMISD-CMOV.patch
--- llvm-toolchain-3.9-3.9.1/debian/patches/rust-0032-Fix-computeKnownBits-for-ARMISD-CMOV.patch	1970-01-01 00:00:00.000000000 +0000
+++ llvm-toolchain-3.9-3.9.1/debian/patches/rust-0032-Fix-computeKnownBits-for-ARMISD-CMOV.patch	2017-06-06 12:27:50.000000000 +0000
@@ -0,0 +1,70 @@
+From a6fa10c14649c18d299cddf3e823b032460cb6f5 Mon Sep 17 00:00:00 2001
+From: Pirama Arumuga Nainar <pirama at google.com>
+Date: Thu, 23 Mar 2017 16:47:47 +0000
+Subject: [PATCH 32/32] Fix computeKnownBits for ARMISD::CMOV
+
+Summary:
+The true and false operands for the CMOV are operands 0 and 1.
+ARMISelLowering.cpp::computeKnownBits was looking at operands 1 and 2
+instead.  This can cause CMOV instructions to be incorrectly folded into
+BFI if value set by the CMOV is another CMOV, whose known bits are
+computed incorrectly.
+
+This patch fixes the issue and adds a test case.
+
+Reviewers: kristof.beyls, jmolloy
+
+Subscribers: llvm-commits, aemerson, srhines, rengolin
+
+Differential Revision: https://reviews.llvm.org/D31265
+
+git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298624 91177308-0d34-0410-b5e6-96231b3b80d8
+---
+ lib/Target/ARM/ARMISelLowering.cpp |  4 ++--
+ test/CodeGen/ARM/no-cmov2bfi.ll    | 19 +++++++++++++++++++
+ 2 files changed, 21 insertions(+), 2 deletions(-)
+ create mode 100644 test/CodeGen/ARM/no-cmov2bfi.ll
+
+diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp
+index 4a227a3cd7b..cf98e60c065 100644
+--- a/lib/Target/ARM/ARMISelLowering.cpp
++++ b/lib/Target/ARM/ARMISelLowering.cpp
+@@ -10806,8 +10806,8 @@ static void computeKnownBits(SelectionDAG &DAG, SDValue Op, APInt &KnownZero,
+   if (Op.getOpcode() == ARMISD::CMOV) {
+     APInt KZ2(KnownZero.getBitWidth(), 0);
+     APInt KO2(KnownOne.getBitWidth(), 0);
+-    computeKnownBits(DAG, Op.getOperand(1), KnownZero, KnownOne);
+-    computeKnownBits(DAG, Op.getOperand(2), KZ2, KO2);
++    computeKnownBits(DAG, Op.getOperand(0), KnownZero, KnownOne);
++    computeKnownBits(DAG, Op.getOperand(1), KZ2, KO2);
+ 
+     KnownZero &= KZ2;
+     KnownOne &= KO2;
+diff --git a/test/CodeGen/ARM/no-cmov2bfi.ll b/test/CodeGen/ARM/no-cmov2bfi.ll
+new file mode 100644
+index 00000000000..c8b51204890
+--- /dev/null
++++ b/test/CodeGen/ARM/no-cmov2bfi.ll
+@@ -0,0 +1,19 @@
++; RUN: llc < %s -mtriple=thumbv7 | FileCheck --check-prefix=CHECK-NOBFI %s
++
++declare zeroext i1 @dummy()
++
++define i8 @test(i8 %a1, i1 %c) {
++; CHECK-NOBFI-NOT: bfi
++; CHECK-NOBFI: bl      dummy
++; CHECK-NOBFI: cmp     r0, #0
++; CHECK-NOBFI: it      ne
++; CHECK-NOBFI: orrne   [[REG:r[0-9]+]], [[REG]], #8
++; CHECK-NOBFI: mov     r0, [[REG]]
++
++  %1 = and i8 %a1, -9
++  %2 = select i1 %c, i8 %1, i8 %a1
++  %3 = tail call zeroext i1 @dummy()
++  %4 = or i8 %2, 8
++  %ret = select i1 %3, i8 %4, i8 %2
++  ret i8 %ret
++}
+-- 
+2.11.0
+
diff -Nru llvm-toolchain-3.9-3.9.1/debian/patches/series llvm-toolchain-3.9-3.9.1/debian/patches/series
--- llvm-toolchain-3.9-3.9.1/debian/patches/series	2017-06-04 11:15:58.000000000 +0000
+++ llvm-toolchain-3.9-3.9.1/debian/patches/series	2017-06-06 12:27:50.000000000 +0000
@@ -50,3 +50,4 @@
 857623-allow-opencl-pointer-to-bool.diff
 add_symbols_versioning.patch
 fix-R_AARCH64_MOVW_UABS_G3-relocation.patch
+rust-0032-Fix-computeKnownBits-for-ARMISD-CMOV.patch


More information about the Pkg-llvm-team mailing list