diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index 13d048a98d6ea..ce4db2e112fa0 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -460,8 +460,8 @@ def : Pat<(i64 (WebAssemblyWrapperREL texternalsym:$addr)), include "WebAssemblyInstrMemory.td" include "WebAssemblyInstrCall.td" include "WebAssemblyInstrControl.td" -include "WebAssemblyInstrInteger.td" include "WebAssemblyInstrConv.td" +include "WebAssemblyInstrInteger.td" include "WebAssemblyInstrFloat.td" include "WebAssemblyInstrAtomics.td" include "WebAssemblyInstrSIMD.td" diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td index d4c8f92c883e7..eb692679f5971 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td @@ -107,6 +107,9 @@ def : Pat<(rotr I32:$lhs, (and I32:$rhs, 31)), (ROTR_I32 I32:$lhs, I32:$rhs)>; def : Pat<(rotl I64:$lhs, (and I64:$rhs, 63)), (ROTL_I64 I64:$lhs, I64:$rhs)>; def : Pat<(rotr I64:$lhs, (and I64:$rhs, 63)), (ROTR_I64 I64:$lhs, I64:$rhs)>; +def : Pat<(shl I64:$lhs, (zext (and I32:$rhs, 63))), + (SHL_I64 I64:$lhs, (I64_EXTEND_U_I32 I32:$rhs))>; + defm SELECT_I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs, I32:$cond), (outs), (ins), [(set I32:$dst, (select I32:$cond, I32:$lhs, I32:$rhs))], diff --git a/llvm/test/CodeGen/WebAssembly/masked-shifts.ll b/llvm/test/CodeGen/WebAssembly/masked-shifts.ll index 5bcb023e546b5..368f30fd5d7ed 100644 --- a/llvm/test/CodeGen/WebAssembly/masked-shifts.ll +++ b/llvm/test/CodeGen/WebAssembly/masked-shifts.ll @@ -18,6 +18,21 @@ define i32 @shl_i32(i32 %v, i32 %x) { ret i32 %a } +define i64 @shl_i64_zext(i64 %v, i32 %x) { +; CHECK-LABEL: shl_i64_zext: +; CHECK: .functype shl_i64_zext (i64, i32) -> (i64) +; CHECK-NEXT: # %bb.0: +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: local.get 1 +; CHECK-NEXT: i64.extend_i32_u +; CHECK-NEXT: i64.shl +; CHECK-NEXT: # fallthrough-return + %m = and i32 %x, 63 + %z = zext i32 %m to i64 + %a = shl i64 %v, %z + ret i64 %a +} + define i32 @sra_i32(i32 %v, i32 %x) { ; CHECK-LABEL: sra_i32: ; CHECK: .functype sra_i32 (i32, i32) -> (i32)