Skip to content

Commit ffa03c3

Browse files
committed
[RISCV] Allow tail memcmp expansion
This optimization was introduced by llvm#70469. Like AArch64, we allow tail expansions for 3 on RV32 and 3/5/6 on RV64. This can simplify the comparison and reduce the number of blocks.
1 parent a3744f0 commit ffa03c3

File tree

3 files changed

+201
-274
lines changed

3 files changed

+201
-274
lines changed

llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2565,9 +2565,12 @@ RISCVTTIImpl::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
25652565
Options.AllowOverlappingLoads = true;
25662566
Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
25672567
Options.NumLoadsPerBlock = Options.MaxNumLoads;
2568-
if (ST->is64Bit())
2568+
if (ST->is64Bit()) {
25692569
Options.LoadSizes = {8, 4, 2, 1};
2570-
else
2570+
Options.AllowedTailExpansions = {3, 5, 6};
2571+
} else {
25712572
Options.LoadSizes = {4, 2, 1};
2573+
Options.AllowedTailExpansions = {3};
2574+
}
25722575
return Options;
25732576
}

llvm/test/CodeGen/RISCV/memcmp-optsize.ll

Lines changed: 98 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -2449,82 +2449,72 @@ define i32 @memcmp_size_3(ptr %s1, ptr %s2) nounwind optsize {
24492449
;
24502450
; CHECK-UNALIGNED-RV32-ZBB-LABEL: memcmp_size_3:
24512451
; CHECK-UNALIGNED-RV32-ZBB: # %bb.0: # %entry
2452-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lh a2, 0(a0)
2453-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lh a3, 0(a1)
2454-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: rev8 a2, a2
2455-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: rev8 a3, a3
2456-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: srli a2, a2, 16
2457-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: srli a3, a3, 16
2458-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: bne a2, a3, .LBB24_2
2459-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: # %bb.1: # %loadbb1
2460-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lbu a0, 2(a0)
2461-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lbu a1, 2(a1)
2462-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: sub a0, a0, a1
2463-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: ret
2464-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: .LBB24_2: # %res_block
2465-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: sltu a0, a2, a3
2466-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: neg a0, a0
2467-
; CHECK-UNALIGNED-RV32-ZBB-NEXT: ori a0, a0, 1
2452+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lbu a2, 2(a0)
2453+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lhu a0, 0(a0)
2454+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lbu a3, 2(a1)
2455+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: lhu a1, 0(a1)
2456+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: slli a2, a2, 16
2457+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: or a0, a0, a2
2458+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: slli a3, a3, 16
2459+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: or a1, a1, a3
2460+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: rev8 a0, a0
2461+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: rev8 a1, a1
2462+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: sltu a2, a1, a0
2463+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: sltu a0, a0, a1
2464+
; CHECK-UNALIGNED-RV32-ZBB-NEXT: sub a0, a2, a0
24682465
; CHECK-UNALIGNED-RV32-ZBB-NEXT: ret
24692466
;
24702467
; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_3:
24712468
; CHECK-UNALIGNED-RV64-ZBB: # %bb.0: # %entry
2472-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lh a2, 0(a0)
2473-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lh a3, 0(a1)
2474-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a2, a2
2475-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a3, a3
2476-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a2, a2, 48
2477-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a3, a3, 48
2478-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: bne a2, a3, .LBB24_2
2479-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: # %bb.1: # %loadbb1
2480-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a0, 2(a0)
2481-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a1, 2(a1)
2482-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sub a0, a0, a1
2483-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
2484-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: .LBB24_2: # %res_block
2485-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a2, a3
2486-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: neg a0, a0
2487-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ori a0, a0, 1
2469+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a2, 2(a0)
2470+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lhu a0, 0(a0)
2471+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a3, 2(a1)
2472+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lhu a1, 0(a1)
2473+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a2, a2, 16
2474+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a0, a0, a2
2475+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a3, a3, 16
2476+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a1, a1, a3
2477+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a0, a0
2478+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a1, a1
2479+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a0, a0, 32
2480+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a1, a1, 32
2481+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a2, a1, a0
2482+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a0, a1
2483+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sub a0, a2, a0
24882484
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
24892485
;
24902486
; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_3:
24912487
; CHECK-UNALIGNED-RV32-ZBKB: # %bb.0: # %entry
2492-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lh a2, 0(a0)
2493-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lh a3, 0(a1)
2494-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: rev8 a2, a2
2495-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: rev8 a3, a3
2496-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: srli a2, a2, 16
2497-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: srli a3, a3, 16
2498-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: bne a2, a3, .LBB24_2
2499-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: # %bb.1: # %loadbb1
2488+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lhu a2, 0(a0)
25002489
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lbu a0, 2(a0)
2490+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lhu a3, 0(a1)
25012491
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: lbu a1, 2(a1)
2502-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: sub a0, a0, a1
2503-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: ret
2504-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: .LBB24_2: # %res_block
2505-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: sltu a0, a2, a3
2506-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: neg a0, a0
2507-
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: ori a0, a0, 1
2492+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: pack a0, a2, a0
2493+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: pack a1, a3, a1
2494+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: rev8 a0, a0
2495+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: rev8 a1, a1
2496+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: sltu a2, a1, a0
2497+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: sltu a0, a0, a1
2498+
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: sub a0, a2, a0
25082499
; CHECK-UNALIGNED-RV32-ZBKB-NEXT: ret
25092500
;
25102501
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_3:
25112502
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
2512-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lh a2, 0(a0)
2513-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lh a3, 0(a1)
2514-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a2, a2
2515-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a3, a3
2516-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a2, a2, 48
2517-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a3, a3, 48
2518-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: bne a2, a3, .LBB24_2
2519-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: # %bb.1: # %loadbb1
2520-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 2(a0)
2521-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 2(a1)
2522-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sub a0, a0, a1
2523-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
2524-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: .LBB24_2: # %res_block
2525-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a2, a3
2526-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: neg a0, a0
2527-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ori a0, a0, 1
2503+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a2, 2(a0)
2504+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 0(a0)
2505+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a3, 2(a1)
2506+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 0(a1)
2507+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: slli a2, a2, 16
2508+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: or a0, a0, a2
2509+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: slli a3, a3, 16
2510+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: or a1, a1, a3
2511+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a0, a0
2512+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a1, a1
2513+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a0, a0, 32
2514+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a1, a1, 32
2515+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a2, a1, a0
2516+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a0, a1
2517+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sub a0, a2, a0
25282518
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
25292519
;
25302520
; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_3:
@@ -2845,22 +2835,19 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind optsize {
28452835
;
28462836
; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_5:
28472837
; CHECK-UNALIGNED-RV64-ZBB: # %bb.0: # %entry
2848-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lw a2, 0(a0)
2849-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lw a3, 0(a1)
2850-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a2, a2
2851-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a3, a3
2852-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a2, a2, 32
2853-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a3, a3, 32
2854-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: bne a2, a3, .LBB26_2
2855-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: # %bb.1: # %loadbb1
2856-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a0, 4(a0)
2857-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a1, 4(a1)
2858-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sub a0, a0, a1
2859-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
2860-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: .LBB26_2: # %res_block
2861-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a2, a3
2862-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: neg a0, a0
2863-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ori a0, a0, 1
2838+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a2, 4(a0)
2839+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lwu a0, 0(a0)
2840+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lbu a3, 4(a1)
2841+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lwu a1, 0(a1)
2842+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a2, a2, 32
2843+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a0, a0, a2
2844+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a3, a3, 32
2845+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a1, a1, a3
2846+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a0, a0
2847+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a1, a1
2848+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a2, a1, a0
2849+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a0, a1
2850+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sub a0, a2, a0
28642851
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
28652852
;
28662853
; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_5:
@@ -2883,22 +2870,17 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind optsize {
28832870
;
28842871
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
28852872
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
2886-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
2887-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
2888-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a2, a2
2889-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a3, a3
2890-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a2, a2, 32
2891-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a3, a3, 32
2892-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: bne a2, a3, .LBB26_2
2893-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: # %bb.1: # %loadbb1
2873+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
28942874
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
2875+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
28952876
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
2896-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sub a0, a0, a1
2897-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
2898-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: .LBB26_2: # %res_block
2899-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a2, a3
2900-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: neg a0, a0
2901-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ori a0, a0, 1
2877+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
2878+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
2879+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a0, a0
2880+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a1, a1
2881+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a2, a1, a0
2882+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a0, a1
2883+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sub a0, a2, a0
29022884
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
29032885
;
29042886
; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_5:
@@ -3052,28 +3034,19 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind optsize {
30523034
;
30533035
; CHECK-UNALIGNED-RV64-ZBB-LABEL: memcmp_size_6:
30543036
; CHECK-UNALIGNED-RV64-ZBB: # %bb.0: # %entry
3055-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lw a2, 0(a0)
3056-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lw a3, 0(a1)
3057-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a2, a2
3058-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a3, a3
3059-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a2, a2, 32
3060-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a3, a3, 32
3061-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: bne a2, a3, .LBB27_3
3062-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: # %bb.1: # %loadbb1
3063-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lh a0, 4(a0)
3064-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lh a1, 4(a1)
3065-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a2, a0
3066-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a3, a1
3067-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a2, a2, 48
3068-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: srli a3, a3, 48
3069-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: bne a2, a3, .LBB27_3
3070-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: # %bb.2:
3071-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: li a0, 0
3072-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
3073-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: .LBB27_3: # %res_block
3074-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a2, a3
3075-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: neg a0, a0
3076-
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ori a0, a0, 1
3037+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lhu a2, 4(a0)
3038+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lwu a0, 0(a0)
3039+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lhu a3, 4(a1)
3040+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: lwu a1, 0(a1)
3041+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a2, a2, 32
3042+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a0, a0, a2
3043+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: slli a3, a3, 32
3044+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: or a1, a1, a3
3045+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a0, a0
3046+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: rev8 a1, a1
3047+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a2, a1, a0
3048+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sltu a0, a0, a1
3049+
; CHECK-UNALIGNED-RV64-ZBB-NEXT: sub a0, a2, a0
30773050
; CHECK-UNALIGNED-RV64-ZBB-NEXT: ret
30783051
;
30793052
; CHECK-UNALIGNED-RV32-ZBKB-LABEL: memcmp_size_6:
@@ -3102,28 +3075,17 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind optsize {
31023075
;
31033076
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
31043077
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
3105-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
3106-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
3107-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a2, a2
3108-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a3, a3
3109-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a2, a2, 32
3110-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a3, a3, 32
3111-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: bne a2, a3, .LBB27_3
3112-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: # %bb.1: # %loadbb1
3113-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lh a0, 4(a0)
3114-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lh a1, 4(a1)
3115-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a2, a0
3116-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a3, a1
3117-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a2, a2, 48
3118-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: srli a3, a3, 48
3119-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: bne a2, a3, .LBB27_3
3120-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: # %bb.2:
3121-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: li a0, 0
3122-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
3123-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: .LBB27_3: # %res_block
3124-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a2, a3
3125-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: neg a0, a0
3126-
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ori a0, a0, 1
3078+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
3079+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
3080+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
3081+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
3082+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
3083+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
3084+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a0, a0
3085+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: rev8 a1, a1
3086+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a2, a1, a0
3087+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sltu a0, a0, a1
3088+
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: sub a0, a2, a0
31273089
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: ret
31283090
;
31293091
; CHECK-UNALIGNED-RV32-V-LABEL: memcmp_size_6:

0 commit comments

Comments
 (0)