[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
This commit is contained in:
Sanjoy Das 2015-08-28 19:09:31 +00:00
parent c0225ca276
commit 6f5dca70ed
3 changed files with 26 additions and 0 deletions

View File

@ -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!");

View File

@ -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,

View File

@ -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
}