[llvm] [GlobalISel] Add NumSignBits for G_UNMERGE_VALUES (PR #213607)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 3 00:35:42 PDT 2026


================
@@ -43,3 +43,68 @@ body:             |
    %result1:_(<2 x i8>) = COPY %x0_0
    %result2:_(<2 x i8>) = COPY %x0_1
 ...
+---
+name:            Sign_Scalar
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @Sign_Scalar
+  ; CHECK-NEXT: %copy_x0:_ KnownBits:???????????????????????????????? SignBits:1
+  ; CHECK-NEXT: %mask4:_ KnownBits:00000000000000000000000000000100 SignBits:29
+  ; CHECK-NEXT: %and4:_ KnownBits:???????????????????????????????? SignBits:5
+  ; CHECK-NEXT: %x4_0:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %x4_1:_ KnownBits:???????????????? SignBits:5
+  ; CHECK-NEXT: %mask16:_ KnownBits:00000000000000000000000000001111 SignBits:28
+  ; CHECK-NEXT: %and16:_ KnownBits:???????????????????????????????? SignBits:16
+  ; CHECK-NEXT: %x16_0:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %x16_1:_ KnownBits:???????????????? SignBits:16
+  ; CHECK-NEXT: %mask24:_ KnownBits:00000000000000000000000000011000 SignBits:27
+  ; CHECK-NEXT: %and24:_ KnownBits:???????????????????????????????? SignBits:25
+  ; CHECK-NEXT: %x24_0:_ KnownBits:???????????????? SignBits:9
+  ; CHECK-NEXT: %x24_1:_ KnownBits:???????????????? SignBits:16
+   %copy_x0:_(i32) = COPY $w0
+   %mask4:_(i32) = G_CONSTANT i32 4
+   %and4:_(i32) = G_ASHR %copy_x0, %mask4
+   %x4_0:_(i16), %x4_1:_(i16) = G_UNMERGE_VALUES %and4
+   %mask16:_(i32) = G_CONSTANT i32 15
+   %and16:_(i32) = G_ASHR %copy_x0, %mask16
+   %x16_0:_(i16), %x16_1:_(i16) = G_UNMERGE_VALUES %and16
+   %mask24:_(i32) = G_CONSTANT i32 24
+   %and24:_(i32) = G_ASHR %copy_x0, %mask24
+   %x24_0:_(i16), %x24_1:_(i16) = G_UNMERGE_VALUES %and24
+...
+---
+name:            Sign_Scalar_Vector
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @Sign_Scalar_Vector
+  ; CHECK-NEXT: %copy_x0:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %maskf:_ KnownBits:0000000000000100 SignBits:13
+  ; CHECK-NEXT: %x0_x1:_ KnownBits:0000000000000100 SignBits:13
+  ; CHECK-NEXT: %and:_ KnownBits:???????????????? SignBits:5
+  ; CHECK-NEXT: %x0_0:_ KnownBits:???????????????? SignBits:5
+  ; CHECK-NEXT: %x0_1:_ KnownBits:???????????????? SignBits:5
+   %copy_x0:_(<2 x i16>) = COPY $w0
+   %maskf:_(i16) = G_CONSTANT i16 4
+   %x0_x1:_(<2 x i16>) = G_BUILD_VECTOR %maskf, %maskf
+   %and:_(<2 x i16>) = G_ASHR %copy_x0, %x0_x1
+   %x0_0:_(i16), %x0_1:_(i16) = G_UNMERGE_VALUES %and
+...
+---
+name:            Sign_Vector
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @Sign_Vector
+  ; CHECK-NEXT: %copy_x0:_ KnownBits:???????? SignBits:1
+  ; CHECK-NEXT: %maskff:_ KnownBits:00000110 SignBits:5
+  ; CHECK-NEXT: %maskf:_ KnownBits:00000100 SignBits:5
+  ; CHECK-NEXT: %x0_x1:_ KnownBits:000001?0 SignBits:5
+  ; CHECK-NEXT: %and:_ KnownBits:???????? SignBits:5
+  ; CHECK-NEXT: %x0_0:_ KnownBits:???????? SignBits:5
+  ; CHECK-NEXT: %x0_1:_ KnownBits:???????? SignBits:7
+   %copy_x0:_(<4 x i8>) = COPY $w0
+   %maskff:_(i8) = G_CONSTANT i8 6
+   %maskf:_(i8) = G_CONSTANT i8 4
+   %x0_x1:_(<4 x i8>) = G_BUILD_VECTOR %maskf, %maskf, %maskff, %maskff
+   %and:_(<4 x i8>) = G_ASHR %copy_x0, %x0_x1
+   %x0_0:_(<2 x i8>), %x0_1:_(<2 x i8>) = G_UNMERGE_VALUES %and
+...
----------------
arsenm wrote:

Check poison / undef behavior 

https://github.com/llvm/llvm-project/pull/213607


More information about the llvm-commits mailing list