<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<font size="-1">Just committed rL351144 fixing this.<br>
</font><br>
<font size="-1">Thanks for the heads up, Reid. </font>
<pre class="moz-signature" cols="72">--
Evandro Menezes
</pre>
<div class="moz-cite-prefix">On 01/14/19 18:54, Reid Kleckner wrote:<br>
</div>
<blockquote
cite="mid:CACs=tyJw+9jQXGSYOtT98qxS9MXR4PAanwr5VjP_=e9DtCvq4w@mail.gmail.com"
type="cite">
<meta http-equiv="Context-Type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">The lit internal shell does not support
'|&':</div>
<div dir="ltr"><br>
<div><a moz-do-not-send="true"
href="http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/3329">http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/3329</a><br>
</div>
<div>
<div>FAIL: LLVM ::
CodeGen/AArch64/misched-fusion-arith-logic.mir (5654 of
29326)</div>
<div>******************** TEST 'LLVM ::
CodeGen/AArch64/misched-fusion-arith-logic.mir' FAILED
********************</div>
<div>shell parser error on: ": 'RUN: at line 1';
C:\\b\\slave\\clang-x64-windows-msvc\\build\\build\\stage1\\bin\\llc.EXE
-o -
C:\\b\\slave\\clang-x64-windows-msvc\\build\\llvm.src\\test\\CodeGen\\AArch64\\misched-fusion-arith-logic.mir
-mtriple aarch64-unknown -mattr=fuse-arith-logic
-run-pass=machine-scheduler -misched-print-dags |&
C:\\b\\slave\\clang-x64-windows-msvc\\build\\build\\stage1\\bin\\FileCheck.EXE
C:\\b\\slave\\clang-x64-windows-msvc\\build\\llvm.src\\test\\CodeGen\\AArch64\\misched-fusion-arith-logic.mir"</div>
<div>********************</div>
</div>
<div><br>
</div>
<div>I'll submit a quick fix.</div>
</div>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Jan 14, 2019 at 3:58
PM Evandro Menezes via llvm-commits <<a
moz-do-not-send="true"
href="mailto:llvm-commits@lists.llvm.org"><a class="moz-txt-link-abbreviated" href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a></a>>
wrote:<br>
</div>
<blockquote class="gmail_quote">Author: evandro<br>
Date: Mon Jan 14 15:54:36 2019<br>
New Revision: 351139<br>
<br>
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project?rev=351139&view=rev"
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=351139&view=rev</a><br>
Log:<br>
[AArch64] Add new target feature to fuse arithmetic and logic
operations<br>
<br>
This feature enables the fusion of some arithmetic and logic
instructions<br>
together.<br>
<br>
Differential revision: <a moz-do-not-send="true"
href="https://reviews.llvm.org/D56572" rel="noreferrer"
target="_blank">https://reviews.llvm.org/D56572</a><br>
<br>
Added:<br>
llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir<br>
Modified:<br>
llvm/trunk/lib/Target/AArch64/AArch64.td<br>
llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp<br>
llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64.td<br>
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64.td?rev=351139&r1=351138&r2=351139&view=diff"
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64.td?rev=351139&r1=351138&r2=351139&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64.td (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64.td Mon Jan 14
15:54:36 2019<br>
@@ -188,14 +188,18 @@ def FeatureFuseAES :
SubtargetFeature<<br>
"fuse-aes", "HasFuseAES", "true",<br>
"CPU fuses AES crypto operations">;<br>
<br>
-def FeatureFuseCryptoEOR : SubtargetFeature<<br>
- "fuse-crypto-eor", "HasFuseCryptoEOR", "true",<br>
- "CPU fuses AES/PMULL and EOR operations">;<br>
+def FeatureFuseArithmeticLogic : SubtargetFeature<<br>
+ "fuse-arith-logic", "HasFuseArithmeticLogic", "true",<br>
+ "CPU fuses arithmetic and logic operations">;<br>
<br>
def FeatureFuseCCSelect : SubtargetFeature<<br>
"fuse-csel", "HasFuseCCSelect", "true",<br>
"CPU fuses conditional select operations">;<br>
<br>
+def FeatureFuseCryptoEOR : SubtargetFeature<<br>
+ "fuse-crypto-eor", "HasFuseCryptoEOR", "true",<br>
+ "CPU fuses AES/PMULL and EOR operations">;<br>
+<br>
def FeatureFuseLiterals : SubtargetFeature<<br>
"fuse-literals", "HasFuseLiterals", "true",<br>
"CPU fuses literal generation operations">;<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp<br>
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp?rev=351139&r1=351138&r2=351139&view=diff"
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp?rev=351139&r1=351138&r2=351139&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp
(original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64MacroFusion.cpp Mon
Jan 14 15:54:36 2019<br>
@@ -270,7 +270,107 @@ static bool isCCSelectPair(const Machine<br>
return false;<br>
}<br>
<br>
-/// Check if the instr pair, FirstMI and SecondMI, should be
fused<br>
+// Arithmetic and logic.<br>
+static bool isArithmeticLogicPair(const MachineInstr
*FirstMI,<br>
+ const MachineInstr
&SecondMI) {<br>
+ if (AArch64InstrInfo::hasShiftedReg(SecondMI))<br>
+ return false;<br>
+<br>
+ switch (SecondMI.getOpcode()) {<br>
+ // Arithmetic<br>
+ case AArch64::ADDWrr:<br>
+ case AArch64::ADDXrr:<br>
+ case AArch64::SUBWrr:<br>
+ case AArch64::SUBXrr:<br>
+ case AArch64::ADDWrs:<br>
+ case AArch64::ADDXrs:<br>
+ case AArch64::SUBWrs:<br>
+ case AArch64::SUBXrs:<br>
+ // Logic<br>
+ case AArch64::ANDWrr:<br>
+ case AArch64::ANDXrr:<br>
+ case AArch64::BICWrr:<br>
+ case AArch64::BICXrr:<br>
+ case AArch64::EONWrr:<br>
+ case AArch64::EONXrr:<br>
+ case AArch64::EORWrr:<br>
+ case AArch64::EORXrr:<br>
+ case AArch64::ORNWrr:<br>
+ case AArch64::ORNXrr:<br>
+ case AArch64::ORRWrr:<br>
+ case AArch64::ORRXrr:<br>
+ case AArch64::ANDWrs:<br>
+ case AArch64::ANDXrs:<br>
+ case AArch64::BICWrs:<br>
+ case AArch64::BICXrs:<br>
+ case AArch64::EONWrs:<br>
+ case AArch64::EONXrs:<br>
+ case AArch64::EORWrs:<br>
+ case AArch64::EORXrs:<br>
+ case AArch64::ORNWrs:<br>
+ case AArch64::ORNXrs:<br>
+ case AArch64::ORRWrs:<br>
+ case AArch64::ORRXrs:<br>
+ // Assume the 1st instr to be a wildcard if it is
unspecified.<br>
+ if (FirstMI == nullptr)<br>
+ return true;<br>
+<br>
+ // Arithmetic<br>
+ switch (FirstMI->getOpcode()) {<br>
+ case AArch64::ADDWrr:<br>
+ case AArch64::ADDXrr:<br>
+ case AArch64::ADDSWrr:<br>
+ case AArch64::ADDSXrr:<br>
+ case AArch64::SUBWrr:<br>
+ case AArch64::SUBXrr:<br>
+ case AArch64::SUBSWrr:<br>
+ case AArch64::SUBSXrr:<br>
+ return true;<br>
+ case AArch64::ADDWrs:<br>
+ case AArch64::ADDXrs:<br>
+ case AArch64::ADDSWrs:<br>
+ case AArch64::ADDSXrs:<br>
+ case AArch64::SUBWrs:<br>
+ case AArch64::SUBXrs:<br>
+ case AArch64::SUBSWrs:<br>
+ case AArch64::SUBSXrs:<br>
+ return !AArch64InstrInfo::hasShiftedReg(*FirstMI);<br>
+ }<br>
+ break;<br>
+<br>
+ // Arithmetic, setting flags.<br>
+ case AArch64::ADDSWrr:<br>
+ case AArch64::ADDSXrr:<br>
+ case AArch64::SUBSWrr:<br>
+ case AArch64::SUBSXrr:<br>
+ case AArch64::ADDSWrs:<br>
+ case AArch64::ADDSXrs:<br>
+ case AArch64::SUBSWrs:<br>
+ case AArch64::SUBSXrs:<br>
+ // Assume the 1st instr to be a wildcard if it is
unspecified.<br>
+ if (FirstMI == nullptr)<br>
+ return true;<br>
+<br>
+ // Arithmetic, not setting flags.<br>
+ switch (FirstMI->getOpcode()) {<br>
+ case AArch64::ADDWrr:<br>
+ case AArch64::ADDXrr:<br>
+ case AArch64::SUBWrr:<br>
+ case AArch64::SUBXrr:<br>
+ return true;<br>
+ case AArch64::ADDWrs:<br>
+ case AArch64::ADDXrs:<br>
+ case AArch64::SUBWrs:<br>
+ case AArch64::SUBXrs:<br>
+ return !AArch64InstrInfo::hasShiftedReg(*FirstMI);<br>
+ }<br>
+ break;<br>
+ }<br>
+<br>
+ return false;<br>
+}<br>
+<br>
+/// \brief Check if the instr pair, FirstMI and SecondMI,
should be fused<br>
/// together. Given SecondMI, when FirstMI is unspecified,
then check if<br>
/// SecondMI may be part of a fused pair at all.<br>
static bool shouldScheduleAdjacent(const TargetInstrInfo
&TII,<br>
@@ -295,6 +395,8 @@ static bool shouldScheduleAdjacent(const<br>
return true;<br>
if (ST.hasFuseCCSelect() && isCCSelectPair(FirstMI,
SecondMI))<br>
return true;<br>
+ if (ST.hasFuseArithmeticLogic() &&
isArithmeticLogicPair(FirstMI, SecondMI))<br>
+ return true;<br>
<br>
return false;<br>
}<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h<br>
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h?rev=351139&r1=351138&r2=351139&view=diff"
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h?rev=351139&r1=351138&r2=351139&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h
(original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h Mon Jan
14 15:54:36 2019<br>
@@ -166,8 +166,9 @@ protected:<br>
bool HasArithmeticCbzFusion = false;<br>
bool HasFuseAddress = false;<br>
bool HasFuseAES = false;<br>
- bool HasFuseCryptoEOR = false;<br>
+ bool HasFuseArithmeticLogic = false;<br>
bool HasFuseCCSelect = false;<br>
+ bool HasFuseCryptoEOR = false;<br>
bool HasFuseLiterals = false;<br>
bool DisableLatencySchedHeuristic = false;<br>
bool UseRSqrt = false;<br>
@@ -311,14 +312,16 @@ public:<br>
bool hasArithmeticCbzFusion() const { return
HasArithmeticCbzFusion; }<br>
bool hasFuseAddress() const { return HasFuseAddress; }<br>
bool hasFuseAES() const { return HasFuseAES; }<br>
- bool hasFuseCryptoEOR() const { return HasFuseCryptoEOR; }<br>
+ bool hasFuseArithmeticLogic() const { return
HasFuseArithmeticLogic; }<br>
bool hasFuseCCSelect() const { return HasFuseCCSelect; }<br>
+ bool hasFuseCryptoEOR() const { return HasFuseCryptoEOR; }<br>
bool hasFuseLiterals() const { return HasFuseLiterals; }<br>
<br>
/// Return true if the CPU supports any kind of instruction
fusion.<br>
bool hasFusion() const {<br>
return hasArithmeticBccFusion() ||
hasArithmeticCbzFusion() ||<br>
- hasFuseAES() || hasFuseCCSelect() ||
hasFuseLiterals();<br>
+ hasFuseAES() || hasFuseArithmeticLogic() ||<br>
+ hasFuseCCSelect() || hasFuseLiterals();<br>
}<br>
<br>
bool useRSqrt() const { return UseRSqrt; }<br>
<br>
Added:
llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir<br>
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir?rev=351139&view=auto"
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir?rev=351139&view=auto</a><br>
==============================================================================<br>
---
llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir
(added)<br>
+++
llvm/trunk/test/CodeGen/AArch64/misched-fusion-arith-logic.mir
Mon Jan 14 15:54:36 2019<br>
@@ -0,0 +1,111 @@<br>
+# RUN: llc -o - %s -mtriple aarch64-unknown
-mattr=fuse-arith-logic -run-pass=machine-scheduler
-misched-print-dags |& FileCheck %s<br>
+# REQUIRES: asserts<br>
+<br>
+---<br>
+name: arith<br>
+body: |<br>
+ bb.0.entry:<br>
+ %0:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ %1:gpr32 = ADDWrr undef $w1, undef $w2<br>
+ %2:gpr32 = SUBWrs %0, undef $w2, 0<br>
+ %3:gpr32 = ADDWrs %1, undef $w3, 0<br>
+<br>
+ ; CHECK: SU(0): %0:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(2): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(1): %1:gpr32 = ADDWrr undef $w1, undef $w2<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(3): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(2): dead %2:gpr32 = SUBWrs %0:gpr32, undef
$w2, 0<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(0): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(3): dead %3:gpr32 = ADDWrs %1:gpr32, undef
$w3, 0<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(1): Ord Latency=0 Cluster<br>
+...<br>
+---<br>
+name: compare<br>
+body: |<br>
+ bb.0.entry:<br>
+ %0:gpr64 = ADDXrr undef $x0, undef $x1<br>
+ %1:gpr64 = SUBXrs undef $x1, undef $x2, 0<br>
+ %2:gpr64 = ADDSXrr %0, undef $x3, implicit-def $nzcv<br>
+ %3:gpr64 = SUBSXrs %1, undef $x4, 0, implicit-def $nzcv<br>
+<br>
+ ; CHECK: SU(0): %0:gpr64 = ADDXrr undef $x0, undef $x1<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(2): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(1): %1:gpr64 = SUBXrs undef $x1, undef $x2, 0<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(3): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(2): dead %2:gpr64 = ADDSXrr %0:gpr64, undef
$x3, implicit-def $nzcv<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(0): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(3): dead %3:gpr64 = SUBSXrs %1:gpr64, undef
$x4, 0, implicit-def $nzcv<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(1): Ord Latency=0 Cluster<br>
+...<br>
+---<br>
+name: logic<br>
+body: |<br>
+ bb.0.entry:<br>
+ %0:gpr32 = ADDWrr undef $w0, undef $w1<br>
+ %1:gpr64 = SUBXrs undef $x1, undef $x2, 0<br>
+ %3:gpr32 = ANDWrs %0, undef $w3, 0<br>
+ %4:gpr64 = ORRXrr %1, undef $x4<br>
+<br>
+ ; CHECK: SU(0): %0:gpr32 = ADDWrr undef $w0, undef $w1<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(2): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(1): %1:gpr64 = SUBXrs undef $x1, undef $x2, 0<br>
+ ; CHECK: Successors:<br>
+ ; CHECK: SU(3): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(2): dead %2:gpr32 = ANDWrs %0:gpr32, undef
$w3, 0<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(0): Ord Latency=0 Cluster<br>
+ ; CHECK: SU(3): dead %3:gpr64 = ORRXrr %1:gpr64, undef
$x4<br>
+ ; CHECK: Predecessors:<br>
+ ; CHECK: SU(1): Ord Latency=0 Cluster<br>
+...<br>
+---<br>
+name: nope<br>
+body: |<br>
+ bb.0.entry:<br>
+ ; Shifted register.<br>
+ %0:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ %1:gpr32 = SUBWrs %0, undef $w2, 1<br>
+ ; CHECKSU(0)%0:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ ; CHECKSuccessors:<br>
+ ; CHECK-NOTSU(1)Ord Latency=0 Cluster<br>
+ ; CHECKSU(1)dead %1:gpr32 = SUBWrs %0:gpr32, undef $w2, 1<br>
+<br>
+ ; Multiple successors.<br>
+ %2:gpr64 = ADDXrr undef $x0, undef $x1<br>
+ %3:gpr32 = EXTRACT_SUBREG %2, %subreg.sub_32<br>
+ %4:gpr32 = ANDWrs %3, undef $w2, 0<br>
+ %5:gpr64 = ADDSXrr %2, undef $x3, implicit-def $nzcv<br>
+ ; CHECKSU(2)%2:gpr64 = ADDXrr undef $x0, undef $x1<br>
+ ; CHECKSuccessors:<br>
+ ; CHECK-NOTSU(3)Ord Latency=0 Cluster<br>
+ ; CHECKSU(5)Ord Latency=0 Cluster<br>
+ ; CHECKSU(3)%3:gpr32 = EXTRACT_SUBREG %2:gpr64,
%subreg.sub_32<br>
+ ; CHECKSU(5)dead %5:gpr64 = ADDSXrr %2:gpr64, undef $x3,
implicit-def $nzcv<br>
+<br>
+ ; Different register sizes.<br>
+ %6:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ %7:gpr64 = ADDXrr undef $x1, undef $x2<br>
+ %8:gpr64 = SUBXrr %7, undef $x3<br>
+ %9:gpr32 = ADDWrr %6, undef $w4<br>
+ ; CHECKSU(6)%6:gpr32 = SUBWrr undef $w0, undef $w1<br>
+ ; CHECKSuccessors:<br>
+ ; CHECK-NOTSU(8)Ord Latency=0 Cluster<br>
+ ; CHECKSU(7)%7:gpr64 = ADDXrr undef $x1, undef $x2<br>
+ ; CHECKSuccessors:<br>
+ ; CHECK-NOTSU(9)Ord Latency=0 Cluster<br>
+ ; CHECKSU(8)dead %8:gpr64 = SUBXrr %7:gpr64, undef $x3<br>
+ ; CHECKPredecessors:<br>
+ ; CHECKSU(7)Ord Latency=0 Cluster<br>
+ ; CHECKSU(9)dead %9:gpr32 = ADDWrr %6:gpr32, undef $w4<br>
+ ; CHECKPredecessors:<br>
+ ; CHECKSU(6)Ord Latency=0 Cluster<br>
+...<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a moz-do-not-send="true"
href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a moz-do-not-send="true"
href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits"
rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote>
</div>
</blockquote>
<br>
</body>
</html>