19d7b3573SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 29d7b3573SYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 39d7b3573SYingwei Zheng 49d7b3573SYingwei Zhengdefine i32 @f(i64 %a3, i64 %numElements) { 59d7b3573SYingwei Zheng; CHECK-LABEL: define i32 @f( 69d7b3573SYingwei Zheng; CHECK-SAME: i64 [[A3:%.*]], i64 [[NUMELEMENTS:%.*]]) { 79d7b3573SYingwei Zheng; CHECK-NEXT: entry: 89d7b3573SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp ule i64 [[NUMELEMENTS]], 1152921504606846975 99d7b3573SYingwei Zheng; CHECK-NEXT: call void @llvm.assume(i1 [[COND]]) 109d7b3573SYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = shl nuw i64 [[NUMELEMENTS]], 4 119d7b3573SYingwei Zheng; CHECK-NEXT: br label [[IF_END:%.*]] 129d7b3573SYingwei Zheng; CHECK: if.end: 139d7b3573SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[A1]], [[A3]] 149d7b3573SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_END_I:%.*]], label [[ABORT:%.*]] 159d7b3573SYingwei Zheng; CHECK: if.end.i: 169d7b3573SYingwei Zheng; CHECK-NEXT: [[CMP2_NOT_I:%.*]] = icmp ult i64 [[A1]], [[A3]] 179d7b3573SYingwei Zheng; CHECK-NEXT: br i1 [[CMP2_NOT_I]], label [[ABORT]], label [[EXIT:%.*]] 189d7b3573SYingwei Zheng; CHECK: abort: 199d7b3573SYingwei Zheng; CHECK-NEXT: ret i32 -1 209d7b3573SYingwei Zheng; CHECK: exit: 219d7b3573SYingwei Zheng; CHECK-NEXT: ret i32 0 229d7b3573SYingwei Zheng; 239d7b3573SYingwei Zhengentry: 249d7b3573SYingwei Zheng %cond = icmp ule i64 %numElements, 1152921504606846975 259d7b3573SYingwei Zheng call void @llvm.assume(i1 %cond) 269d7b3573SYingwei Zheng %a1 = shl nuw i64 %numElements, 4 279d7b3573SYingwei Zheng br label %if.end 289d7b3573SYingwei Zhengif.end: 299d7b3573SYingwei Zheng %cmp = icmp ugt i64 %a1, %a3 309d7b3573SYingwei Zheng br i1 %cmp, label %if.end.i, label %abort 319d7b3573SYingwei Zhengif.end.i: 329d7b3573SYingwei Zheng %cmp2.not.i = icmp ult i64 %a1, %a3 339d7b3573SYingwei Zheng br i1 %cmp2.not.i, label %abort, label %exit 349d7b3573SYingwei Zhengabort: 359d7b3573SYingwei Zheng ret i32 -1 369d7b3573SYingwei Zhengexit: 379d7b3573SYingwei Zheng ret i32 0 389d7b3573SYingwei Zheng} 399d7b3573SYingwei Zheng 409d7b3573SYingwei Zhengdeclare void @llvm.assume(i1) 41*45ff2874SFlorian Hahn 42*45ff2874SFlorian Hahndefine i1 @negate_overflow_add_1(i64 %x) { 43*45ff2874SFlorian Hahn; CHECK-LABEL: define i1 @negate_overflow_add_1( 44*45ff2874SFlorian Hahn; CHECK-SAME: i64 [[X:%.*]]) { 45*45ff2874SFlorian Hahn; CHECK-NEXT: entry: 46*45ff2874SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i64 [[X]], -9223372036854775807 47*45ff2874SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp slt i64 0, [[SUB]] 48*45ff2874SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 49*45ff2874SFlorian Hahn; 50*45ff2874SFlorian Hahnentry: 51*45ff2874SFlorian Hahn %sub = add nsw i64 %x, -9223372036854775807 52*45ff2874SFlorian Hahn %c = icmp slt i64 0, %sub 53*45ff2874SFlorian Hahn ret i1 %c 54*45ff2874SFlorian Hahn} 55