forked from OSchip/llvm-project
Revert "[CVP] Simplify non-overflowing saturating add/sub"
This reverts commit 1e692d1777
.
Causes assertion failure in builtins-wasm.c clang test.
llvm-svn: 362254
This commit is contained in:
parent
51e0de6954
commit
ccb63e0bfe
|
@ -63,8 +63,6 @@ STATISTIC(NumUDivs, "Number of udivs whose width was decreased");
|
|||
STATISTIC(NumAShrs, "Number of ashr converted to lshr");
|
||||
STATISTIC(NumSRems, "Number of srem converted to urem");
|
||||
STATISTIC(NumOverflows, "Number of overflow checks removed");
|
||||
STATISTIC(NumSaturating,
|
||||
"Number of saturating arithmetics converted to normal arithmetics");
|
||||
|
||||
static cl::opt<bool> DontAddNoWrapFlags("cvp-dont-add-nowrap-flags", cl::init(true));
|
||||
|
||||
|
@ -415,7 +413,7 @@ static void processOverflowIntrinsic(WithOverflowInst *WO) {
|
|||
IRBuilder<> B(WO);
|
||||
Value *NewOp = B.CreateBinOp(
|
||||
WO->getBinaryOp(), WO->getLHS(), WO->getRHS(), WO->getName());
|
||||
// Constant-folding could have happened.
|
||||
// Constant-holing could have happened.
|
||||
if (auto *Inst = dyn_cast<Instruction>(NewOp)) {
|
||||
if (WO->isSigned())
|
||||
Inst->setHasNoSignedWrap();
|
||||
|
@ -430,20 +428,6 @@ static void processOverflowIntrinsic(WithOverflowInst *WO) {
|
|||
++NumOverflows;
|
||||
}
|
||||
|
||||
static void processSaturatingInst(SaturatingInst *SI) {
|
||||
BinaryOperator *BinOp = BinaryOperator::Create(
|
||||
SI->getBinaryOp(), SI->getLHS(), SI->getRHS(), SI->getName(), SI);
|
||||
BinOp->setDebugLoc(SI->getDebugLoc());
|
||||
if (SI->isSigned())
|
||||
BinOp->setHasNoSignedWrap();
|
||||
else
|
||||
BinOp->setHasNoUnsignedWrap();
|
||||
|
||||
SI->replaceAllUsesWith(BinOp);
|
||||
SI->eraseFromParent();
|
||||
++NumSaturating;
|
||||
}
|
||||
|
||||
/// Infer nonnull attributes for the arguments at the specified callsite.
|
||||
static bool processCallSite(CallSite CS, LazyValueInfo *LVI) {
|
||||
SmallVector<unsigned, 4> ArgNos;
|
||||
|
@ -456,13 +440,6 @@ static bool processCallSite(CallSite CS, LazyValueInfo *LVI) {
|
|||
}
|
||||
}
|
||||
|
||||
if (auto *SI = dyn_cast<SaturatingInst>(CS.getInstruction())) {
|
||||
if (willNotOverflow(SI, LVI)) {
|
||||
processSaturatingInst(SI);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Deopt bundle operands are intended to capture state with minimal
|
||||
// perturbance of the code otherwise. If we can find a constant value for
|
||||
// any such operand and remove a use of the original value, that's
|
||||
|
|
|
@ -739,8 +739,8 @@ define i8 @uadd_sat_no_overflow(i8 %x) {
|
|||
; CHECK-NEXT: call void @llvm.trap()
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: cont:
|
||||
; CHECK-NEXT: [[RES1:%.*]] = add nuw i8 [[X]], 100
|
||||
; CHECK-NEXT: ret i8 [[RES1]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X]], i8 100)
|
||||
; CHECK-NEXT: ret i8 [[RES]]
|
||||
;
|
||||
%cmp = icmp ugt i8 %x, 100
|
||||
br i1 %cmp, label %trap, label %cont
|
||||
|
@ -762,8 +762,8 @@ define i8 @sadd_sat_no_overflow(i8 %x) {
|
|||
; CHECK-NEXT: call void @llvm.trap()
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: cont:
|
||||
; CHECK-NEXT: [[RES1:%.*]] = add nsw i8 [[X]], 20
|
||||
; CHECK-NEXT: ret i8 [[RES1]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X]], i8 20)
|
||||
; CHECK-NEXT: ret i8 [[RES]]
|
||||
;
|
||||
%cmp = icmp sgt i8 %x, 100
|
||||
br i1 %cmp, label %trap, label %cont
|
||||
|
@ -785,8 +785,8 @@ define i8 @usub_sat_no_overflow(i8 %x) {
|
|||
; CHECK-NEXT: call void @llvm.trap()
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: cont:
|
||||
; CHECK-NEXT: [[RES1:%.*]] = sub nuw i8 [[X]], 100
|
||||
; CHECK-NEXT: ret i8 [[RES1]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X]], i8 100)
|
||||
; CHECK-NEXT: ret i8 [[RES]]
|
||||
;
|
||||
%cmp = icmp ult i8 %x, 100
|
||||
br i1 %cmp, label %trap, label %cont
|
||||
|
@ -808,8 +808,8 @@ define i8 @ssub_sat_no_overflow(i8 %x) {
|
|||
; CHECK-NEXT: call void @llvm.trap()
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: cont:
|
||||
; CHECK-NEXT: [[RES1:%.*]] = sub nsw i8 [[X]], 20
|
||||
; CHECK-NEXT: ret i8 [[RES1]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X]], i8 20)
|
||||
; CHECK-NEXT: ret i8 [[RES]]
|
||||
;
|
||||
%cmp = icmp slt i8 %x, -100
|
||||
br i1 %cmp, label %trap, label %cont
|
||||
|
|
Loading…
Reference in New Issue