https://github.com/harrisonGPU created 
https://github.com/llvm/llvm-project/pull/224882

Replace a non-zero constant with zero when none of its set bits are
demanded.

This allows users of `SimplifyMultipleUseDemandedBits` to eliminate
irrelevant constant bits while preserving the convention that a null
SDValue indicates no simplification.

---

<sub>Stack created with <a href="https://github.com/github/gh-stack";>GitHub 
Stacks CLI</a> • <a href="https://gh.io/stacks-feedback";>Give Feedback 
💬</a></sub>

>From 892d3e91db867d649dcf7e26f7459e436696f80c Mon Sep 17 00:00:00 2001
From: Harrison Hao <[email protected]>
Date: Sun, 20 Sep 2026 11:57:39 +0800
Subject: [PATCH] [SelectionDAG] Handle constants in
 SimplifyMultipleUseDemandedBits

Replace a non-zero constant with zero when none of its set bits are
demanded.

This allows users of `SimplifyMultipleUseDemandedBits` to eliminate
irrelevant constant bits while preserving the convention that a null
SDValue indicates no simplification.
---
 .../CodeGen/SelectionDAG/TargetLowering.cpp   |  6 ++
 .../CodeGen/AMDGPU/llvm.amdgcn.mul.i24.ll     |  9 +-
 llvm/test/CodeGen/AMDGPU/rotate-add.ll        |  4 +-
 llvm/test/CodeGen/AMDGPU/rotl.ll              | 83 +++++++++----------
 llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll |  7 +-
 llvm/test/CodeGen/PowerPC/rotl-2.ll           |  2 +-
 llvm/test/CodeGen/SystemZ/shift-04.ll         |  6 +-
 llvm/test/CodeGen/SystemZ/shift-08.ll         |  6 +-
 8 files changed, 57 insertions(+), 66 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp 
b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index b4e34c255a1e9d..0dc5a63f54dfd3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -766,6 +766,12 @@ SDValue TargetLowering::SimplifyMultipleUseDemandedBits(
   unsigned BitWidth = DemandedBits.getBitWidth();
   KnownBits LHSKnown, RHSKnown;
   switch (Op.getOpcode()) {
+  case ISD::Constant: {
+    const APInt &Value = Op->getAsAPIntVal();
+    if (!Value.isZero() && (Value & DemandedBits).isZero())
+      return DAG.getConstant(0, SDLoc(Op), VT);
+    break;
+  }
   case ISD::BITCAST: {
     if (VT.isScalableVector())
       return SDValue();
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.mul.i24.ll 
b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.mul.i24.ll
index 380a28bf032296..b5c1eb267b6fcf 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.mul.i24.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.mul.i24.ll
@@ -78,23 +78,20 @@ define amdgpu_kernel void @test_mul_i24_zero_lhs(ptr 
addrspace(1) %out, i32 %src
 define amdgpu_kernel void @test_mul_i24_zero_low24(ptr addrspace(1) %out, i32 
%src) #1 {
 ; GCN-LABEL: test_mul_i24_zero_low24:
 ; GCN:       ; %bb.0:
-; GCN-NEXT:    s_load_dword s6, s[4:5], 0xb
 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
-; GCN-NEXT:    v_mov_b32_e32 v0, 0x1000000
 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
 ; GCN-NEXT:    s_mov_b32 s2, -1
+; GCN-NEXT:    v_mov_b32_e32 v0, 0
 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
-; GCN-NEXT:    v_mul_i32_i24_e32 v0, s6, v0
 ; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0
 ; GCN-NEXT:    s_endpgm
 ;
 ; GFX12-LABEL: test_mul_i24_zero_low24:
 ; GFX12:       ; %bb.0:
-; GFX12-NEXT:    s_load_b96 s[0:2], s[4:5], 0x24
+; GFX12-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
 ; GFX12-NEXT:    s_wait_kmcnt 0x0
-; GFX12-NEXT:    v_mul_i32_i24_e64 v1, 0x1000000, s2
-; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX12-NEXT:    global_store_b32 v0, v0, s[0:1]
 ; GFX12-NEXT:    s_endpgm
   %val = call i32 @llvm.amdgcn.mul.i24(i32 %src, i32 16777216) #0
   store i32 %val, ptr addrspace(1) %out
diff --git a/llvm/test/CodeGen/AMDGPU/rotate-add.ll 
b/llvm/test/CodeGen/AMDGPU/rotate-add.ll
index c1dcfc0ec15ddd..47add1bfcfa7e3 100644
--- a/llvm/test/CodeGen/AMDGPU/rotate-add.ll
+++ b/llvm/test/CodeGen/AMDGPU/rotate-add.ll
@@ -42,14 +42,14 @@ define i32 @test_rotl_var(i32 %x, i32 %y) {
 ; SI-LABEL: test_rotl_var:
 ; SI:       ; %bb.0:
 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; SI-NEXT:    v_sub_i32_e32 v1, vcc, 32, v1
+; SI-NEXT:    v_sub_i32_e32 v1, vcc, 0, v1
 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, v1
 ; SI-NEXT:    s_setpc_b64 s[30:31]
 ;
 ; VI-LABEL: test_rotl_var:
 ; VI:       ; %bb.0:
 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; VI-NEXT:    v_sub_u32_e32 v1, vcc, 32, v1
+; VI-NEXT:    v_sub_u32_e32 v1, vcc, 0, v1
 ; VI-NEXT:    v_alignbit_b32 v0, v0, v0, v1
 ; VI-NEXT:    s_setpc_b64 s[30:31]
   %shl = shl i32 %x, %y
diff --git a/llvm/test/CodeGen/AMDGPU/rotl.ll b/llvm/test/CodeGen/AMDGPU/rotl.ll
index c74d485767922d..43f6e38aa1bc72 100644
--- a/llvm/test/CodeGen/AMDGPU/rotl.ll
+++ b/llvm/test/CodeGen/AMDGPU/rotl.ll
@@ -9,13 +9,12 @@
 define amdgpu_kernel void @rotl_i32(ptr addrspace(1) %in, i32 %x, i32 %y) {
 ; R600-LABEL: rotl_i32:
 ; R600:       ; %bb.0: ; %entry
-; R600-NEXT:    ALU 4, @4, KC0[CB0:0-32], KC1[]
+; R600-NEXT:    ALU 3, @4, KC0[CB0:0-32], KC1[]
 ; R600-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.X, T1.X, 1
 ; R600-NEXT:    CF_END
 ; R600-NEXT:    PAD
 ; R600-NEXT:    ALU clause starting at 4:
-; R600-NEXT:     SUB_INT * T0.W, literal.x, KC0[2].W,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T0.W, 0.0, KC0[2].W,
 ; R600-NEXT:     BIT_ALIGN_INT T0.X, KC0[2].Z, KC0[2].Z, PV.W,
 ; R600-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
 ; R600-NEXT:    2(2.802597e-45), 0(0.000000e+00)
@@ -27,7 +26,7 @@ define amdgpu_kernel void @rotl_i32(ptr addrspace(1) %in, i32 
%x, i32 %y) {
 ; SI-NEXT:    s_mov_b32 s6, -1
 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
 ; SI-NEXT:    s_mov_b32 s4, s0
-; SI-NEXT:    s_sub_i32 s0, 32, s3
+; SI-NEXT:    s_sub_i32 s0, 0, s3
 ; SI-NEXT:    s_and_b32 s0, s0, 31
 ; SI-NEXT:    s_mov_b32 s3, s2
 ; SI-NEXT:    s_mov_b32 s5, s1
@@ -40,7 +39,7 @@ define amdgpu_kernel void @rotl_i32(ptr addrspace(1) %in, i32 
%x, i32 %y) {
 ; GFX8:       ; %bb.0: ; %entry
 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX8-NEXT:    s_sub_i32 s4, 32, s3
+; GFX8-NEXT:    s_sub_i32 s4, 0, s3
 ; GFX8-NEXT:    s_mov_b32 s3, s2
 ; GFX8-NEXT:    s_and_b32 s4, s4, 31
 ; GFX8-NEXT:    s_lshr_b64 s[2:3], s[2:3], s4
@@ -55,7 +54,7 @@ define amdgpu_kernel void @rotl_i32(ptr addrspace(1) %in, i32 
%x, i32 %y) {
 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0
 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-NEXT:    s_sub_i32 s3, 32, s3
+; GFX10-NEXT:    s_sub_i32 s3, 0, s3
 ; GFX10-NEXT:    s_and_b32 s4, s3, 31
 ; GFX10-NEXT:    s_mov_b32 s3, s2
 ; GFX10-NEXT:    s_lshr_b64 s[2:3], s[2:3], s4
@@ -67,7 +66,7 @@ define amdgpu_kernel void @rotl_i32(ptr addrspace(1) %in, i32 
%x, i32 %y) {
 ; GFX11:       ; %bb.0: ; %entry
 ; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-NEXT:    s_sub_i32 s3, 32, s3
+; GFX11-NEXT:    s_sub_i32 s3, 0, s3
 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | 
instid1(SALU_CYCLE_1)
 ; GFX11-NEXT:    s_and_b32 s4, s3, 31
 ; GFX11-NEXT:    s_mov_b32 s3, s2
@@ -88,16 +87,14 @@ entry:
 define amdgpu_kernel void @rotl_v2i32(ptr addrspace(1) %in, <2 x i32> %x, <2 x 
i32> %y) {
 ; R600-LABEL: rotl_v2i32:
 ; R600:       ; %bb.0: ; %entry
-; R600-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
+; R600-NEXT:    ALU 5, @4, KC0[CB0:0-32], KC1[]
 ; R600-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
 ; R600-NEXT:    CF_END
 ; R600-NEXT:    PAD
 ; R600-NEXT:    ALU clause starting at 4:
-; R600-NEXT:     SUB_INT * T0.W, literal.x, KC0[3].Z,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T0.W, 0.0, KC0[3].Z,
 ; R600-NEXT:     BIT_ALIGN_INT T0.Y, KC0[3].X, KC0[3].X, PV.W,
-; R600-NEXT:     SUB_INT * T0.W, literal.x, KC0[3].Y,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T0.W, 0.0, KC0[3].Y,
 ; R600-NEXT:     BIT_ALIGN_INT T0.X, KC0[2].W, KC0[2].W, PV.W,
 ; R600-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
 ; R600-NEXT:    2(2.802597e-45), 0(0.000000e+00)
@@ -109,8 +106,8 @@ define amdgpu_kernel void @rotl_v2i32(ptr addrspace(1) %in, 
<2 x i32> %x, <2 x i
 ; SI-NEXT:    s_mov_b32 s7, 0xf000
 ; SI-NEXT:    s_mov_b32 s6, -1
 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
-; SI-NEXT:    s_sub_i32 s8, 32, s2
-; SI-NEXT:    s_sub_i32 s2, 32, s3
+; SI-NEXT:    s_sub_i32 s8, 0, s2
+; SI-NEXT:    s_sub_i32 s2, 0, s3
 ; SI-NEXT:    s_and_b32 s9, s2, 31
 ; SI-NEXT:    s_mov_b32 s2, s1
 ; SI-NEXT:    s_mov_b32 s3, s1
@@ -128,8 +125,8 @@ define amdgpu_kernel void @rotl_v2i32(ptr addrspace(1) %in, 
<2 x i32> %x, <2 x i
 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x2c
 ; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x24
 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX8-NEXT:    s_sub_i32 s7, 32, s3
-; GFX8-NEXT:    s_sub_i32 s6, 32, s2
+; GFX8-NEXT:    s_sub_i32 s7, 0, s3
+; GFX8-NEXT:    s_sub_i32 s6, 0, s2
 ; GFX8-NEXT:    s_mov_b32 s2, s1
 ; GFX8-NEXT:    s_mov_b32 s3, s1
 ; GFX8-NEXT:    s_and_b32 s1, s7, 31
@@ -151,8 +148,8 @@ define amdgpu_kernel void @rotl_v2i32(ptr addrspace(1) %in, 
<2 x i32> %x, <2 x i
 ; GFX10-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x24
 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0
 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-NEXT:    s_sub_i32 s4, 32, s2
-; GFX10-NEXT:    s_sub_i32 s5, 32, s3
+; GFX10-NEXT:    s_sub_i32 s4, 0, s2
+; GFX10-NEXT:    s_sub_i32 s5, 0, s3
 ; GFX10-NEXT:    s_mov_b32 s2, s1
 ; GFX10-NEXT:    s_mov_b32 s3, s1
 ; GFX10-NEXT:    s_mov_b32 s1, s0
@@ -171,8 +168,8 @@ define amdgpu_kernel void @rotl_v2i32(ptr addrspace(1) %in, 
<2 x i32> %x, <2 x i
 ; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x2c
 ; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x24
 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-NEXT:    s_sub_i32 s6, 32, s2
-; GFX11-NEXT:    s_sub_i32 s7, 32, s3
+; GFX11-NEXT:    s_sub_i32 s6, 0, s2
+; GFX11-NEXT:    s_sub_i32 s7, 0, s3
 ; GFX11-NEXT:    s_mov_b32 s2, s1
 ; GFX11-NEXT:    s_mov_b32 s3, s1
 ; GFX11-NEXT:    s_mov_b32 s1, s0
@@ -197,22 +194,18 @@ entry:
 define amdgpu_kernel void @rotl_v4i32(ptr addrspace(1) %in, <4 x i32> %x, <4 x 
i32> %y) {
 ; R600-LABEL: rotl_v4i32:
 ; R600:       ; %bb.0: ; %entry
-; R600-NEXT:    ALU 13, @4, KC0[CB0:0-32], KC1[]
+; R600-NEXT:    ALU 9, @4, KC0[CB0:0-32], KC1[]
 ; R600-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XYZW, T1.X, 1
 ; R600-NEXT:    CF_END
 ; R600-NEXT:    PAD
 ; R600-NEXT:    ALU clause starting at 4:
-; R600-NEXT:     SUB_INT * T0.W, literal.x, KC0[5].X,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T0.W, 0.0, KC0[5].X,
 ; R600-NEXT:     BIT_ALIGN_INT T0.W, KC0[4].X, KC0[4].X, PV.W,
-; R600-NEXT:     SUB_INT * T1.W, literal.x, KC0[4].W,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T1.W, 0.0, KC0[4].W,
 ; R600-NEXT:     BIT_ALIGN_INT T0.Z, KC0[3].W, KC0[3].W, PS,
-; R600-NEXT:     SUB_INT * T1.W, literal.x, KC0[4].Z,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T1.W, 0.0, KC0[4].Z,
 ; R600-NEXT:     BIT_ALIGN_INT T0.Y, KC0[3].Z, KC0[3].Z, PV.W,
-; R600-NEXT:     SUB_INT * T1.W, literal.x, KC0[4].Y,
-; R600-NEXT:    32(4.484155e-44), 0(0.000000e+00)
+; R600-NEXT:     SUB_INT * T1.W, 0.0, KC0[4].Y,
 ; R600-NEXT:     BIT_ALIGN_INT T0.X, KC0[3].Y, KC0[3].Y, PV.W,
 ; R600-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
 ; R600-NEXT:    2(2.802597e-45), 0(0.000000e+00)
@@ -224,16 +217,16 @@ define amdgpu_kernel void @rotl_v4i32(ptr addrspace(1) 
%in, <4 x i32> %x, <4 x i
 ; SI-NEXT:    s_mov_b32 s3, 0xf000
 ; SI-NEXT:    s_mov_b32 s2, -1
 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
-; SI-NEXT:    s_sub_i32 s4, 32, s15
+; SI-NEXT:    s_sub_i32 s4, 0, s15
 ; SI-NEXT:    s_and_b32 s7, s4, 31
 ; SI-NEXT:    s_mov_b32 s4, s11
 ; SI-NEXT:    s_mov_b32 s5, s11
-; SI-NEXT:    s_sub_i32 s6, 32, s14
+; SI-NEXT:    s_sub_i32 s6, 0, s14
 ; SI-NEXT:    s_lshr_b64 s[4:5], s[4:5], s7
-; SI-NEXT:    s_sub_i32 s13, 32, s13
+; SI-NEXT:    s_sub_i32 s13, 0, s13
 ; SI-NEXT:    s_and_b32 s5, s6, 31
 ; SI-NEXT:    s_mov_b32 s11, s10
-; SI-NEXT:    s_sub_i32 s12, 32, s12
+; SI-NEXT:    s_sub_i32 s12, 0, s12
 ; SI-NEXT:    s_lshr_b64 s[6:7], s[10:11], s5
 ; SI-NEXT:    s_and_b32 s5, s13, 31
 ; SI-NEXT:    s_mov_b32 s10, s9
@@ -254,16 +247,16 @@ define amdgpu_kernel void @rotl_v4i32(ptr addrspace(1) 
%in, <4 x i32> %x, <4 x i
 ; GFX8-NEXT:    s_load_dwordx8 s[8:15], s[4:5], 0x34
 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX8-NEXT:    s_sub_i32 s2, 32, s15
+; GFX8-NEXT:    s_sub_i32 s2, 0, s15
 ; GFX8-NEXT:    s_and_b32 s5, s2, 31
 ; GFX8-NEXT:    s_mov_b32 s2, s11
 ; GFX8-NEXT:    s_mov_b32 s3, s11
-; GFX8-NEXT:    s_sub_i32 s4, 32, s14
+; GFX8-NEXT:    s_sub_i32 s4, 0, s14
 ; GFX8-NEXT:    s_lshr_b64 s[2:3], s[2:3], s5
-; GFX8-NEXT:    s_sub_i32 s6, 32, s13
+; GFX8-NEXT:    s_sub_i32 s6, 0, s13
 ; GFX8-NEXT:    s_and_b32 s3, s4, 31
 ; GFX8-NEXT:    s_mov_b32 s11, s10
-; GFX8-NEXT:    s_sub_i32 s12, 32, s12
+; GFX8-NEXT:    s_sub_i32 s12, 0, s12
 ; GFX8-NEXT:    s_lshr_b64 s[4:5], s[10:11], s3
 ; GFX8-NEXT:    s_and_b32 s3, s6, 31
 ; GFX8-NEXT:    s_mov_b32 s6, s9
@@ -288,10 +281,10 @@ define amdgpu_kernel void @rotl_v4i32(ptr addrspace(1) 
%in, <4 x i32> %x, <4 x i
 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
 ; GFX10-NEXT:    v_mov_b32_e32 v4, 0
 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-NEXT:    s_sub_i32 s6, 32, s12
-; GFX10-NEXT:    s_sub_i32 s7, 32, s13
-; GFX10-NEXT:    s_sub_i32 s12, 32, s14
-; GFX10-NEXT:    s_sub_i32 s13, 32, s15
+; GFX10-NEXT:    s_sub_i32 s6, 0, s12
+; GFX10-NEXT:    s_sub_i32 s7, 0, s13
+; GFX10-NEXT:    s_sub_i32 s12, 0, s14
+; GFX10-NEXT:    s_sub_i32 s13, 0, s15
 ; GFX10-NEXT:    s_mov_b32 s2, s11
 ; GFX10-NEXT:    s_mov_b32 s3, s11
 ; GFX10-NEXT:    s_mov_b32 s11, s10
@@ -319,10 +312,10 @@ define amdgpu_kernel void @rotl_v4i32(ptr addrspace(1) 
%in, <4 x i32> %x, <4 x i
 ; GFX11-NEXT:    s_load_b256 s[8:15], s[4:5], 0x34
 ; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-NEXT:    s_sub_i32 s6, 32, s12
-; GFX11-NEXT:    s_sub_i32 s7, 32, s13
-; GFX11-NEXT:    s_sub_i32 s12, 32, s14
-; GFX11-NEXT:    s_sub_i32 s13, 32, s15
+; GFX11-NEXT:    s_sub_i32 s6, 0, s12
+; GFX11-NEXT:    s_sub_i32 s7, 0, s13
+; GFX11-NEXT:    s_sub_i32 s12, 0, s14
+; GFX11-NEXT:    s_sub_i32 s13, 0, s15
 ; GFX11-NEXT:    s_mov_b32 s2, s11
 ; GFX11-NEXT:    s_mov_b32 s3, s11
 ; GFX11-NEXT:    s_mov_b32 s11, s10
diff --git a/llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll 
b/llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll
index f9d2c259a4c197..c88920b723796f 100644
--- a/llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll
@@ -11,11 +11,10 @@
 define dso_local i64 @rotatemask32(i64 noundef %word) local_unnamed_addr #0 {
 ; AIX32-LABEL: rotatemask32:
 ; AIX32:       # %bb.0: # %entry
-; AIX32-NEXT:    cntlzw r5, r3
 ; AIX32-NEXT:    cmplwi r3, 0
-; AIX32-NEXT:    cntlzw r3, r4
-; AIX32-NEXT:    addi r3, r3, 32
-; AIX32-NEXT:    iseleq r3, r3, r5
+; AIX32-NEXT:    cntlzw r5, r4
+; AIX32-NEXT:    cntlzw r6, r3
+; AIX32-NEXT:    iseleq r3, r5, r6
 ; AIX32-NEXT:    rlwnm r4, r4, r3, 1, 31
 ; AIX32-NEXT:    li r3, 0
 ; AIX32-NEXT:    blr
diff --git a/llvm/test/CodeGen/PowerPC/rotl-2.ll 
b/llvm/test/CodeGen/PowerPC/rotl-2.ll
index 1ee30ac7ed4912..f02630cbebd251 100644
--- a/llvm/test/CodeGen/PowerPC/rotl-2.ll
+++ b/llvm/test/CodeGen/PowerPC/rotl-2.ll
@@ -19,7 +19,7 @@ define i32 @rotl32(i32 %A, i8 %Amt) nounwind {
 define i32 @rotr32(i32 %A, i8 %Amt) nounwind {
 ; CHECK-LABEL: rotr32:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    subfic 4, 4, 32
+; CHECK-NEXT:    neg 4, 4
 ; CHECK-NEXT:    rotlw 3, 3, 4
 ; CHECK-NEXT:    blr
        %shift.upgrd.3 = zext i8 %Amt to i32            ; <i32> [#uses=1]
diff --git a/llvm/test/CodeGen/SystemZ/shift-04.ll 
b/llvm/test/CodeGen/SystemZ/shift-04.ll
index c91a7292604c88..fbc8bd2100d8e1 100644
--- a/llvm/test/CodeGen/SystemZ/shift-04.ll
+++ b/llvm/test/CodeGen/SystemZ/shift-04.ll
@@ -112,12 +112,10 @@ define i32 @f8(i32 %a, i32 %amt) {
   ret i32 %or
 }
 
-; Check the next value up, which without masking must use a separate
-; addition.
+; Check that a constant with zero demanded shift bits is eliminated.
 define i32 @f9(i32 %a, i32 %amt) {
 ; CHECK-LABEL: f9:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    afi %r3, 524288
 ; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
 ; CHECK-NEXT:    br %r14
   %add = add i32 %amt, 524288
@@ -147,7 +145,7 @@ define i32 @f10(i32 %a, i32 %amt) {
 define i32 @f11(i32 %a, i32 %amt) {
 ; CHECK-LABEL: f11:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    rll %r2, %r2, -524288(%r3)
+; CHECK-NEXT:    rll %r2, %r2, 0(%r3)
 ; CHECK-NEXT:    br %r14
   %suba = sub i32 %amt, 524288
   %subb = sub i32 32, %suba
diff --git a/llvm/test/CodeGen/SystemZ/shift-08.ll 
b/llvm/test/CodeGen/SystemZ/shift-08.ll
index c81097fd07e156..7b34203f1adefb 100644
--- a/llvm/test/CodeGen/SystemZ/shift-08.ll
+++ b/llvm/test/CodeGen/SystemZ/shift-08.ll
@@ -113,12 +113,10 @@ define i64 @f8(i64 %a, i64 %amt) {
   ret i64 %or
 }
 
-; Check the next value up, which without masking must use a separate
-; addition.
+; Check that an out-of-range constant with zero low shift bits is eliminated.
 define i64 @f9(i64 %a, i64 %amt) {
 ; CHECK-LABEL: f9:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    afi %r3, 524288
 ; CHECK-NEXT:    rllg %r2, %r2, 0(%r3)
 ; CHECK-NEXT:    br %r14
   %add = add i64 %amt, 524288
@@ -148,7 +146,7 @@ define i64 @f10(i64 %a, i64 %amt) {
 define i64 @f11(i64 %a, i64 %amt) {
 ; CHECK-LABEL: f11:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    rllg %r2, %r2, -524288(%r3)
+; CHECK-NEXT:    rllg %r2, %r2, 0(%r3)
 ; CHECK-NEXT:    br %r14
   %suba = sub i64 %amt, 524288
   %subb = sub i64 64, %suba

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to