[PATCH] D82602: [SelectionDAG] don't split branch on logic-of-vector-compares
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 30 11:59:56 PDT 2020
spatel updated this revision to Diff 274565.
spatel added a comment.
Patch updated:
Rebased after rGe9c6b63d4a16c795 <https://reviews.llvm.org/rGe9c6b63d4a16c7955bf0e7d5c1ab4adbb9d385cc> - this patch doesn't affect any SystemZ tests now (thanks!).
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D82602/new/
https://reviews.llvm.org/D82602
Files:
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/test/CodeGen/AArch64/vec-extract-branch.ll
llvm/test/CodeGen/X86/setcc-logic.ll
Index: llvm/test/CodeGen/X86/setcc-logic.ll
===================================================================
--- llvm/test/CodeGen/X86/setcc-logic.ll
+++ llvm/test/CodeGen/X86/setcc-logic.ll
@@ -323,15 +323,12 @@
; CHECK-NEXT: xorpd %xmm1, %xmm1
; CHECK-NEXT: cmpltpd %xmm0, %xmm1
; CHECK-NEXT: movmskpd %xmm1, %eax
-; CHECK-NEXT: testb $1, %al
-; CHECK-NEXT: je .LBB16_3
-; CHECK-NEXT: # %bb.1:
-; CHECK-NEXT: shrb %al
-; CHECK-NEXT: je .LBB16_3
-; CHECK-NEXT: # %bb.2: # %true
+; CHECK-NEXT: cmpb $3, %al
+; CHECK-NEXT: jne .LBB16_2
+; CHECK-NEXT: # %bb.1: # %true
; CHECK-NEXT: movl $42, %eax
; CHECK-NEXT: retq
-; CHECK-NEXT: .LBB16_3: # %false
+; CHECK-NEXT: .LBB16_2: # %false
; CHECK-NEXT: movl $88, %eax
; CHECK-NEXT: retq
%t1 = fcmp ogt <2 x double> %x, zeroinitializer
Index: llvm/test/CodeGen/AArch64/vec-extract-branch.ll
===================================================================
--- llvm/test/CodeGen/AArch64/vec-extract-branch.ll
+++ llvm/test/CodeGen/AArch64/vec-extract-branch.ll
@@ -6,16 +6,15 @@
; CHECK: // %bb.0:
; CHECK-NEXT: fcmgt v0.2d, v0.2d, #0.0
; CHECK-NEXT: xtn v0.2s, v0.2d
-; CHECK-NEXT: fmov w8, s0
-; CHECK-NEXT: tbz w8, #0, .LBB0_3
-; CHECK-NEXT: // %bb.1:
; CHECK-NEXT: mov w8, v0.s[1]
-; CHECK-NEXT: tbz w8, #0, .LBB0_3
-; CHECK-NEXT: // %bb.2: // %true
+; CHECK-NEXT: fmov w9, s0
+; CHECK-NEXT: and w8, w9, w8
+; CHECK-NEXT: tbz w8, #0, .LBB0_2
+; CHECK-NEXT: // %bb.1: // %true
; CHECK-NEXT: mov w8, #42
; CHECK-NEXT: sdiv w0, w8, w0
; CHECK-NEXT: ret
-; CHECK-NEXT: .LBB0_3: // %false
+; CHECK-NEXT: .LBB0_2: // %false
; CHECK-NEXT: mov w0, #88
; CHECK-NEXT: ret
%t1 = fcmp ogt <2 x double> %x, zeroinitializer
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -2296,7 +2296,9 @@
// If this is a series of conditions that are or'd or and'd together, emit
// this as a sequence of branches instead of setcc's with and/or operations.
- // As long as jumps are not expensive, this should improve performance.
+ // As long as jumps are not expensive (exceptions for multi-use logic ops,
+ // unpredictable branches, and vector extracts because those jumps are likely
+ // expensive for any target), this should improve performance.
// For example, instead of something like:
// cmp A, B
// C = seteq
@@ -2311,9 +2313,12 @@
// jle foo
if (const BinaryOperator *BOp = dyn_cast<BinaryOperator>(CondVal)) {
Instruction::BinaryOps Opcode = BOp->getOpcode();
+ Value *Vec, *BOp0 = BOp->getOperand(0), *BOp1 = BOp->getOperand(1);
if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp->hasOneUse() &&
!I.hasMetadata(LLVMContext::MD_unpredictable) &&
- (Opcode == Instruction::And || Opcode == Instruction::Or)) {
+ (Opcode == Instruction::And || Opcode == Instruction::Or) &&
+ !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
+ match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value())))) {
FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB,
Opcode,
getEdgeProbability(BrMBB, Succ0MBB),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82602.274565.patch
Type: text/x-patch
Size: 3413 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200630/1e16a610/attachment.bin>
More information about the llvm-commits
mailing list