[llvm] 4975ad9 - [GlobalISel][KnownBits] Use KnownBits::urem for G_UREM (#193455)

via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 30 05:23:57 PDT 2026


Author: Tejas Gaikwad
Date: 2026-04-30T12:23:51Z
New Revision: 4975ad9ae2e26d89dd90ff06916f108756ad190d

URL: https://github.com/llvm/llvm-project/commit/4975ad9ae2e26d89dd90ff06916f108756ad190d
DIFF: https://github.com/llvm/llvm-project/commit/4975ad9ae2e26d89dd90ff06916f108756ad190d.diff

LOG: [GlobalISel][KnownBits] Use KnownBits::urem for G_UREM (#193455)

This updates the implementation of G_UREM in GlobalISel to use
KnownBits::urem instead of reimplementing the logic.
Supersedes #189087.

Added: 
    llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir

Modified: 
    llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index f335e6c14c689..5fcc84d0d76a1 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<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
+...
+
+# 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
+...


        


More information about the llvm-commits mailing list