diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td index 18d6515f39d4b..68c3a2105373a 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td @@ -35,6 +35,42 @@ def : Pat<(select GPR:$rc, GPR:$rs1, (i64 0)), def : Pat<(select GPR:$rc, (i64 0), GPR:$rs1), (VT_MASKCN $rs1, $rc)>; +def : Pat<(select (i64 (setne GPR:$rc, (i64 0))), GPR:$rs1, (i64 0)), + (VT_MASKC GPR:$rs1, GPR:$rc)>; +def : Pat<(select (i64 (seteq GPR:$rc, (i64 0))), GPR:$rs1, (i64 0)), + (VT_MASKCN GPR:$rs1, GPR:$rc)>; +def : Pat<(select (i64 (setne GPR:$rc, (i64 0))), (i64 0), GPR:$rs1), + (VT_MASKCN GPR:$rs1, GPR:$rc)>; +def : Pat<(select (i64 (seteq GPR:$rc, (i64 0))), (i64 0), GPR:$rs1), + (VT_MASKC GPR:$rs1, GPR:$rc)>; + +def : Pat<(select (i64 (setne GPR:$x, simm12_plus1:$y)), GPR:$rs1, (i64 0)), + (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; +def : Pat<(select (i64 (seteq GPR:$x, simm12_plus1:$y)), GPR:$rs1, (i64 0)), + (VT_MASKCN GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; +def : Pat<(select (i64 (setne GPR:$x, simm12_plus1:$y)), (i64 0), GPR:$rs1), + (VT_MASKCN GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; +def : Pat<(select (i64 (seteq GPR:$x, simm12_plus1:$y)), (i64 0), GPR:$rs1), + (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; + +def : Pat<(select (i64 (setne GPR:$x, (i64 -2048))), GPR:$rs1, (i64 0)), + (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048))>; +def : Pat<(select (i64 (seteq GPR:$x, (i64 -2048))), GPR:$rs1, (i64 0)), + (VT_MASKCN GPR:$rs1, (XORI GPR:$x, -2048))>; +def : Pat<(select (i64 (setne GPR:$x, (i64 -2048))), (i64 0), GPR:$rs1), + (VT_MASKCN GPR:$rs1, (XORI GPR:$x, -2048))>; +def : Pat<(select (i64 (seteq GPR:$x, (i64 -2048))), (i64 0), GPR:$rs1), + (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048))>; + +def : Pat<(select (i64 (setne GPR:$x, GPR:$y)), GPR:$rs1, (i64 0)), + (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y))>; +def : Pat<(select (i64 (seteq GPR:$x, GPR:$y)), GPR:$rs1, (i64 0)), + (VT_MASKCN GPR:$rs1, (XOR GPR:$x, GPR:$y))>; +def : Pat<(select (i64 (setne GPR:$x, GPR:$y)), (i64 0), GPR:$rs1), + (VT_MASKCN GPR:$rs1, (XOR GPR:$x, GPR:$y))>; +def : Pat<(select (i64 (seteq GPR:$x, GPR:$y)), (i64 0), GPR:$rs1), + (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y))>; + // Conditional AND operation patterns. def : Pat<(i64 (select GPR:$rc, (and GPR:$rs1, GPR:$rs2), GPR:$rs1)), (OR (AND $rs1, $rs2), (VT_MASKCN $rs1, $rc))>; @@ -44,4 +80,31 @@ def : Pat<(i64 (select GPR:$rc, GPR:$rs1, (and GPR:$rs1, GPR:$rs2))), // Basic select pattern that selects between 2 registers. def : Pat<(i64 (select GPR:$rc, GPR:$rs1, GPR:$rs2)), (OR (VT_MASKC $rs1, $rc), (VT_MASKCN $rs2, $rc))>; + +def : Pat<(i64 (select (i64 (setne GPR:$rc, (i64 0))), GPR:$rs1, GPR:$rs2)), + (OR (VT_MASKC GPR:$rs1, GPR:$rc), (VT_MASKCN GPR:$rs2, GPR:$rc))>; +def : Pat<(i64 (select (i64 (seteq GPR:$rc, (i64 0))), GPR:$rs2, GPR:$rs1)), + (OR (VT_MASKC GPR:$rs1, GPR:$rc), (VT_MASKCN GPR:$rs2, GPR:$rc))>; + +def : Pat<(i64 (select (i64 (setne GPR:$x, simm12_plus1:$y)), GPR:$rs1, GPR:$rs2)), + (OR (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y))), + (VT_MASKCN GPR:$rs2, (ADDI GPR:$x, (NegImm simm12_plus1:$y))))>; +def : Pat<(i64 (select (i64 (seteq GPR:$x, simm12_plus1:$y)), GPR:$rs2, GPR:$rs1)), + (OR (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y))), + (VT_MASKCN GPR:$rs2, (ADDI GPR:$x, (NegImm simm12_plus1:$y))))>; + +def : Pat<(i64 (select (i64 (setne GPR:$x, (i64 -2048))), GPR:$rs1, GPR:$rs2)), + (OR (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048)), + (VT_MASKCN GPR:$rs2, (XORI GPR:$x, -2048)))>; +def : Pat<(i64 (select (i64 (seteq GPR:$x, (i64 -2048))), GPR:$rs2, GPR:$rs1)), + (OR (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048)), + (VT_MASKCN GPR:$rs2, (XORI GPR:$x, -2048)))>; + +def : Pat<(i64 (select (i64 (setne GPR:$x, GPR:$y)), GPR:$rs1, GPR:$rs2)), + (OR (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y)), + (VT_MASKCN GPR:$rs2, (XOR GPR:$x, GPR:$y)))>; +def : Pat<(i64 (select (i64 (seteq GPR:$x, GPR:$y)), GPR:$rs2, GPR:$rs1)), + (OR (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y)), + (VT_MASKCN GPR:$rs2, (XOR GPR:$x, GPR:$y)))>; + } // Predicates = [IsRV64, HasVendorXVentanaCondOps] diff --git a/llvm/test/CodeGen/RISCV/select.ll b/llvm/test/CodeGen/RISCV/select.ll index 2e9c4e7df1d08..acc441af049e4 100644 --- a/llvm/test/CodeGen/RISCV/select.ll +++ b/llvm/test/CodeGen/RISCV/select.ll @@ -138,9 +138,8 @@ define i16 @select_xor_3(i16 %A, i8 %cond) { ; CONDOPS-LABEL: select_xor_3: ; CONDOPS: # %bb.0: # %entry ; CONDOPS-NEXT: andi a1, a1, 1 -; CONDOPS-NEXT: seqz a1, a1 ; CONDOPS-NEXT: li a2, 43 -; CONDOPS-NEXT: vt.maskc a1, a2, a1 +; CONDOPS-NEXT: vt.maskcn a1, a2, a1 ; CONDOPS-NEXT: xor a0, a0, a1 ; CONDOPS-NEXT: ret entry: @@ -205,8 +204,7 @@ define i32 @select_xor_4(i32 %A, i32 %B, i8 %cond) { ; CONDOPS-LABEL: select_xor_4: ; CONDOPS: # %bb.0: # %entry ; CONDOPS-NEXT: andi a2, a2, 1 -; CONDOPS-NEXT: seqz a2, a2 -; CONDOPS-NEXT: vt.maskc a1, a1, a2 +; CONDOPS-NEXT: vt.maskcn a1, a1, a2 ; CONDOPS-NEXT: xor a0, a0, a1 ; CONDOPS-NEXT: ret entry: @@ -384,8 +382,7 @@ define i32 @select_or_2(i32 %A, i32 %B, i8 %cond) { ; CONDOPS-LABEL: select_or_2: ; CONDOPS: # %bb.0: # %entry ; CONDOPS-NEXT: andi a2, a2, 1 -; CONDOPS-NEXT: seqz a2, a2 -; CONDOPS-NEXT: vt.maskc a1, a1, a2 +; CONDOPS-NEXT: vt.maskcn a1, a1, a2 ; CONDOPS-NEXT: or a0, a0, a1 ; CONDOPS-NEXT: ret entry: @@ -449,8 +446,7 @@ define i32 @select_or_3(i32 %A, i32 %B, i32 %cond) { ; CONDOPS-LABEL: select_or_3: ; CONDOPS: # %bb.0: # %entry ; CONDOPS-NEXT: andi a2, a2, 1 -; CONDOPS-NEXT: seqz a2, a2 -; CONDOPS-NEXT: vt.maskc a1, a1, a2 +; CONDOPS-NEXT: vt.maskcn a1, a1, a2 ; CONDOPS-NEXT: or a0, a0, a1 ; CONDOPS-NEXT: ret entry: diff --git a/llvm/test/CodeGen/RISCV/xventanacondops.ll b/llvm/test/CodeGen/RISCV/xventanacondops.ll index 046d56e021b77..c00a7d2e9b7ca 100644 --- a/llvm/test/CodeGen/RISCV/xventanacondops.ll +++ b/llvm/test/CodeGen/RISCV/xventanacondops.ll @@ -236,9 +236,8 @@ define i64 @seteq(i64 %a, i64 %b, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: seteq: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a1, a3, a0 -; CHECK-NEXT: vt.maskc a0, a2, a0 +; CHECK-NEXT: vt.maskcn a1, a2, a0 +; CHECK-NEXT: vt.maskc a0, a3, a0 ; CHECK-NEXT: or a0, a0, a1 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, %b @@ -250,7 +249,6 @@ define i64 @setne(i64 %a, i64 %b, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: setne: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a1, a3, a0 ; CHECK-NEXT: vt.maskc a0, a2, a0 ; CHECK-NEXT: or a0, a0, a1 @@ -367,10 +365,9 @@ define i64 @setule(i64 %a, i64 %b, i64 %rs1, i64 %rs2) { define i64 @seteq_zero(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: seteq_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a2, a2, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 -; CHECK-NEXT: or a0, a0, a2 +; CHECK-NEXT: vt.maskcn a1, a1, a0 +; CHECK-NEXT: vt.maskc a0, a2, a0 +; CHECK-NEXT: or a0, a0, a1 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, 0 %sel = select i1 %rc, i64 %rs1, i64 %rs2 @@ -380,7 +377,6 @@ define i64 @seteq_zero(i64 %a, i64 %rs1, i64 %rs2) { define i64 @setne_zero(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: setne_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a2, a2, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: or a0, a0, a2 @@ -394,10 +390,9 @@ define i64 @seteq_constant(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: seteq_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -123 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a2, a2, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 -; CHECK-NEXT: or a0, a0, a2 +; CHECK-NEXT: vt.maskcn a1, a1, a0 +; CHECK-NEXT: vt.maskc a0, a2, a0 +; CHECK-NEXT: or a0, a0, a1 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, 123 %sel = select i1 %rc, i64 %rs1, i64 %rs2 @@ -408,7 +403,6 @@ define i64 @setne_constant(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: setne_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -456 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a2, a2, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: or a0, a0, a2 @@ -422,10 +416,9 @@ define i64 @seteq_neg2048(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: seteq_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a2, a2, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 -; CHECK-NEXT: or a0, a0, a2 +; CHECK-NEXT: vt.maskcn a1, a1, a0 +; CHECK-NEXT: vt.maskc a0, a2, a0 +; CHECK-NEXT: or a0, a0, a1 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, -2048 %sel = select i1 %rc, i64 %rs1, i64 %rs2 @@ -436,7 +429,6 @@ define i64 @setne_neg2048(i64 %a, i64 %rs1, i64 %rs2) { ; CHECK-LABEL: setne_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a2, a2, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: or a0, a0, a2 @@ -450,8 +442,7 @@ define i64 @zero1_seteq(i64 %a, i64 %b, i64 %rs1) { ; CHECK-LABEL: zero1_seteq: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskc a0, a2, a0 +; CHECK-NEXT: vt.maskcn a0, a2, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, %b %sel = select i1 %rc, i64 %rs1, i64 0 @@ -462,8 +453,7 @@ define i64 @zero2_seteq(i64 %a, i64 %b, i64 %rs1) { ; CHECK-LABEL: zero2_seteq: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a0, a2, a0 +; CHECK-NEXT: vt.maskc a0, a2, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, %b %sel = select i1 %rc, i64 0, i64 %rs1 @@ -474,7 +464,6 @@ define i64 @zero1_setne(i64 %a, i64 %b, i64 %rs1) { ; CHECK-LABEL: zero1_setne: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskc a0, a2, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, %b @@ -486,7 +475,6 @@ define i64 @zero2_setne(i64 %a, i64 %b, i64 %rs1) { ; CHECK-LABEL: zero2_setne: ; CHECK: # %bb.0: ; CHECK-NEXT: xor a0, a0, a1 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a0, a2, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, %b @@ -497,8 +485,7 @@ define i64 @zero2_setne(i64 %a, i64 %b, i64 %rs1) { define i64 @zero1_seteq_zero(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_seteq_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 +; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, 0 %sel = select i1 %rc, i64 %rs1, i64 0 @@ -508,8 +495,7 @@ define i64 @zero1_seteq_zero(i64 %a, i64 %rs1) { define i64 @zero2_seteq_zero(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_seteq_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a0, a1, a0 +; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, 0 %sel = select i1 %rc, i64 0, i64 %rs1 @@ -519,7 +505,6 @@ define i64 @zero2_seteq_zero(i64 %a, i64 %rs1) { define i64 @zero1_setne_zero(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_setne_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, 0 @@ -530,7 +515,6 @@ define i64 @zero1_setne_zero(i64 %a, i64 %rs1) { define i64 @zero2_setne_zero(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_setne_zero: ; CHECK: # %bb.0: -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, 0 @@ -542,8 +526,7 @@ define i64 @zero1_seteq_constant(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_seteq_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, 231 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 +; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, -231 %sel = select i1 %rc, i64 %rs1, i64 0 @@ -554,8 +537,7 @@ define i64 @zero2_seteq_constant(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_seteq_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -546 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a0, a1, a0 +; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, 546 %sel = select i1 %rc, i64 0, i64 %rs1 @@ -566,7 +548,6 @@ define i64 @zero1_setne_constant(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_setne_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -321 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, 321 @@ -578,7 +559,6 @@ define i64 @zero2_setne_constant(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_setne_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, 654 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, -654 @@ -590,8 +570,7 @@ define i64 @zero1_seteq_neg2048(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_seteq_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskc a0, a1, a0 +; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, -2048 %sel = select i1 %rc, i64 %rs1, i64 0 @@ -602,8 +581,7 @@ define i64 @zero2_seteq_neg2048(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_seteq_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: seqz a0, a0 -; CHECK-NEXT: vt.maskcn a0, a1, a0 +; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp eq i64 %a, -2048 %sel = select i1 %rc, i64 0, i64 %rs1 @@ -614,7 +592,6 @@ define i64 @zero1_setne_neg2048(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero1_setne_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskc a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, -2048 @@ -626,7 +603,6 @@ define i64 @zero2_setne_neg2048(i64 %a, i64 %rs1) { ; CHECK-LABEL: zero2_setne_neg2048: ; CHECK: # %bb.0: ; CHECK-NEXT: xori a0, a0, -2048 -; CHECK-NEXT: snez a0, a0 ; CHECK-NEXT: vt.maskcn a0, a1, a0 ; CHECK-NEXT: ret %rc = icmp ne i64 %a, -2048