Skip to content
12 changes: 12 additions & 0 deletions llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
101 changes: 101 additions & 0 deletions llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %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
Comment thread
tejasgaikwad04 marked this conversation as resolved.
...

# 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
...
Loading