summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2015-08-28 19:09:31 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2015-08-28 19:09:31 +0000
commit6f5dca70ed1c030957a45ad91bd295921f17b18d (patch)
tree09e596d886fc42b8caa61a48ae6939fd8245c389
parentc0225ca2769de22834afba06b1b8e7f318c0f7b7 (diff)
downloadbcm5719-llvm-6f5dca70ed1c030957a45ad91bd295921f17b18d.tar.gz
bcm5719-llvm-6f5dca70ed1c030957a45ad91bd295921f17b18d.zip
[InstCombine] Fix PR24605.
PR24605 is caused due to an incorrect insert point in instcombine's IR builder. When simplifying %t = add X Y ... %m = icmp ... %t the replacement for %t should be placed before %t, not before %m, as there could be a use of %t between %t and %m. llvm-svn: 246315
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp6
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineInternal.h5
-rw-r--r--llvm/test/Transforms/InstCombine/pr24605.ll15
3 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 905f66a380f..6e4336ef875 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -2140,6 +2140,12 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
return true;
};
+ // If the overflow check was an add followed by a compare, the insertion point
+ // may be pointing to the compare. We want to insert the new instructions
+ // before the add in case there are uses of the add between the add and the
+ // compare.
+ Builder->SetInsertPoint(&OrigI);
+
switch (OCF) {
case OCF_INVALID:
llvm_unreachable("bad overflow check kind!");
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
index ac934f1bd85..9f5cdcbb329 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
@@ -360,6 +360,11 @@ private:
/// \brief Try to optimize a sequence of instructions checking if an operation
/// on LHS and RHS overflows.
///
+ /// If this overflow check is done via one of the overflow check intrinsics,
+ /// then CtxI has to be the call instruction calling that intrinsic. If this
+ /// overflow check is done by arithmetic followed by a compare, then CtxI has
+ /// to be the arithmetic instruction.
+ ///
/// If a simplification is possible, stores the simplified result of the
/// operation in OperationResult and result of the overflow check in
/// OverflowResult, and return true. If no simplification is possible,
diff --git a/llvm/test/Transforms/InstCombine/pr24605.ll b/llvm/test/Transforms/InstCombine/pr24605.ll
new file mode 100644
index 00000000000..4b7b36137e6
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/pr24605.ll
@@ -0,0 +1,15 @@
+; RUN: opt -S -instcombine < %s | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define i1 @f(i8* %a, i8 %b) {
+; CHECK-LABEL: @f(
+entry:
+ %or = or i8 %b, -117
+ %sub = add i8 %or, -1
+ store i8 %sub, i8* %a, align 1
+ %cmp = icmp ugt i8 %or, %sub
+ ret i1 %cmp
+; CHECK: ret i1 true
+}
OpenPOWER on IntegriCloud