Skip to content

Commit 33c7e19

Browse files
committed
[RISCV] Prioritize zext.h/zext.w over XTheadBb th.extu.
Fixes #154125.
1 parent 8c6469e commit 33c7e19

File tree

3 files changed

+50
-22
lines changed

3 files changed

+50
-22
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1691,7 +1691,9 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
16911691
// available.
16921692
// Transform (and x, C1)
16931693
// -> (<bfextract> x, msb, lsb)
1694-
if (isMask_64(C1) && !isInt<12>(N1C->getSExtValue())) {
1694+
if (isMask_64(C1) && !isInt<12>(N1C->getSExtValue()) &&
1695+
!(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1696+
!(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
16951697
const unsigned Msb = llvm::bit_width(C1) - 1;
16961698
if (tryUnsignedBitfieldExtract(Node, DL, VT, N0, Msb, 0))
16971699
return;

llvm/test/CodeGen/RISCV/rv32xtheadbb.ll

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -537,10 +537,15 @@ define i32 @zexth_i32(i32 %a) nounwind {
537537
; RV32I-NEXT: srli a0, a0, 16
538538
; RV32I-NEXT: ret
539539
;
540-
; RV32XTHEADBB-LABEL: zexth_i32:
541-
; RV32XTHEADBB: # %bb.0:
542-
; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0
543-
; RV32XTHEADBB-NEXT: ret
540+
; RV32XTHEADBB-NOB-LABEL: zexth_i32:
541+
; RV32XTHEADBB-NOB: # %bb.0:
542+
; RV32XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
543+
; RV32XTHEADBB-NOB-NEXT: ret
544+
;
545+
; RV32XTHEADBB-B-LABEL: zexth_i32:
546+
; RV32XTHEADBB-B: # %bb.0:
547+
; RV32XTHEADBB-B-NEXT: zext.h a0, a0
548+
; RV32XTHEADBB-B-NEXT: ret
544549
%and = and i32 %a, 65535
545550
ret i32 %and
546551
}
@@ -553,11 +558,17 @@ define i64 @zexth_i64(i64 %a) nounwind {
553558
; RV32I-NEXT: li a1, 0
554559
; RV32I-NEXT: ret
555560
;
556-
; RV32XTHEADBB-LABEL: zexth_i64:
557-
; RV32XTHEADBB: # %bb.0:
558-
; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0
559-
; RV32XTHEADBB-NEXT: li a1, 0
560-
; RV32XTHEADBB-NEXT: ret
561+
; RV32XTHEADBB-NOB-LABEL: zexth_i64:
562+
; RV32XTHEADBB-NOB: # %bb.0:
563+
; RV32XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
564+
; RV32XTHEADBB-NOB-NEXT: li a1, 0
565+
; RV32XTHEADBB-NOB-NEXT: ret
566+
;
567+
; RV32XTHEADBB-B-LABEL: zexth_i64:
568+
; RV32XTHEADBB-B: # %bb.0:
569+
; RV32XTHEADBB-B-NEXT: zext.h a0, a0
570+
; RV32XTHEADBB-B-NEXT: li a1, 0
571+
; RV32XTHEADBB-B-NEXT: ret
561572
%and = and i64 %a, 65535
562573
ret i64 %and
563574
}

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -905,10 +905,15 @@ define i32 @zexth_i32(i32 %a) nounwind {
905905
; RV64I-NEXT: srli a0, a0, 48
906906
; RV64I-NEXT: ret
907907
;
908-
; RV64XTHEADBB-LABEL: zexth_i32:
909-
; RV64XTHEADBB: # %bb.0:
910-
; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 0
911-
; RV64XTHEADBB-NEXT: ret
908+
; RV64XTHEADBB-NOB-LABEL: zexth_i32:
909+
; RV64XTHEADBB-NOB: # %bb.0:
910+
; RV64XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
911+
; RV64XTHEADBB-NOB-NEXT: ret
912+
;
913+
; RV64XTHEADBB-B-LABEL: zexth_i32:
914+
; RV64XTHEADBB-B: # %bb.0:
915+
; RV64XTHEADBB-B-NEXT: zext.h a0, a0
916+
; RV64XTHEADBB-B-NEXT: ret
912917
%and = and i32 %a, 65535
913918
ret i32 %and
914919
}
@@ -920,10 +925,15 @@ define i64 @zexth_i64(i64 %a) nounwind {
920925
; RV64I-NEXT: srli a0, a0, 48
921926
; RV64I-NEXT: ret
922927
;
923-
; RV64XTHEADBB-LABEL: zexth_i64:
924-
; RV64XTHEADBB: # %bb.0:
925-
; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 0
926-
; RV64XTHEADBB-NEXT: ret
928+
; RV64XTHEADBB-NOB-LABEL: zexth_i64:
929+
; RV64XTHEADBB-NOB: # %bb.0:
930+
; RV64XTHEADBB-NOB-NEXT: th.extu a0, a0, 15, 0
931+
; RV64XTHEADBB-NOB-NEXT: ret
932+
;
933+
; RV64XTHEADBB-B-LABEL: zexth_i64:
934+
; RV64XTHEADBB-B: # %bb.0:
935+
; RV64XTHEADBB-B-NEXT: zext.h a0, a0
936+
; RV64XTHEADBB-B-NEXT: ret
927937
%and = and i64 %a, 65535
928938
ret i64 %and
929939
}
@@ -935,10 +945,15 @@ define i64 @zextw_i64(i64 %a) nounwind {
935945
; RV64I-NEXT: srli a0, a0, 32
936946
; RV64I-NEXT: ret
937947
;
938-
; RV64XTHEADBB-LABEL: zextw_i64:
939-
; RV64XTHEADBB: # %bb.0:
940-
; RV64XTHEADBB-NEXT: th.extu a0, a0, 31, 0
941-
; RV64XTHEADBB-NEXT: ret
948+
; RV64XTHEADBB-NOB-LABEL: zextw_i64:
949+
; RV64XTHEADBB-NOB: # %bb.0:
950+
; RV64XTHEADBB-NOB-NEXT: th.extu a0, a0, 31, 0
951+
; RV64XTHEADBB-NOB-NEXT: ret
952+
;
953+
; RV64XTHEADBB-B-LABEL: zextw_i64:
954+
; RV64XTHEADBB-B: # %bb.0:
955+
; RV64XTHEADBB-B-NEXT: zext.w a0, a0
956+
; RV64XTHEADBB-B-NEXT: ret
942957
%and = and i64 %a, 4294967295
943958
ret i64 %and
944959
}

0 commit comments

Comments
 (0)