diff --git a/llvm/test/Transforms/ConstraintElimination/constraint-overflow.ll b/llvm/test/Transforms/ConstraintElimination/constraint-overflow.ll new file mode 100644 index 0000000000000..88f87f4afab28 --- /dev/null +++ b/llvm/test/Transforms/ConstraintElimination/constraint-overflow.ll @@ -0,0 +1,40 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 +; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s + +define i32 @f(i64 %a3, i64 %numElements) { +; CHECK-LABEL: define i32 @f( +; CHECK-SAME: i64 [[A3:%.*]], i64 [[NUMELEMENTS:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[COND:%.*]] = icmp ule i64 [[NUMELEMENTS]], 1152921504606846975 +; CHECK-NEXT: call void @llvm.assume(i1 [[COND]]) +; CHECK-NEXT: [[A1:%.*]] = shl nuw i64 [[NUMELEMENTS]], 4 +; CHECK-NEXT: br label [[IF_END:%.*]] +; CHECK: if.end: +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[A1]], [[A3]] +; CHECK-NEXT: br i1 [[CMP]], label [[IF_END_I:%.*]], label [[ABORT:%.*]] +; CHECK: if.end.i: +; CHECK-NEXT: [[CMP2_NOT_I:%.*]] = icmp ult i64 [[A1]], [[A3]] +; CHECK-NEXT: br i1 [[CMP2_NOT_I]], label [[ABORT]], label [[EXIT:%.*]] +; CHECK: abort: +; CHECK-NEXT: ret i32 -1 +; CHECK: exit: +; CHECK-NEXT: ret i32 0 +; +entry: + %cond = icmp ule i64 %numElements, 1152921504606846975 + call void @llvm.assume(i1 %cond) + %a1 = shl nuw i64 %numElements, 4 + br label %if.end +if.end: + %cmp = icmp ugt i64 %a1, %a3 + br i1 %cmp, label %if.end.i, label %abort +if.end.i: + %cmp2.not.i = icmp ult i64 %a1, %a3 + br i1 %cmp2.not.i, label %abort, label %exit +abort: + ret i32 -1 +exit: + ret i32 0 +} + +declare void @llvm.assume(i1)