If we promote the ABS and then Expand in LegalizeDAG, then both the sra and the xor will have their inputs sign extended. This generates extra code on RISCV which lacks an i8 or i16 sign extend instructon. If we expand during type legalization, then only the sra will get its input sign extended. RISCV is able to combine this with the sra by doing a shift left followed by an sra. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D121664
27 lines
781 B
LLVM
27 lines
781 B
LLVM
; RUN: llc < %s -mtriple=wasm32-unknown-unknown | FileCheck %s
|
|
|
|
; Regression test for PR41149.
|
|
|
|
define void @mod() {
|
|
; CHECK-LABEL: mod:
|
|
; CHECK-NEXT: .functype mod () -> ()
|
|
; CHECK: local.get 0
|
|
; CHECK-NEXT: local.get 0
|
|
; CHECK-NEXT: i32.load8_s 0
|
|
; CHECK-NEXT: local.tee 0
|
|
; CHECK-NEXT: local.get 0
|
|
; CHECK-NEXT: i32.const 7
|
|
; CHECK-NEXT: i32.shr_s
|
|
; CHECK-NEXT: local.tee 0
|
|
; CHECK-NEXT: i32.xor
|
|
; CHECK-NEXT: local.get 0
|
|
; CHECK-NEXT: i32.sub
|
|
; CHECK-NEXT: i32.store8 0
|
|
%tmp = load <4 x i8>, <4 x i8>* undef
|
|
%tmp2 = icmp slt <4 x i8> %tmp, zeroinitializer
|
|
%tmp3 = sub <4 x i8> zeroinitializer, %tmp
|
|
%tmp4 = select <4 x i1> %tmp2, <4 x i8> %tmp3, <4 x i8> %tmp
|
|
store <4 x i8> %tmp4, <4 x i8>* undef
|
|
ret void
|
|
}
|