Skip to content

Commit d0bafb5

Browse files
committed
[RISCV] Add coverage for zext.w/h interaction with shift transforms
Two cases where folding the and (which could be a zext.w) through shifts in generic DAG result in net worse code quality. And one negative case where keeping a zext.h would result in a longer critical path.
1 parent 41f0574 commit d0bafb5

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,3 +2853,66 @@ entry:
28532853
ret i64 %6
28542854
}
28552855

2856+
define ptr @gep_lshr_i32(ptr %0, i64 %1) {
2857+
; RV64I-LABEL: gep_lshr_i32:
2858+
; RV64I: # %bb.0: # %entry
2859+
; RV64I-NEXT: srli a1, a1, 2
2860+
; RV64I-NEXT: li a2, 5
2861+
; RV64I-NEXT: slli a2, a2, 36
2862+
; RV64I-NEXT: slli a1, a1, 32
2863+
; RV64I-NEXT: mulhu a1, a1, a2
2864+
; RV64I-NEXT: add a0, a0, a1
2865+
; RV64I-NEXT: ret
2866+
;
2867+
; RV64ZBA-LABEL: gep_lshr_i32:
2868+
; RV64ZBA: # %bb.0: # %entry
2869+
; RV64ZBA-NEXT: slli a1, a1, 2
2870+
; RV64ZBA-NEXT: srli a1, a1, 4
2871+
; RV64ZBA-NEXT: slli.uw a1, a1, 4
2872+
; RV64ZBA-NEXT: sh2add a1, a1, a1
2873+
; RV64ZBA-NEXT: add a0, a0, a1
2874+
; RV64ZBA-NEXT: ret
2875+
entry:
2876+
%2 = lshr exact i64 %1, 2
2877+
%3 = and i64 %2, 4294967295
2878+
%5 = getelementptr [80 x i8], ptr %0, i64 %3
2879+
ret ptr %5
2880+
}
2881+
2882+
define i64 @srli_slliw(i64 %1) {
2883+
; RV64I-LABEL: srli_slliw:
2884+
; RV64I: # %bb.0: # %entry
2885+
; RV64I-NEXT: slli a0, a0, 2
2886+
; RV64I-NEXT: li a1, 1
2887+
; RV64I-NEXT: slli a1, a1, 36
2888+
; RV64I-NEXT: addi a1, a1, -16
2889+
; RV64I-NEXT: and a0, a0, a1
2890+
; RV64I-NEXT: ret
2891+
;
2892+
; RV64ZBA-LABEL: srli_slliw:
2893+
; RV64ZBA: # %bb.0: # %entry
2894+
; RV64ZBA-NEXT: slli a0, a0, 2
2895+
; RV64ZBA-NEXT: srli a0, a0, 4
2896+
; RV64ZBA-NEXT: slli.uw a0, a0, 4
2897+
; RV64ZBA-NEXT: ret
2898+
entry:
2899+
%2 = lshr exact i64 %1, 2
2900+
%3 = and i64 %2, 4294967295
2901+
%4 = shl i64 %3, 4
2902+
ret i64 %4
2903+
}
2904+
2905+
define i64 @srli_slli_i16(i64 %1) {
2906+
; CHECK-LABEL: srli_slli_i16:
2907+
; CHECK: # %bb.0: # %entry
2908+
; CHECK-NEXT: slli a0, a0, 2
2909+
; CHECK-NEXT: lui a1, 256
2910+
; CHECK-NEXT: addiw a1, a1, -16
2911+
; CHECK-NEXT: and a0, a0, a1
2912+
; CHECK-NEXT: ret
2913+
entry:
2914+
%2 = lshr exact i64 %1, 2
2915+
%3 = and i64 %2, 65535
2916+
%4 = shl i64 %3, 4
2917+
ret i64 %4
2918+
}

0 commit comments

Comments
 (0)