Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5589,7 +5589,8 @@ SDValue DAGCombiner::visitMULHU(SDNode *N) {
return DAG.getConstant(0, DL, VT);

// fold (mulhu x, (1 << c)) -> x >> (bitwidth - c)
if (isConstantOrConstantVector(N1, /*NoOpaques*/ true) &&
if (isConstantOrConstantVector(N1, /*NoOpaques=*/true,
/*AllowTruncation=*/true) &&
hasOperation(ISD::SRL, VT)) {
if (SDValue LogBase2 = BuildLogBase2(N1, DL)) {
unsigned NumEltBits = VT.getScalarSizeInBits();
Expand Down Expand Up @@ -29833,7 +29834,8 @@ static SDValue takeInexpensiveLog2(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
return false;
};

if (ISD::matchUnaryPredicate(Op, IsPowerOfTwo)) {
if (ISD::matchUnaryPredicate(Op, IsPowerOfTwo, /*AllowUndefs=*/false,
/*AllowTruncation=*/true)) {
if (!VT.isVector())
return DAG.getConstant(Pow2Constants.back().logBase2(), DL, VT);
// We need to create a build vector
Expand Down
27 changes: 27 additions & 0 deletions llvm/test/CodeGen/AArch64/mulhu-srl-promoted-ops.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s

define <8 x i16> @mulhu_v8i16_by_256(<8 x i16> %x) {
; CHECK-LABEL: mulhu_v8i16_by_256:
; CHECK: // %bb.0:
; CHECK-NEXT: ushr v0.8h, v0.8h, #8
; CHECK-NEXT: ret
%x32 = zext <8 x i16> %x to <8 x i32>
%mul = mul <8 x i32> %x32, splat (i32 256)
%result = lshr <8 x i32> %mul, splat (i32 16)
%trunc = trunc <8 x i32> %result to <8 x i16>
ret <8 x i16> %trunc
}

define <16 x i16> @mulhu_v16i16_by_256(<16 x i16> %x) {
; CHECK-LABEL: mulhu_v16i16_by_256:
; CHECK: // %bb.0:
; CHECK-NEXT: ushr v0.8h, v0.8h, #8
; CHECK-NEXT: ushr v1.8h, v1.8h, #8
; CHECK-NEXT: ret
%x32 = zext <16 x i16> %x to <16 x i32>
%mul = mul <16 x i32> %x32, splat (i32 256)
%result = lshr <16 x i32> %mul, splat (i32 16)
%trunc = trunc <16 x i32> %result to <16 x i16>
ret <16 x i16> %trunc
}
71 changes: 23 additions & 48 deletions llvm/test/CodeGen/RISCV/rvv/vmulhu-sdnode.ll
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,11 @@ define <vscale x 1 x i32> @vmulhu_vi_nxv1i32_0(<vscale x 1 x i32> %va) {
}

define <vscale x 1 x i32> @vmulhu_vi_nxv1i32_1(<vscale x 1 x i32> %va) {
; RV32-LABEL: vmulhu_vi_nxv1i32_1:
; RV32: # %bb.0:
; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
; RV32-NEXT: vsrl.vi v8, v8, 28
; RV32-NEXT: ret
;
; RV64-LABEL: vmulhu_vi_nxv1i32_1:
; RV64: # %bb.0:
; RV64-NEXT: li a0, 16
; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
; RV64-NEXT: vmulhu.vx v8, v8, a0
; RV64-NEXT: ret
; CHECK-LABEL: vmulhu_vi_nxv1i32_1:
; CHECK: # %bb.0:
; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
; CHECK-NEXT: vsrl.vi v8, v8, 28
; CHECK-NEXT: ret
%vb = zext <vscale x 1 x i32> splat (i32 16) to <vscale x 1 x i64>
%vc = zext <vscale x 1 x i32> %va to <vscale x 1 x i64>
%vd = mul <vscale x 1 x i64> %vb, %vc
Expand Down Expand Up @@ -114,18 +107,11 @@ define <vscale x 2 x i32> @vmulhu_vi_nxv2i32_0(<vscale x 2 x i32> %va) {
}

define <vscale x 2 x i32> @vmulhu_vi_nxv2i32_1(<vscale x 2 x i32> %va) {
; RV32-LABEL: vmulhu_vi_nxv2i32_1:
; RV32: # %bb.0:
; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, ma
; RV32-NEXT: vsrl.vi v8, v8, 28
; RV32-NEXT: ret
;
; RV64-LABEL: vmulhu_vi_nxv2i32_1:
; RV64: # %bb.0:
; RV64-NEXT: li a0, 16
; RV64-NEXT: vsetvli a1, zero, e32, m1, ta, ma
; RV64-NEXT: vmulhu.vx v8, v8, a0
; RV64-NEXT: ret
; CHECK-LABEL: vmulhu_vi_nxv2i32_1:
; CHECK: # %bb.0:
; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
; CHECK-NEXT: vsrl.vi v8, v8, 28
; CHECK-NEXT: ret
%vb = zext <vscale x 2 x i32> splat (i32 16) to <vscale x 2 x i64>
%vc = zext <vscale x 2 x i32> %va to <vscale x 2 x i64>
%vd = mul <vscale x 2 x i64> %vb, %vc
Expand Down Expand Up @@ -180,18 +166,11 @@ define <vscale x 4 x i32> @vmulhu_vi_nxv4i32_0(<vscale x 4 x i32> %va) {
}

define <vscale x 4 x i32> @vmulhu_vi_nxv4i32_1(<vscale x 4 x i32> %va) {
; RV32-LABEL: vmulhu_vi_nxv4i32_1:
; RV32: # %bb.0:
; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
; RV32-NEXT: vsrl.vi v8, v8, 28
; RV32-NEXT: ret
;
; RV64-LABEL: vmulhu_vi_nxv4i32_1:
; RV64: # %bb.0:
; RV64-NEXT: li a0, 16
; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma
; RV64-NEXT: vmulhu.vx v8, v8, a0
; RV64-NEXT: ret
; CHECK-LABEL: vmulhu_vi_nxv4i32_1:
; CHECK: # %bb.0:
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
; CHECK-NEXT: vsrl.vi v8, v8, 28
; CHECK-NEXT: ret
%vb = zext <vscale x 4 x i32> splat (i32 16) to <vscale x 4 x i64>
%vc = zext <vscale x 4 x i32> %va to <vscale x 4 x i64>
%vd = mul <vscale x 4 x i64> %vb, %vc
Expand Down Expand Up @@ -246,22 +225,18 @@ define <vscale x 8 x i32> @vmulhu_vi_nxv8i32_0(<vscale x 8 x i32> %va) {
}

define <vscale x 8 x i32> @vmulhu_vi_nxv8i32_1(<vscale x 8 x i32> %va) {
; RV32-LABEL: vmulhu_vi_nxv8i32_1:
; RV32: # %bb.0:
; RV32-NEXT: vsetvli a0, zero, e32, m4, ta, ma
; RV32-NEXT: vsrl.vi v8, v8, 28
; RV32-NEXT: ret
;
; RV64-LABEL: vmulhu_vi_nxv8i32_1:
; RV64: # %bb.0:
; RV64-NEXT: li a0, 16
; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, ma
; RV64-NEXT: vmulhu.vx v8, v8, a0
; RV64-NEXT: ret
; CHECK-LABEL: vmulhu_vi_nxv8i32_1:
; CHECK: # %bb.0:
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
; CHECK-NEXT: vsrl.vi v8, v8, 28
; CHECK-NEXT: ret
%vb = zext <vscale x 8 x i32> splat (i32 16) to <vscale x 8 x i64>
%vc = zext <vscale x 8 x i32> %va to <vscale x 8 x i64>
%vd = mul <vscale x 8 x i64> %vb, %vc
%ve = lshr <vscale x 8 x i64> %vd, splat (i64 32)
%vf = trunc <vscale x 8 x i64> %ve to <vscale x 8 x i32>
ret <vscale x 8 x i32> %vf
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; RV32: {{.*}}
; RV64: {{.*}}