From 162f046004b302fd1aa2d3c27df43ee163c4c6b6 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Tue, 11 Aug 2015 21:33:55 +0000 Subject: [PATCH] Fix PR24354. `InstCombiner::OptimizeOverflowCheck` was asserting an invariant (operands to binary operations are ordered by decreasing complexity) that wasn't really an invariant. Fix this by instead having `InstCombiner::OptimizeOverflowCheck` establish the invariant if it does not hold. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244676 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 ++-- test/Transforms/InstCombine/pr24354.ll | 33 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 test/Transforms/InstCombine/pr24354.ll diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index 0bd6fd2f226..95bba3c7af7 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2112,9 +2112,8 @@ static Instruction *ProcessUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS, Value *RHS, Instruction &OrigI, Value *&Result, Constant *&Overflow) { - assert((!OrigI.isCommutative() || - !(isa(LHS) && !isa(RHS))) && - "call with a constant RHS if possible!"); + if (OrigI.isCommutative() && isa(LHS) && !isa(RHS)) + std::swap(LHS, RHS); auto SetResult = [&](Value *OpResult, Constant *OverflowVal, bool ReuseName) { Result = OpResult; diff --git a/test/Transforms/InstCombine/pr24354.ll b/test/Transforms/InstCombine/pr24354.ll new file mode 100644 index 00000000000..3b36fd1b74e --- /dev/null +++ b/test/Transforms/InstCombine/pr24354.ll @@ -0,0 +1,33 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +; This used to crash opt + +@c = common global i32 0, align 4 +@b = common global i32 0, align 4 +@a = common global i16 0, align 2 +@d = common global i32 0, align 4 + +define void @fn3() { +; CHECK: @fn3 +bb: + %tmp = load i32, i32* @c, align 4 + %tmp1 = icmp eq i32 %tmp, 0 + br i1 %tmp1, label %bb2, label %bb6 + +bb2: ; preds = %bb + %tmp3 = load i32, i32* @b, align 4 + %tmp.i = add nsw i32 255, %tmp3 + %tmp5 = icmp ugt i32 %tmp.i, 254 + br label %bb6 + +bb6: ; preds = %bb, %bb2 + %tmp7 = phi i1 [ true, %bb ], [ %tmp5, %bb2 ] + %tmp8 = zext i1 %tmp7 to i32 + %tmp10 = icmp eq i32 %tmp8, 0 + %tmp12 = load i16, i16* @a, align 2 + %tmp14 = icmp ne i16 %tmp12, 0 + %tmp16 = select i1 %tmp10, i1 false, i1 %tmp14 + %tmp17 = zext i1 %tmp16 to i32 + store i32 %tmp17, i32* @d, align 4 + ret void +} -- 2.11.0