From 15032581573db3c995ad53600cf6bcc6f6eb4ee0 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 22 May 2015 03:56:46 +0000 Subject: [InstSimplify] Handle some overflow intrinsics in InstSimplify This change does a few things: - Move some InstCombine transforms to InstSimplify - Run SimplifyCall from within InstCombine::visitCallInst - Teach InstSimplify to fold [us]mul_with_overflow(X, undef) to 0. llvm-svn: 237995 --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 6 ++++++ llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 12 ------------ 2 files changed, 6 insertions(+), 12 deletions(-) (limited to 'llvm/lib/Transforms/InstCombine') diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 3b925eda16b..e83b9dd36ae 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -13,6 +13,7 @@ #include "InstCombineInternal.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Dominators.h" @@ -323,6 +324,11 @@ static Value *SimplifyX86vperm2(const IntrinsicInst &II, /// the heavy lifting. /// Instruction *InstCombiner::visitCallInst(CallInst &CI) { + auto Args = CI.arg_operands(); + if (Value *V = SimplifyCall(CI.getCalledValue(), Args.begin(), Args.end(), DL, + TLI, DT, AC)) + return ReplaceInstUsesWith(CI, V); + if (isFreeCall(&CI, TLI)) return visitFree(CI); diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 09ab16511e7..2dafa58d305 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2139,10 +2139,6 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS, } // FALL THROUGH uadd into sadd case OCF_SIGNED_ADD: { - // X + undef -> undef - if (isa(RHS)) - return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false); - // X + 0 -> {X, false} if (match(RHS, m_Zero())) return SetResult(LHS, Builder->getFalse(), false); @@ -2157,14 +2153,6 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS, case OCF_UNSIGNED_SUB: case OCF_SIGNED_SUB: { - // undef - X -> undef - if (isa(LHS)) - return SetResult(LHS, UndefValue::get(Builder->getInt1Ty()), false); - - // X - undef -> undef - if (isa(RHS)) - return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false); - // X - 0 -> {X, false} if (match(RHS, m_Zero())) return SetResult(LHS, Builder->getFalse(), false); -- cgit v1.2.3