<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}
p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div>On Fri, Dec 30, 2022, at 17:41, Roman Lebedev via llvm-commits wrote:<br></div><blockquote type="cite" id="qt" style=""><div><br></div><div>Author: Roman Lebedev<br></div><div>Date: 2022-12-30T19:40:46+03:00<br></div><div>New Revision: 66efb986322b206834e7c9e1eb777fa053912c39<br></div><div><br></div><div>URL: <a href="https://github.com/llvm/llvm-project/commit/66efb986322b206834e7c9e1eb777fa053912c39">https://github.com/llvm/llvm-project/commit/66efb986322b206834e7c9e1eb777fa053912c39</a><br></div><div>DIFF: <a href="https://github.com/llvm/llvm-project/commit/66efb986322b206834e7c9e1eb777fa053912c39.diff">https://github.com/llvm/llvm-project/commit/66efb986322b206834e7c9e1eb777fa053912c39.diff</a><br></div><div><br></div><div>LOG: [CVP] Expand bound `urem`s<br></div><div><br></div><div>This kind of thing happens really frequently in LLVM's very own<br></div><div>shuffle combining methods, and it is even considered bad practice<br></div><div>to use `%` there, instead of using this expansion directly.<br></div><div>Though, many of the cases there have variable divisors,<br></div><div>so this won't help everything.<br></div><div><br></div><div>Simple case: <a href="https://alive2.llvm.org/ce/z/PjvYf-">https://alive2.llvm.org/ce/z/PjvYf-</a><br></div><div>There's alternative expansion via `umin`:<br></div><div><a href="https://alive2.llvm.org/ce/z/hWCVPb">https://alive2.llvm.org/ce/z/hWCVPb</a><br></div><div><br></div><div>BUT while we can transform the first expansion<br></div><div>into the `umin` one (e.g. for SCEV):<br></div><div><a href="https://alive2.llvm.org/ce/z/iNxKmJ">https://alive2.llvm.org/ce/z/iNxKmJ</a><br></div><div>... we can't go in the opposite direction.<br></div><div><br></div><div>Also, the non-`umin` expansion seems somewhat more codegen-friendly:<br></div><div><a href="https://godbolt.org/z/qzjx5bqWK">https://godbolt.org/z/qzjx5bqWK</a><br></div><div><a href="https://godbolt.org/z/a7bj1axbx">https://godbolt.org/z/a7bj1axbx</a><br></div><div><br></div><div>There's second variant of precondition:<br></div><div><a href="https://alive2.llvm.org/ce/z/zE6cbM">https://alive2.llvm.org/ce/z/zE6cbM</a><br></div><div>but there the numerator must be non-undef / must be frozen.<br></div><div><br></div><div>Added: <br></div><div>    <br></div><div><br></div><div>Modified: <br></div><div>    llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br></div><div>    llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll<br></div><div>    llvm/test/Transforms/CorrelatedValuePropagation/urem.ll<br></div><div>    llvm/test/Transforms/PhaseOrdering/cmp-logic.ll<br></div><div><br></div><div>Removed: <br></div><div>    <br></div><div><br></div><div><br></div><div>################################################################################<br></div><div>diff  --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br></div><div>index 5c3fdc1451e93..1093f4e23254c 100644<br></div><div>--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br></div><div>+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp<br></div><div>@@ -769,6 +769,63 @@ static bool narrowSDivOrSRem(BinaryOperator *Instr, LazyValueInfo *LVI) {<br></div><div>   return true;<br></div><div>}<br></div><div> <br></div><div>+static bool expandURem(BinaryOperator *Instr, LazyValueInfo *LVI) {<br></div><div>+  assert(Instr->getOpcode() == Instruction::URem);<br></div><div>+  assert(!Instr->getType()->isVectorTy());<br></div><div>+<br></div><div>+  Value *X = Instr->getOperand(0);<br></div><div>+  Value *Y = Instr->getOperand(1);<br></div><div>+<br></div><div>+  ConstantRange XCR = LVI->getConstantRange(X, Instr);<br></div><div>+  ConstantRange YCR = LVI->getConstantRange(Y, Instr);<br></div><div>+<br></div><div>+  // Given<br></div><div>+  //   R  = X u% Y<br></div><div>+  // We can represent the modulo operation as a loop/self-recursion:<br></div><div>+  //   urem_rec(X, Y):<br></div><div>+  //     Z = X - Y<br></div><div>+  //     if X u< Y<br></div><div>+  //       ret X<br></div><div>+  //     else<br></div><div>+  //       ret urem_rec(Z, Y)<br></div><div>+  // which isn't better, but if we only need a single iteration<br></div><div>+  // to compute the answer, this becomes quite good:<br></div><div>+  //   R  = X < Y ? X : X - Y    iff X u< 2*Y (w/ unsigned saturation)<br></div><div>+  // Now, we do not care about all full multiples of Y in X, they do not change<br></div><div>+  // the answer, thus we could rewrite the expression as:<br></div><div>+  //   X* = X - (Y * |_ X / Y _|)<br></div><div>+  //   R  = X* % Y<br></div><div>+  // so we don't need the *first* iteration to return, we just need to<br></div><div>+  // know *which* iteration will always return, so we could also rewrite it as:<br></div><div>+  //   X* = X - (Y * |_ X / Y _|)<br></div><div>+  //   R  = X* % Y                 iff X* u< 2*Y (w/ unsigned saturation)<br></div><div>+  // but that does not seem profitable here.<br></div><div>+<br></div><div>+  bool XIsBound =<br></div><div>+      XCR.icmp(ICmpInst::ICMP_ULT, YCR.umul_sat(APInt(YCR.getBitWidth(), 2)));<br></div><div>+  // Even if we don't know X's range, the divisor may be so large, X can't ever<br></div><div>+  // be 2x larger than that. I.e. if divisor is always negative.<br></div><div>+  if (!XIsBound && !YCR.isAllNegative())<br></div><div>+    return false;<br></div><div>+<br></div><div>+  IRBuilder<> B{Instr};<br></div><div>+  if (!XIsBound) {<br></div><div>+    // NOTE: this transformation increases use count on X, but that is fine<br></div><div>+    // unless the transformation is valid because the divisor is negative,<br></div><div>+    // and is non-variable, and thus we didn't have any extra uses.<br></div><div>+    if (auto *Ycst = dyn_cast<ConstantInt>(Y); Ycst && Ycst->isNegative())<br></div><div>+      X = B.CreateFreeze(X, X->getName() + ".frozen");<br></div><div>+  }<br></div></blockquote><div><br></div><div>Hi Roman,<br></div><div><br></div><div>This freezing logic does not look quite right to me: The increase in use count is a problem even if we have a bound on X -- I suspect you arrived at this logic by picking alive test cases where undef/poison inputs are excluded for other reasons, e.g. through a use of assume or range metadata.<br></div><div><br></div><div>For example, consider this minor variation on test5 (adjusted to actually return the result): <a href="https://alive2.llvm.org/ce/z/CKRkWX">https://alive2.llvm.org/ce/z/CKRkWX</a> Here the range is enforced through an and instruction, and thus does not preclude a (partial) undef value.<br></div><div><br></div><div>On a more general note, you might want to consider making more use of pre-commit review for non-trivial changes, so that issues can be caught before a change is committed. (This is not really about this specific patch, but more a general trend that I find slightly concerning, especially as many non-reviewed commits did end up causing preventable regressions. Not going through review for all changes is perfectly fine -- I would merely suggest to lean slightly more towards putting up a review.)<br></div><div><br></div><div>Regards,<br></div><div>Nikita<br></div><div><br></div><blockquote type="cite" id="qt" style=""><div>+  auto *AdjX = B.CreateNUWSub(X, Y, Instr->getName() + ".urem");<br></div><div>+  auto *Cmp = B.CreateICmp(ICmpInst::ICMP_ULT, X, Y, Instr->getName() + ".cmp");<br></div><div>+  auto *ExpandedURem = B.CreateSelect(Cmp, X, AdjX);<br></div><div>+  ExpandedURem->takeName(Instr);<br></div><div>+  Instr->replaceAllUsesWith(ExpandedURem);<br></div><div>+  Instr->eraseFromParent();<br></div><div>+  ++NumURemExpanded;<br></div><div>+  return true;<br></div><div>+}<br></div><div>+<br></div><div>static bool processURem(BinaryOperator *Instr, LazyValueInfo *LVI) {<br></div><div>   assert(Instr->getOpcode() == Instruction::URem);<br></div><div>   assert(!Instr->getType()->isVectorTy());<br></div><div>@@ -787,6 +844,9 @@ static bool processURem(BinaryOperator *Instr, LazyValueInfo *LVI) {<br></div><div>     return true;<br></div><div>   }<br></div><div> <br></div><div>+  if (expandURem(Instr, LVI))<br></div><div>+    return true;<br></div><div>+<br></div><div>   return false;<br></div><div>}<br></div><div> <br></div><div><br></div><div>diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll<br></div><div>index 41a651929a24e..26e8bc3534e45 100644<br></div><div>--- a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll<br></div><div>+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll<br></div><div>@@ -20,7 +20,9 @@ define i8 @constant.divisor.v4(i8 %x) {<br></div><div>; CHECK-LABEL: @constant.divisor.v4(<br></div><div>; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 4<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x.upper = icmp ult i8 %x, 4<br></div><div>@@ -31,7 +33,9 @@ define i8 @constant.divisor.v4(i8 %x) {<br></div><div>define i8 @constant.divisor.x.range.v4(ptr %x.ptr) {<br></div><div>; CHECK-LABEL: @constant.divisor.x.range.v4(<br></div><div>; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG0:![0-9]+]]<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 4 }<br></div><div>@@ -42,7 +46,9 @@ define i8 @constant.divisor.v5(i8 %x) {<br></div><div>; CHECK-LABEL: @constant.divisor.v5(<br></div><div>; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 5<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x.upper = icmp ult i8 %x, 5<br></div><div>@@ -54,7 +60,9 @@ define i8 @constant.divisor.v6(i8 %x) {<br></div><div>; CHECK-LABEL: @constant.divisor.v6(<br></div><div>; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 6<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x.upper = icmp ult i8 %x, 6<br></div><div>@@ -104,7 +112,9 @@ define i8 @variable.v4(i8 %x, i8 %y) {<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_LOWER]])<br></div><div>; CHECK-NEXT:    [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x = icmp ult i8 %x, 4<br></div><div>@@ -120,7 +130,9 @@ define i8 @variable.v4.range(ptr %x.ptr, ptr %y.ptr) {<br></div><div>; CHECK-LABEL: @variable.v4.range(<br></div><div>; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG0]]<br></div><div>; CHECK-NEXT:    [[Y:%.*]] = load i8, ptr [[Y_PTR:%.*]], align 1, !range [[RNG1:![0-9]+]]<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 4 }<br></div><div>@@ -136,7 +148,9 @@ define i8 @variable.v5(i8 %x, i8 %y) {<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_LOWER]])<br></div><div>; CHECK-NEXT:    [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x = icmp ult i8 %x, 5<br></div><div>@@ -156,7 +170,9 @@ define i8 @variable.v6(i8 %x, i8 %y) {<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_LOWER]])<br></div><div>; CHECK-NEXT:    [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_Y_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], [[Y]]<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x = icmp ult i8 %x, 6<br></div><div>@@ -206,7 +222,9 @@ define i8 @large.divisor.v1(i8 %x) {<br></div><div>; CHECK-LABEL: @large.divisor.v1(<br></div><div>; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], -128<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x.upper = icmp ult i8 %x, 128<br></div><div>@@ -217,7 +235,9 @@ define i8 @large.divisor.v1(i8 %x) {<br></div><div>define i8 @large.divisor.v1.range(ptr %x.ptr) {<br></div><div>; CHECK-LABEL: @large.divisor.v1.range(<br></div><div>; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG2:![0-9]+]]<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 127<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 128 }<br></div><div>@@ -248,7 +268,9 @@ define i8 @large.divisor.with.overflow.v1(i8 %x) {<br></div><div>; CHECK-LABEL: @large.divisor.with.overflow.v1(<br></div><div>; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], -127<br></div><div>; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %cmp.x.upper = icmp ult i8 %x, 129<br></div><div>@@ -259,7 +281,9 @@ define i8 @large.divisor.with.overflow.v1(i8 %x) {<br></div><div>define i8 @large.divisor.with.overflow.v1.range(ptr %x.ptr) {<br></div><div>; CHECK-LABEL: @large.divisor.with.overflow.v1.range(<br></div><div>; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG3:![0-9]+]]<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], -128<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 129 }<br></div><div>@@ -268,7 +292,10 @@ define i8 @large.divisor.with.overflow.v1.range(ptr %x.ptr) {<br></div><div>}<br></div><div>define i8 @large.divisor.with.overflow.v2.unbound.x(i8 %x) {<br></div><div>; CHECK-LABEL: @large.divisor.with.overflow.v2.unbound.x(<br></div><div>-; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X:%.*]], -128<br></div><div>+; CHECK-NEXT:    [[X_FROZEN:%.*]] = freeze i8 [[X:%.*]]<br></div><div>+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X_FROZEN]], -128<br></div><div>+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X_FROZEN]], -128<br></div><div>+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X_FROZEN]], i8 [[REM_UREM]]<br></div><div>; CHECK-NEXT:    ret i8 [[REM]]<br></div><div>;<br></div><div>   %rem = urem i8 %x, 128<br></div><div><br></div><div>diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll<br></div><div>index 88395ef89f5f8..19dfc681c9111 100644<br></div><div>--- a/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll<br></div><div>+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll<br></div><div>@@ -117,9 +117,9 @@ exit:<br></div><div>define void @test5(i32 %n) {<br></div><div>; CHECK-LABEL: @test5(<br></div><div>; CHECK-NEXT:    [[TRUNC:%.*]] = and i32 [[N:%.*]], 63<br></div><div>-; CHECK-NEXT:    [[DIV_LHS_TRUNC:%.*]] = trunc i32 [[TRUNC]] to i8<br></div><div>-; CHECK-NEXT:    [[DIV1:%.*]] = urem i8 [[DIV_LHS_TRUNC]], 42<br></div><div>-; CHECK-NEXT:    [[DIV_ZEXT:%.*]] = zext i8 [[DIV1]] to i32<br></div><div>+; CHECK-NEXT:    [[DIV_UREM:%.*]] = sub nuw i32 [[TRUNC]], 42<br></div><div>+; CHECK-NEXT:    [[DIV_CMP:%.*]] = icmp ult i32 [[TRUNC]], 42<br></div><div>+; CHECK-NEXT:    [[DIV:%.*]] = select i1 [[DIV_CMP]], i32 [[TRUNC]], i32 [[DIV_UREM]]<br></div><div>; CHECK-NEXT:    ret void<br></div><div>;<br></div><div>   %trunc = and i32 %n, 63<br></div><div><br></div><div>diff  --git a/llvm/test/Transforms/PhaseOrdering/cmp-logic.ll b/llvm/test/Transforms/PhaseOrdering/cmp-logic.ll<br></div><div>index 1d32e5df21ebd..008e88e8dbe52 100644<br></div><div>--- a/llvm/test/Transforms/PhaseOrdering/cmp-logic.ll<br></div><div>+++ b/llvm/test/Transforms/PhaseOrdering/cmp-logic.ll<br></div><div>@@ -123,16 +123,15 @@ define i32 @PR56119(i32 %e.coerce) {<br></div><div>;<br></div><div>; OZ-LABEL: @PR56119(<br></div><div>; OZ-NEXT:  entry:<br></div><div>-; OZ-NEXT:    [[E_COERCE_FR:%.*]] = freeze i32 [[E_COERCE:%.*]]<br></div><div>-; OZ-NEXT:    [[TMP0:%.*]] = and i32 [[E_COERCE_FR]], 255<br></div><div>-; OZ-NEXT:    [[CMP2:%.*]] = icmp eq i32 [[TMP0]], 7<br></div><div>-; OZ-NEXT:    br i1 [[CMP2]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br></div><div>+; OZ-NEXT:    [[CONV2:%.*]] = and i32 [[E_COERCE:%.*]], 255<br></div><div>+; OZ-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[CONV2]], 7<br></div><div>+; OZ-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br></div><div>; OZ:       if.then:<br></div><div>; OZ-NEXT:    tail call void (...) @foo()<br></div><div>; OZ-NEXT:    br label [[IF_END]]<br></div><div>; OZ:       if.end:<br></div><div>-; OZ-NEXT:    [[TMP1:%.*]] = load i32, ptr @c, align 4<br></div><div>-; OZ-NEXT:    ret i32 [[TMP1]]<br></div><div>+; OZ-NEXT:    [[TMP0:%.*]] = load i32, ptr @c, align 4<br></div><div>+; OZ-NEXT:    ret i32 [[TMP0]]<br></div><div>;<br></div><div>entry:<br></div><div>   %e = alloca %struct.a, align 4<br></div><div><br></div><div><br></div><div>        <br></div><div>_______________________________________________<br></div><div>llvm-commits mailing list<br></div><div><a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br></div><div><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br></div><div><br></div></blockquote><div><br></div></body></html>