; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=ipsccp -S | FileCheck %s declare void @use(i1) declare void @llvm.assume(i1) define void @basic(i32 %v) { ; CHECK-LABEL: @basic( ; CHECK-NEXT: [[A1:%.*]] = icmp ult i32 [[V:%.*]], 10 ; CHECK-NEXT: call void @llvm.assume(i1 [[A1]]) ; CHECK-NEXT: [[A2:%.*]] = icmp ugt i32 [[V]], 5 ; CHECK-NEXT: call void @llvm.assume(i1 [[A2]]) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9 ; CHECK-NEXT: call void @use(i1 [[C2]]) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8 ; CHECK-NEXT: call void @use(i1 [[C4]]) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[C6:%.*]] = icmp ugt i32 [[V]], 6 ; CHECK-NEXT: call void @use(i1 [[C6]]) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: [[C8:%.*]] = icmp ult i32 [[V]], 7 ; CHECK-NEXT: call void @use(i1 [[C8]]) ; CHECK-NEXT: ret void ; %a1 = icmp ult i32 %v, 10 call void @llvm.assume(i1 %a1) %a2 = icmp ugt i32 %v, 5 call void @llvm.assume(i1 %a2) %c1 = icmp ult i32 %v, 10 call void @use(i1 %c1) %c2 = icmp ult i32 %v, 9 call void @use(i1 %c2) %c3 = icmp ugt i32 %v, 9 call void @use(i1 %c3) %c4 = icmp ugt i32 %v, 8 call void @use(i1 %c4) %c5 = icmp ugt i32 %v, 5 call void @use(i1 %c5) %c6 = icmp ugt i32 %v, 6 call void @use(i1 %c6) %c7 = icmp ult i32 %v, 6 call void @use(i1 %c7) %c8 = icmp ult i32 %v, 7 call void @use(i1 %c8) ret void } define void @nonnull(ptr %v) { ; CHECK-LABEL: @nonnull( ; CHECK-NEXT: [[A:%.*]] = icmp ne ptr [[V:%.*]], null ; CHECK-NEXT: call void @llvm.assume(i1 [[A]]) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; %a = icmp ne ptr %v, null call void @llvm.assume(i1 %a) %c1 = icmp eq ptr %v, null call void @use(i1 %c1) %c2 = icmp ne ptr %v, null call void @use(i1 %c2) %c3 = icmp eq ptr null, %v call void @use(i1 %c3) %c4 = icmp ne ptr null, %v call void @use(i1 %c4) ret void } define void @trunc_nuw(i8 %v) { ; CHECK-LABEL: @trunc_nuw( ; CHECK-NEXT: [[A:%.*]] = trunc nuw i8 [[V:%.*]] to i1 ; CHECK-NEXT: call void @llvm.assume(i1 [[A]]) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: call void @use(i1 false) ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; %a = trunc nuw i8 %v to i1 call void @llvm.assume(i1 %a) %c1 = icmp eq i8 %v, 0 call void @use(i1 %c1) %c2 = icmp ne i8 %v, 0 call void @use(i1 %c2) %c3 = icmp eq i8 0, %v call void @use(i1 %c3) %c4 = icmp ne i8 0, %v call void @use(i1 %c4) ret void } define void @neg_trunc(i8 %v) { ; CHECK-LABEL: @neg_trunc( ; CHECK-NEXT: [[A:%.*]] = trunc i8 [[V:%.*]] to i1 ; CHECK-NEXT: call void @llvm.assume(i1 [[A]]) ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V]], 0 ; CHECK-NEXT: call void @use(i1 [[C1]]) ; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V]], 0 ; CHECK-NEXT: call void @use(i1 [[C2]]) ; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 0, [[V]] ; CHECK-NEXT: call void @use(i1 [[C3]]) ; CHECK-NEXT: [[C4:%.*]] = icmp ne i8 0, [[V]] ; CHECK-NEXT: call void @use(i1 [[C4]]) ; CHECK-NEXT: ret void ; %a = trunc i8 %v to i1 call void @llvm.assume(i1 %a) %c1 = icmp eq i8 %v, 0 call void @use(i1 %c1) %c2 = icmp ne i8 %v, 0 call void @use(i1 %c2) %c3 = icmp eq i8 0, %v call void @use(i1 %c3) %c4 = icmp ne i8 0, %v call void @use(i1 %c4) ret void }