Skip to content

[GlobalISel][KnownBits] Port SREM to GlobalISel#198956

Merged
arsenm merged 5 commits into
llvm:mainfrom
ZakyHermawan:gisel-srem-knownbit-port
May 21, 2026
Merged

[GlobalISel][KnownBits] Port SREM to GlobalISel#198956
arsenm merged 5 commits into
llvm:mainfrom
ZakyHermawan:gisel-srem-knownbit-port

Conversation

@ZakyHermawan

@ZakyHermawan ZakyHermawan commented May 21, 2026

Copy link
Copy Markdown
Contributor

This PR also move case statement for or G_UREM that is being introduced by #193455 So that G_[U|S][DIV|REM] being grouped together, just like in SelectionDAG.cpp

Related: #150515

This PR also move case statement for or G_SREM that is being introduced by llvm#193455
So that [u|s][div|rem]  being grouped together, just like in SelectionDAG.cpp.

Signed-off-by: ZakyHermawan <zaky.hermawan9615@gmail.com>
@llvmorg-github-actions

llvmorg-github-actions Bot commented May 21, 2026

Copy link
Copy Markdown

@llvm/pr-subscribers-backend-mips
@llvm/pr-subscribers-llvm-globalisel

@llvm/pr-subscribers-backend-aarch64

Author: Zaky Hermawan (ZakyHermawan)

Changes

This PR also move case statement for or G_SREM that is being introduced by #193455 So that G_[U|S][DIV|REM] being grouped together, just like in SelectionDAG.cpp

Related: #150515


Full diff: https://github.com/llvm/llvm-project/pull/198956.diff

2 Files Affected:

  • (modified) llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp (+24-12)
  • (added) llvm/test/CodeGen/AArch64/GlobalISel/knownbits-srem.mir (+107)
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 44298258da11c..4297f6df10015 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -309,18 +309,6 @@ 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;
@@ -453,6 +441,30 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
                             MI.getFlag(MachineInstr::MIFlag::IsExact));
     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_SREM: {
+    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::srem(LHSKnown, RHSKnown);
+    break;
+  }
   case TargetOpcode::G_SELECT: {
     computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
                         Known, DemandedElts, Depth + 1);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-srem.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-srem.mir
new file mode 100644
index 0000000000000..598c41dd29e5b
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-srem.mir
@@ -0,0 +1,107 @@
+# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
+
+# CHECK-LABEL: name: @srem_pow2
+# CHECK-NEXT:  %0:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %1:_ KnownBits:00000000000000000000000000001000 SignBits:28
+# CHECK-NEXT:  %2:_ KnownBits:???????????????????????????????? SignBits:1
+
+---
+name: srem_pow2
+body: |
+  bb.1:
+    liveins: $w0
+
+    %0:_(s32) = COPY $w0
+    %1:_(s32) = G_CONSTANT i32 8
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...
+
+# CHECK-LABEL: name: @srem_non_pow2
+# CHECK-NEXT:  %0:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %1:_ KnownBits:00000000000000000000000000001010 SignBits:28
+# CHECK-NEXT:  %2:_ KnownBits:???????????????????????????????? SignBits:1
+
+---
+name: srem_non_pow2
+body: |
+  bb.1:
+    liveins: $w0
+
+    %0:_(s32) = COPY $w0
+    %1:_(s32) = G_CONSTANT i32 10
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...
+
+# CHECK-LABEL: name: @srem
+# CHECK-NEXT:  %0:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %1:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %2:_ KnownBits:???????????????????????????????? SignBits:1
+
+---
+name: srem
+body: |
+  bb.1:
+    liveins: $w0, $w1
+
+    %0:_(s32) = COPY $w0
+    %1:_(s32) = COPY $w1
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...
+
+# CHECK-LABEL: name: @srem_implicit_def
+# CHECK-NEXT:  %0:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %1:_ KnownBits:00000000000000000000000000001000 SignBits:28
+# CHECK-NEXT:  %2:_ KnownBits:???????????????????????????????? SignBits:1
+
+---
+name: srem_implicit_def
+body: |
+  bb.1:
+    liveins: $w0
+
+    %0:_(s32) = G_IMPLICIT_DEF
+    %1:_(s32) = G_CONSTANT i32 8
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...
+
+# CHECK-LABEL: name: @srem_both_implicit_def
+# CHECK-NEXT:  %0:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %1:_ KnownBits:???????????????????????????????? SignBits:1
+# CHECK-NEXT:  %2:_ KnownBits:???????????????????????????????? SignBits:1
+
+---
+name: srem_both_implicit_def
+body: |
+  bb.1:
+
+    %0:_(s32) = G_IMPLICIT_DEF
+    %1:_(s32) = G_IMPLICIT_DEF
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...
+
+# CHECK-LABEL: name: @srem_const_const
+# CHECK-NEXT:  %0:_ KnownBits:00000000000000000000000000001010 SignBits:28
+# CHECK-NEXT:  %1:_ KnownBits:00000000000000000000000000000011 SignBits:30
+# CHECK-NEXT:  %2:_ KnownBits:000000000000000000000000000000?? SignBits:30
+
+---
+name: srem_const_const
+body: |
+  bb.1:
+
+    %0:_(s32) = G_CONSTANT i32 10
+    %1:_(s32) = G_CONSTANT i32 3
+    %2:_(s32) = G_SREM %0, %1
+    $w0 = COPY %2(s32)
+    RET_ReallyLR implicit $w0
+...

Signed-off-by: ZakyHermawan <zaky.hermawan9615@gmail.com>
@ZakyHermawan

Copy link
Copy Markdown
Contributor Author

@arsenm @davemgreen
Can I get a review for this PR ? Thanks

Comment thread llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp Outdated
Comment thread llvm/test/CodeGen/AArch64/GlobalISel/knownbits-srem.mir Outdated
Signed-off-by: ZakyHermawan <zaky.hermawan9615@gmail.com>
@ZakyHermawan ZakyHermawan requested a review from arsenm May 21, 2026 07:32
@github-actions

github-actions Bot commented May 21, 2026

Copy link
Copy Markdown

🪟 Windows x64 Test Results

  • 134954 tests passed
  • 3304 tests skipped

✅ The build succeeded and all tests passed.

@github-actions

github-actions Bot commented May 21, 2026

Copy link
Copy Markdown

🐧 Linux x64 Test Results

  • 195624 tests passed
  • 5244 tests skipped

✅ The build succeeded and all tests passed.

Signed-off-by: ZakyHermawan <zaky.hermawan9615@gmail.com>
Signed-off-by: ZakyHermawan <zaky.hermawan9615@gmail.com>
@arsenm arsenm merged commit 93d8c2b into llvm:main May 21, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants