[llvm] r239141 - [InstCombine] Rephrase fix to SimplifyWithOpReplaced
David Majnemer
david.majnemer at gmail.com
Fri Jun 5 02:57:58 PDT 2015
Author: majnemer
Date: Fri Jun 5 04:57:57 2015
New Revision: 239141
URL: http://llvm.org/viewvc/llvm-project?rev=239141&view=rev
Log:
[InstCombine] Rephrase fix to SimplifyWithOpReplaced
I don't have the IR which is causing the build bot breakage but I can
postulate as to why they are timing out:
1. SimplifyWithOpReplaced was stripping flags from the simplified value.
2. visitSelectInstWithICmp was overriding SimplifyWithOpReplaced because
it's simplification wasn't correct.
3. InstCombine would revisit the add instruction and note that it can
rederive the flags.
4. By modifying the value, we chose to revisit instructions which reuse
the value. One of the instructions is the original select, causing
LLVM to never reach fixpoint.
Instead, strip the flags only when we are sure we are going to perform
the simplification.
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/trunk/test/Transforms/InstCombine/select.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=239141&r1=239140&r2=239141&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Fri Jun 5 04:57:57 2015
@@ -598,6 +598,24 @@ Instruction *InstCombiner::visitSelectIn
}
}
+ // Consider:
+ // %cmp = icmp eq i32 %x, 2147483647
+ // %add = add nsw i32 %x, 1
+ // %sel = select i1 %cmp, i32 -2147483648, i32 %add
+ //
+ // We can't replace %sel with %add unless we strip away the flags.
+ auto StripBinOpFlags = [](Value *V) {
+ if (auto *B = dyn_cast<BinaryOperator>(V)) {
+ if (isa<OverflowingBinaryOperator>(B)) {
+ B->setHasNoSignedWrap(false);
+ B->setHasNoUnsignedWrap(false);
+ }
+ if (isa<PossiblyExactOperator>(B))
+ B->setIsExact(false);
+ }
+ return V;
+ };
+
// If we have an equality comparison then we know the value in one of the
// arms of the select. See if substituting this value into the arm and
// simplifying the result yields the same value as the other arm.
@@ -606,23 +624,23 @@ Instruction *InstCombiner::visitSelectIn
TrueVal ||
SimplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, TLI, DL, DT, AC) ==
TrueVal)
- return ReplaceInstUsesWith(SI, FalseVal);
+ return ReplaceInstUsesWith(SI, StripBinOpFlags(FalseVal));
if (SimplifyWithOpReplaced(TrueVal, CmpLHS, CmpRHS, TLI, DL, DT, AC) ==
FalseVal ||
SimplifyWithOpReplaced(TrueVal, CmpRHS, CmpLHS, TLI, DL, DT, AC) ==
FalseVal)
- return ReplaceInstUsesWith(SI, FalseVal);
+ return ReplaceInstUsesWith(SI, StripBinOpFlags(FalseVal));
} else if (Pred == ICmpInst::ICMP_NE) {
if (SimplifyWithOpReplaced(TrueVal, CmpLHS, CmpRHS, TLI, DL, DT, AC) ==
FalseVal ||
SimplifyWithOpReplaced(TrueVal, CmpRHS, CmpLHS, TLI, DL, DT, AC) ==
FalseVal)
- return ReplaceInstUsesWith(SI, TrueVal);
+ return ReplaceInstUsesWith(SI, StripBinOpFlags(TrueVal));
if (SimplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, TLI, DL, DT, AC) ==
TrueVal ||
SimplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, TLI, DL, DT, AC) ==
TrueVal)
- return ReplaceInstUsesWith(SI, TrueVal);
+ return ReplaceInstUsesWith(SI, StripBinOpFlags(TrueVal));
}
// NOTE: if we wanted to, this is where to detect integer MIN/MAX
Modified: llvm/trunk/test/Transforms/InstCombine/select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/select.ll?rev=239141&r1=239140&r2=239141&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/select.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/select.ll Fri Jun 5 04:57:57 2015
@@ -1532,3 +1532,13 @@ define i32 @test_max_of_min(i32 %a) {
%s1 = select i1 %c1, i32 %s0, i32 -1
ret i32 %s1
}
+
+define i32 @PR23757(i32 %x) {
+; CHECK-LABEL: @PR23757
+; CHECK: %[[add:.*]] = add i32 %x, 1
+; CHECK-NEXT: ret i32 %[[add]]
+ %cmp = icmp eq i32 %x, 2147483647
+ %add = add nsw i32 %x, 1
+ %sel = select i1 %cmp, i32 -2147483648, i32 %add
+ ret i32 %sel
+}
More information about the llvm-commits
mailing list