[llvm-branch-commits] [llvm] [GlobalISel] Add computeNumSignBits for G_SHUFFLE_VECTOR (PR #139505)

2025-05-12 Thread Jay Foad via llvm-branch-commits


@@ -874,6 +874,30 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
SrcTy.getScalarSizeInBits());
 break;
   }
+  case TargetOpcode::G_SHUFFLE_VECTOR: {
+// Collect the minimum number of sign bits that are shared by every vector
+// element referenced by the shuffle.
+APInt DemandedLHS, DemandedRHS;
+unsigned NumElts = MRI.getType(MI.getOperand(1).getReg()).getNumElements();
+if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
+DemandedElts, DemandedLHS, DemandedRHS))
+  return 1;
+
+unsigned Tmp = std::numeric_limits::max();
+if (!!DemandedLHS)
+  Tmp =
+  computeNumSignBits(MI.getOperand(1).getReg(), DemandedLHS, Depth + 
1);
+if (!!DemandedRHS) {
+  unsigned Tmp2 =
+  computeNumSignBits(MI.getOperand(2).getReg(), DemandedRHS, Depth + 
1);
+  Tmp = std::min(Tmp, Tmp2);
+}
+// If we don't know anything, early out and try computeKnownBits fall-back.
+if (Tmp == 1)
+  break;
+assert(Tmp <= TyBits && "Failed to determine minimum sign bits");

jayfoad wrote:

I don't think this is particularly useful. You could just initialize `Tmp` to 
`TyBits` instead.

https://github.com/llvm/llvm-project/pull/139505
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel] Add computeNumSignBits for G_SHUFFLE_VECTOR (PR #139505)

2025-05-12 Thread Jay Foad via llvm-branch-commits


@@ -874,6 +874,30 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
SrcTy.getScalarSizeInBits());
 break;
   }
+  case TargetOpcode::G_SHUFFLE_VECTOR: {
+// Collect the minimum number of sign bits that are shared by every vector
+// element referenced by the shuffle.
+APInt DemandedLHS, DemandedRHS;
+unsigned NumElts = MRI.getType(MI.getOperand(1).getReg()).getNumElements();
+if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
+DemandedElts, DemandedLHS, DemandedRHS))
+  return 1;
+
+unsigned Tmp = std::numeric_limits::max();
+if (!!DemandedLHS)
+  Tmp =
+  computeNumSignBits(MI.getOperand(1).getReg(), DemandedLHS, Depth + 
1);

jayfoad wrote:

Should early-out here if Tmp is 1, to save a second expensive call to 
computeNumSignBits.

https://github.com/llvm/llvm-project/pull/139505
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel] Add computeNumSignBits for G_SHUFFLE_VECTOR (PR #139505)

2025-05-12 Thread Jay Foad via llvm-branch-commits

https://github.com/jayfoad edited 
https://github.com/llvm/llvm-project/pull/139505
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits