]> granicus.if.org Git - llvm/commitdiff
[InstCombine] Preserve 'exact' in -(X >>u 31) -> (X >>s 31) fold
authorRoman Lebedev <lebedev.ri@gmail.com>
Tue, 1 Oct 2019 17:50:09 +0000 (17:50 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Tue, 1 Oct 2019 17:50:09 +0000 (17:50 +0000)
https://rise4fun.com/Alive/yR4

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373363 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineAddSub.cpp
test/Transforms/InstCombine/high-bit-signmask.ll

index 9d640e849dc1d2aa389a23e5221e5c5c3bad5dd2..7e3d405e906056b2e96289e077d938db1454e619 100644 (file)
@@ -1676,12 +1676,16 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
       if (match(Op1, m_LShr(m_Value(X), m_APInt(ShAmt))) &&
           *ShAmt == BitWidth - 1) {
         Value *ShAmtOp = cast<Instruction>(Op1)->getOperand(1);
-        return BinaryOperator::CreateAShr(X, ShAmtOp);
+        Instruction *NewShift = BinaryOperator::CreateAShr(X, ShAmtOp);
+        NewShift->copyIRFlags(Op1);
+        return NewShift;
       }
       if (match(Op1, m_AShr(m_Value(X), m_APInt(ShAmt))) &&
           *ShAmt == BitWidth - 1) {
         Value *ShAmtOp = cast<Instruction>(Op1)->getOperand(1);
-        return BinaryOperator::CreateLShr(X, ShAmtOp);
+        Instruction *NewShift = BinaryOperator::CreateLShr(X, ShAmtOp);
+        NewShift->copyIRFlags(Op1);
+        return NewShift;
       }
 
       if (Op1->hasOneUse()) {
index 7c771f43dd47225a97b43febeea7d7dc31e2cf2b..4a1b395ca35f9b59517f2aac78c5f1e89442a2d2 100644 (file)
@@ -12,7 +12,7 @@ define i64 @t0(i64 %x) {
 }
 define i64 @t0_exact(i64 %x) {
 ; CHECK-LABEL: @t0_exact(
-; CHECK-NEXT:    [[R:%.*]] = ashr i64 [[X:%.*]], 63
+; CHECK-NEXT:    [[R:%.*]] = ashr exact i64 [[X:%.*]], 63
 ; CHECK-NEXT:    ret i64 [[R]]
 ;
   %t0 = lshr exact i64 %x, 63
@@ -30,7 +30,7 @@ define i64 @t2(i64 %x) {
 }
 define i64 @t3_exact(i64 %x) {
 ; CHECK-LABEL: @t3_exact(
-; CHECK-NEXT:    [[R:%.*]] = lshr i64 [[X:%.*]], 63
+; CHECK-NEXT:    [[R:%.*]] = lshr exact i64 [[X:%.*]], 63
 ; CHECK-NEXT:    ret i64 [[R]]
 ;
   %t0 = ashr exact i64 %x, 63