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-03-03 20:22:15.000000000 +0000 +++ llvm-toolchain-3.9-3.9.1/debian/changelog 2017-07-26 12:19:30.000000000 +0000 @@ -1,3 +1,11 @@ +llvm-toolchain-3.9 (1:3.9.1-4ubuntu3~14.04.3) trusty; urgency=medium + + * Backport upstream patch to fix a rustc miscompilation bug on armhf + - add debian/patches/fix-computeKnownBits-for-ARMISD::CMOV.patch + - update debian/patches/series + + -- Chris Coulson Wed, 26 Jul 2017 13:19:30 +0100 + llvm-toolchain-3.9 (1:3.9.1-4ubuntu3~14.04.2) trusty-security; urgency=medium [ Matthias Klose ] diff -Nru llvm-toolchain-3.9-3.9.1/debian/patches/fix-computeKnownBits-for-ARMISD::CMOV.patch llvm-toolchain-3.9-3.9.1/debian/patches/fix-computeKnownBits-for-ARMISD::CMOV.patch --- llvm-toolchain-3.9-3.9.1/debian/patches/fix-computeKnownBits-for-ARMISD::CMOV.patch 1970-01-01 00:00:00.000000000 +0000 +++ llvm-toolchain-3.9-3.9.1/debian/patches/fix-computeKnownBits-for-ARMISD::CMOV.patch 2017-07-26 12:19:25.000000000 +0000 @@ -0,0 +1,67 @@ +From cdc303e5ed4d3110e6f70931775a70bb1de44ed6 Mon Sep 17 00:00:00 2001 +From: Pirama Arumuga Nainar +Date: Thu, 23 Mar 2017 16:47:47 +0000 +Subject: [PATCH] [ARM] 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 0c17211cce3..ea438a19b0c 100644 +--- a/lib/Target/ARM/ARMISelLowering.cpp ++++ b/lib/Target/ARM/ARMISelLowering.cpp +@@ -11695,8 +11695,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 ++} 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-02-24 18:30:06.000000000 +0000 +++ llvm-toolchain-3.9-3.9.1/debian/patches/series 2017-07-26 12:19:30.000000000 +0000 @@ -48,3 +48,4 @@ esan-Fix-ESan-test-failure-on-Debian-Sid-bot.diff esan-Fix-ESan-test-failure-on-Debian-Sid-bot2.diff gcc-4.8-aarch64-ice.diff +fix-computeKnownBits-for-ARMISD::CMOV.patch