[llvm] d84dc8f - [InstCombine] Add handling for (or (zext x), (shl (zext (ashr x, bw/2-1))), bw/2) -> (sext x) fold (#130316)

via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 9 03:34:34 PDT 2025


Author: Simon Pilgrim
Date: 2025-03-09T10:34:30Z
New Revision: d84dc8ff93e94f6f0b5a5222afc26e0ee3a4b4f9

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

LOG: [InstCombine] Add handling for (or (zext x), (shl (zext (ashr x, bw/2-1))), bw/2) -> (sext x) fold (#130316)

Minor tweak to #129363 which handled all the cases where there was a sext for the original source value, but not for cases where the source is already half the size of the destination type

Another regression noticed in #76524

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    llvm/test/Transforms/InstCombine/iX-ext-split.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 330358ee749e5..6cc241781d112 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3120,15 +3120,16 @@ static Value *matchOrConcat(Instruction &Or, InstCombiner::BuilderTy &Builder) {
     return ConcatIntrinsicCalls(Intrinsic::bitreverse, UpperBRev, LowerBRev);
 
   // iX ext split: extending or(zext(x),shl(zext(y),bw/2) pattern
-  // to consume sext/ashr: or(zext(sext(x)),shl(zext(sext(ashr(x))),bw/2)
+  // to consume sext/ashr:
+  // or(zext(sext(x)),shl(zext(sext(ashr(x,xbw-1))),bw/2)
+  // or(zext(x),shl(zext(ashr(x,xbw-1)),bw/2)
   Value *X;
-  if (match(LowerSrc, m_SExt(m_Value(X))) &&
+  if (match(LowerSrc, m_SExtOrSelf(m_Value(X))) &&
       match(UpperSrc,
-            m_SExt(m_AShr(
+            m_SExtOrSelf(m_AShr(
                 m_Specific(X),
-                m_SpecificInt(X->getType()->getScalarSizeInBits() - 1))))) {
+                m_SpecificInt(X->getType()->getScalarSizeInBits() - 1)))))
     return Builder.CreateSExt(X, Ty);
-  }
 
   return nullptr;
 }

diff  --git a/llvm/test/Transforms/InstCombine/iX-ext-split.ll b/llvm/test/Transforms/InstCombine/iX-ext-split.ll
index 5f8276934c2ef..fc804df0e4bec 100644
--- a/llvm/test/Transforms/InstCombine/iX-ext-split.ll
+++ b/llvm/test/Transforms/InstCombine/iX-ext-split.ll
@@ -94,11 +94,7 @@ define void @i128_ext_split_store_i64(i64 %x, ptr %out)  {
 ; CHECK-LABEL: define void @i128_ext_split_store_i64(
 ; CHECK-SAME: i64 [[X:%.*]], ptr [[OUT:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    [[LO:%.*]] = zext i64 [[X]] to i128
-; CHECK-NEXT:    [[SIGN:%.*]] = ashr i64 [[X]], 63
-; CHECK-NEXT:    [[WIDEN:%.*]] = zext i64 [[SIGN]] to i128
-; CHECK-NEXT:    [[HI:%.*]] = shl nuw i128 [[WIDEN]], 64
-; CHECK-NEXT:    [[RES:%.*]] = or disjoint i128 [[HI]], [[LO]]
+; CHECK-NEXT:    [[RES:%.*]] = sext i64 [[X]] to i128
 ; CHECK-NEXT:    store i128 [[RES]], ptr [[OUT]], align 16
 ; CHECK-NEXT:    ret void
 ;


        


More information about the llvm-commits mailing list