diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp index 32b533d93fb31..47d00e5ab3763 100644 --- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp +++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp @@ -309,6 +309,18 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known, Known.Zero.setHighBits(MaxValue.countl_zero()); break; } + case TargetOpcode::G_UREM: { + KnownBits LHSKnown(Known.getBitWidth()); + KnownBits RHSKnown(Known.getBitWidth()); + + computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, + Depth + 1); + computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, + Depth + 1); + + Known = KnownBits::urem(LHSKnown, RHSKnown); + break; + } case TargetOpcode::G_CONSTANT: { Known = KnownBits::makeConstant(MI.getOperand(1).getCImm()->getValue()); break; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir new file mode 100644 index 0000000000000..c6146d4d1b271 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir @@ -0,0 +1,101 @@ +# RUN: llc -mtriple aarch64 -passes="print" %s -filetype=null 2>&1 | FileCheck %s + +# CHECK-LABEL: name: @urem_pow2 +# CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %1:_ KnownBits:00000000000000000000000000001000 SignBits:28 +# CHECK-NEXT: %2:_ KnownBits:00000000000000000000000000000??? SignBits:29 + +name: urem_pow2 +body: | + bb.1: + liveins: $w0 + + %0:_(s32) = COPY $w0 + %1:_(s32) = G_CONSTANT i32 8 + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +... + +# CHECK-LABEL: name: @urem_non_pow2 +# CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %1:_ KnownBits:00000000000000000000000000001010 SignBits:28 +# CHECK-NEXT: %2:_ KnownBits:0000000000000000000000000000???? SignBits:28 + +name: urem_non_pow2 +body: | + bb.1: + liveins: $w0 + + %0:_(s32) = COPY $w0 + %1:_(s32) = G_CONSTANT i32 10 + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +... + +# CHECK-LABEL: name: @urem +# CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 + +name: urem +body: | + bb.1: + liveins: $w0, $w1 + + %0:_(s32) = COPY $w0 + %1:_(s32) = COPY $w1 + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +... + +# CHECK-LABEL: name: @urem_implicit_def +# CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %1:_ KnownBits:00000000000000000000000000001000 SignBits:28 +# CHECK-NEXT: %2:_ KnownBits:00000000000000000000000000000??? SignBits:29 + +name: urem_implicit_def +body: | + bb.1: + liveins: $w0 + + %0:_(s32) = G_IMPLICIT_DEF + %1:_(s32) = G_CONSTANT i32 8 + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +... + +# CHECK-LABEL: name: @urem_both_implicit_def +# CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 +# CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 + +name: urem_both_implicit_def +body: | + bb.1: + + %0:_(s32) = G_IMPLICIT_DEF + %1:_(s32) = G_IMPLICIT_DEF + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +... + +# CHECK-LABEL: name: @urem_const_const +# CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000001010 SignBits:28 +# CHECK-NEXT: %1:_ KnownBits:00000000000000000000000000000011 SignBits:30 +# CHECK-NEXT: %2:_ KnownBits:000000000000000000000000000000?? SignBits:30 + +name: urem_const_const +body: | + bb.1: + + %0:_(s32) = G_CONSTANT i32 10 + %1:_(s32) = G_CONSTANT i32 3 + %2:_(s32) = G_UREM %0, %1 + $w0 = COPY %2(s32) + RET_ReallyLR implicit $w0 +...