From f46fe36d59f6592162f88af08bf04c6998afd636 Mon Sep 17 00:00:00 2001 From: Paul Walker Date: Thu, 17 Mar 2022 21:55:55 +0000 Subject: [PATCH] [AArch64] Fix incorrect getSetCCInverse usage within trySwapVSelectOperands. When inverting the compare predicate trySwapVSelectOperands is incorrectly using the type of the select's cond operand rather than the type of cond's operands. This means we're treating all inversions as if they're integer. Differential Revision: https://reviews.llvm.org/D121968 --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 10 ++++++---- llvm/test/CodeGen/AArch64/sve-select.ll | 12 +++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index c30a5ea..9e49ccb 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -17623,10 +17623,12 @@ static SDValue trySwapVSelectOperands(SDNode *N, SelectionDAG &DAG) { if (SelectA != SelectB.getOperand(0)) return SDValue(); - ISD::CondCode CC = cast(SetCC->getOperand(2))->get(); - auto InverseSetCC = DAG.getSetCC( - SDLoc(SetCC), SetCC.getValueType(), SetCC.getOperand(0), - SetCC.getOperand(1), ISD::getSetCCInverse(CC, SetCC.getValueType())); + ISD::CondCode CC = cast(SetCC.getOperand(2))->get(); + ISD::CondCode InverseCC = + ISD::getSetCCInverse(CC, SetCC.getOperand(0).getValueType()); + auto InverseSetCC = + DAG.getSetCC(SDLoc(SetCC), SetCC.getValueType(), SetCC.getOperand(0), + SetCC.getOperand(1), InverseCC); return DAG.getNode(ISD::VSELECT, SDLoc(N), NTy, {InverseSetCC, SelectB, SelectA}); diff --git a/llvm/test/CodeGen/AArch64/sve-select.ll b/llvm/test/CodeGen/AArch64/sve-select.ll index 3183e1e..4e4c659 100644 --- a/llvm/test/CodeGen/AArch64/sve-select.ll +++ b/llvm/test/CodeGen/AArch64/sve-select.ll @@ -547,7 +547,8 @@ define @select_f32_invert_fmul( %a, %a, zeroinitializer @@ -560,7 +561,8 @@ define @select_f32_invert_fadd( %a, %a, zeroinitializer @@ -569,14 +571,14 @@ define @select_f32_invert_fadd( %a, %sel } -define @select_f32_invert_fsub( %a, %b) { +define @select_f32_invert_fsub( %a, %b, %c) { ; CHECK-LABEL: select_f32_invert_fsub: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 +; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0 ; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret - %p = fcmp oeq %a, zeroinitializer + %p = icmp eq %c, zeroinitializer %fsub = fsub %a, %b %sel = select %p, %a, %fsub ret %sel -- 2.7.4