
This reverts commit 9cc8442a2b438962883bbbfd8ff62ad4b1a2b95d. This reverts commit 859c871184bdfdebb47b5c7ec5e59348e0534e0b. A performance regression was reported on the original review. There appears to have been an unexpected interaction here. Reverting during investigation.
373 lines
10 KiB
LLVM
373 lines
10 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I
|
|
; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBB
|
|
|
|
define i32 @orc_b_i32_mul255(i32 %x) nounwind {
|
|
; RV32I-LABEL: orc_b_i32_mul255:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a1, 4112
|
|
; RV32I-NEXT: addi a1, a1, 257
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 8
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_mul255:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a1, 4112
|
|
; RV32ZBB-NEXT: addi a1, a1, 257
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 16843009
|
|
%mul = mul nuw nsw i32 %and, 255
|
|
ret i32 %mul
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_lsb(i32 %x) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_lsb:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a1, 4112
|
|
; RV32I-NEXT: addi a1, a1, 257
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 8
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_lsb:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a1, 4112
|
|
; RV32ZBB-NEXT: addi a1, a1, 257
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 16843009
|
|
%sub = mul nuw i32 %and, 255
|
|
ret i32 %sub
|
|
}
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_lsb_preshifted(i32 %x){
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_lsb_preshifted:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: srli a0, a0, 11
|
|
; RV32I-NEXT: lui a1, 16
|
|
; RV32I-NEXT: addi a1, a1, 257
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 8
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_lsb_preshifted:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: srli a0, a0, 11
|
|
; RV32ZBB-NEXT: lui a1, 16
|
|
; RV32ZBB-NEXT: addi a1, a1, 257
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%shr = lshr i32 %x, 11
|
|
%and = and i32 %shr, 16843009
|
|
%sub = mul nuw i32 %and, 255
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b1(i32 %x) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a1, 8224
|
|
; RV32I-NEXT: addi a1, a1, 514
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 7
|
|
; RV32I-NEXT: srli a0, a0, 1
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a1, 8224
|
|
; RV32ZBB-NEXT: addi a1, a1, 514
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 33686018
|
|
%shl = shl i32 %and, 7
|
|
%shr = lshr exact i32 %and, 1
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b2(i32 %x) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b2:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a1, 16448
|
|
; RV32I-NEXT: addi a1, a1, 1028
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 6
|
|
; RV32I-NEXT: srli a0, a0, 2
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b2:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a1, 16448
|
|
; RV32ZBB-NEXT: addi a1, a1, 1028
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 67372036
|
|
%shl = shl i32 %and, 6
|
|
%shr = lshr exact i32 %and, 2
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b3(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b3:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 24672
|
|
; CHECK-NEXT: addi a1, a1, 1542
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: slli a1, a0, 5
|
|
; CHECK-NEXT: srli a0, a0, 3
|
|
; CHECK-NEXT: sub a0, a1, a0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 101058054
|
|
%shl = shl nuw i32 %and, 5
|
|
%shr = lshr i32 %and, 3
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b4(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b4:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 32897
|
|
; CHECK-NEXT: addi a1, a1, -2040
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: slli a1, a0, 4
|
|
; CHECK-NEXT: srli a0, a0, 4
|
|
; CHECK-NEXT: sub a0, a1, a0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 134744072
|
|
%shl = shl nuw i32 %and, 4
|
|
%shr = lshr i32 %and, 4
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b5(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b5:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 65793
|
|
; CHECK-NEXT: addi a1, a1, 16
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: slli a1, a0, 3
|
|
; CHECK-NEXT: srli a0, a0, 5
|
|
; CHECK-NEXT: sub a0, a1, a0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 269488144
|
|
%shl = shl nuw i32 %and, 3
|
|
%shr = lshr i32 %and, 5
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b6(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b6:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 131586
|
|
; CHECK-NEXT: addi a1, a1, 32
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: slli a1, a0, 2
|
|
; CHECK-NEXT: srli a0, a0, 6
|
|
; CHECK-NEXT: sub a0, a1, a0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 538976288
|
|
%shl = shl nuw i32 %and, 2
|
|
%shr = lshr i32 %and, 6
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b7(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b7:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 263172
|
|
; CHECK-NEXT: addi a1, a1, 64
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: slli a1, a0, 1
|
|
; CHECK-NEXT: srli a0, a0, 7
|
|
; CHECK-NEXT: sub a0, a1, a0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 1077952576
|
|
%shl = shl nuw i32 %and, 1
|
|
%shr = lshr i32 %and, 7
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b1_shl_used(i32 %x, ptr %arr) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_shl_used:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a2, 8224
|
|
; RV32I-NEXT: addi a2, a2, 514
|
|
; RV32I-NEXT: and a0, a0, a2
|
|
; RV32I-NEXT: slli a2, a0, 7
|
|
; RV32I-NEXT: srli a3, a0, 1
|
|
; RV32I-NEXT: sub a0, a2, a3
|
|
; RV32I-NEXT: sw a3, 0(a1)
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_shl_used:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a2, 8224
|
|
; RV32ZBB-NEXT: addi a2, a2, 514
|
|
; RV32ZBB-NEXT: and a0, a0, a2
|
|
; RV32ZBB-NEXT: srli a2, a0, 1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: sw a2, 0(a1)
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 33686018
|
|
%shl = shl i32 %and, 7
|
|
%shr = lshr exact i32 %and, 1
|
|
store i32 %shr, ptr %arr, align 4
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b1_srl_used(i32 %x, ptr %arr) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_srl_used:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a2, 8224
|
|
; RV32I-NEXT: addi a2, a2, 514
|
|
; RV32I-NEXT: and a0, a0, a2
|
|
; RV32I-NEXT: slli a2, a0, 7
|
|
; RV32I-NEXT: srli a0, a0, 1
|
|
; RV32I-NEXT: sub a0, a2, a0
|
|
; RV32I-NEXT: sw a2, 0(a1)
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_srl_used:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a2, 8224
|
|
; RV32ZBB-NEXT: addi a2, a2, 514
|
|
; RV32ZBB-NEXT: and a0, a0, a2
|
|
; RV32ZBB-NEXT: slli a2, a0, 7
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: sw a2, 0(a1)
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 33686018
|
|
%shl = shl i32 %and, 7
|
|
%shr = lshr exact i32 %and, 1
|
|
store i32 %shl, ptr %arr, align 4
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b1_not_used(i32 %x, ptr %arr) {
|
|
; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_not_used:
|
|
; RV32I: # %bb.0: # %entry
|
|
; RV32I-NEXT: lui a1, 8224
|
|
; RV32I-NEXT: addi a1, a1, 514
|
|
; RV32I-NEXT: and a0, a0, a1
|
|
; RV32I-NEXT: slli a1, a0, 7
|
|
; RV32I-NEXT: srli a0, a0, 1
|
|
; RV32I-NEXT: sub a0, a1, a0
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_not_used:
|
|
; RV32ZBB: # %bb.0: # %entry
|
|
; RV32ZBB-NEXT: lui a1, 8224
|
|
; RV32ZBB-NEXT: addi a1, a1, 514
|
|
; RV32ZBB-NEXT: and a0, a0, a1
|
|
; RV32ZBB-NEXT: orc.b a0, a0
|
|
; RV32ZBB-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 33686018
|
|
%shl = shl i32 %and, 7
|
|
%shr = lshr exact i32 %and, 1
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_shl_used(i32 %x, ptr %arr){
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_shl_used:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a2, 4112
|
|
; CHECK-NEXT: addi a2, a2, 257
|
|
; CHECK-NEXT: and a0, a0, a2
|
|
; CHECK-NEXT: slli a2, a0, 8
|
|
; CHECK-NEXT: sub a0, a2, a0
|
|
; CHECK-NEXT: sw a2, 0(a1)
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 16843009
|
|
%shl = shl i32 %and, 8
|
|
store i32 %shl, ptr %arr, align 4
|
|
%sub = mul nuw i32 %and, 255
|
|
ret i32 %sub
|
|
}
|
|
|
|
define i32 @orc_b_i32_sub_shl8x_x_b1_both_used(i32 %x, ptr %arr) {
|
|
; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b1_both_used:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a2, 8224
|
|
; CHECK-NEXT: addi a2, a2, 514
|
|
; CHECK-NEXT: and a0, a0, a2
|
|
; CHECK-NEXT: slli a2, a0, 7
|
|
; CHECK-NEXT: srli a3, a0, 1
|
|
; CHECK-NEXT: sub a0, a2, a3
|
|
; CHECK-NEXT: sw a2, 0(a1)
|
|
; CHECK-NEXT: sw a3, 4(a1)
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 33686018
|
|
%shl = shl i32 %and, 7
|
|
%shr = lshr exact i32 %and, 1
|
|
store i32 %shl, ptr %arr, align 4
|
|
%arrayidx1 = getelementptr inbounds i8, ptr %arr, i32 4
|
|
store i32 %shr, ptr %arrayidx1, align 4
|
|
%sub = sub nsw i32 %shl, %shr
|
|
ret i32 %sub
|
|
}
|
|
|
|
|
|
define i32 @orc_b_i32_sub_x_shr8x(i32 %x) {
|
|
; CHECK-LABEL: orc_b_i32_sub_x_shr8x:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lui a1, 4112
|
|
; CHECK-NEXT: addi a1, a1, 257
|
|
; CHECK-NEXT: and a0, a0, a1
|
|
; CHECK-NEXT: srli a1, a0, 8
|
|
; CHECK-NEXT: sub a0, a0, a1
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%and = and i32 %x, 16843009
|
|
%shr = lshr i32 %and, 8
|
|
%sub = sub nsw i32 %and, %shr
|
|
ret i32 %sub
|
|
}
|