; 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)