122 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s3 4declare void @use(i1)5declare void @llvm.assume(i1)6 7define void @basic(i32 %v) {8; CHECK-LABEL: @basic(9; CHECK-NEXT: [[A1:%.*]] = icmp ult i32 [[V:%.*]], 1010; CHECK-NEXT: call void @llvm.assume(i1 [[A1]])11; CHECK-NEXT: [[A2:%.*]] = icmp ugt i32 [[V]], 512; CHECK-NEXT: call void @llvm.assume(i1 [[A2]])13; CHECK-NEXT: call void @use(i1 true)14; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 915; CHECK-NEXT: call void @use(i1 [[C2]])16; CHECK-NEXT: call void @use(i1 false)17; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 818; CHECK-NEXT: call void @use(i1 [[C4]])19; CHECK-NEXT: call void @use(i1 true)20; CHECK-NEXT: [[C6:%.*]] = icmp ugt i32 [[V]], 621; CHECK-NEXT: call void @use(i1 [[C6]])22; CHECK-NEXT: call void @use(i1 false)23; CHECK-NEXT: [[C8:%.*]] = icmp ult i32 [[V]], 724; CHECK-NEXT: call void @use(i1 [[C8]])25; CHECK-NEXT: ret void26;27 %a1 = icmp ult i32 %v, 1028 call void @llvm.assume(i1 %a1)29 %a2 = icmp ugt i32 %v, 530 call void @llvm.assume(i1 %a2)31 %c1 = icmp ult i32 %v, 1032 call void @use(i1 %c1)33 %c2 = icmp ult i32 %v, 934 call void @use(i1 %c2)35 %c3 = icmp ugt i32 %v, 936 call void @use(i1 %c3)37 %c4 = icmp ugt i32 %v, 838 call void @use(i1 %c4)39 %c5 = icmp ugt i32 %v, 540 call void @use(i1 %c5)41 %c6 = icmp ugt i32 %v, 642 call void @use(i1 %c6)43 %c7 = icmp ult i32 %v, 644 call void @use(i1 %c7)45 %c8 = icmp ult i32 %v, 746 call void @use(i1 %c8)47 ret void48}49 50define void @nonnull(ptr %v) {51; CHECK-LABEL: @nonnull(52; CHECK-NEXT: [[A:%.*]] = icmp ne ptr [[V:%.*]], null53; CHECK-NEXT: call void @llvm.assume(i1 [[A]])54; CHECK-NEXT: call void @use(i1 false)55; CHECK-NEXT: call void @use(i1 true)56; CHECK-NEXT: call void @use(i1 false)57; CHECK-NEXT: call void @use(i1 true)58; CHECK-NEXT: ret void59;60 %a = icmp ne ptr %v, null61 call void @llvm.assume(i1 %a)62 %c1 = icmp eq ptr %v, null63 call void @use(i1 %c1)64 %c2 = icmp ne ptr %v, null65 call void @use(i1 %c2)66 %c3 = icmp eq ptr null, %v67 call void @use(i1 %c3)68 %c4 = icmp ne ptr null, %v69 call void @use(i1 %c4)70 ret void71}72 73define void @trunc_nuw(i8 %v) {74; CHECK-LABEL: @trunc_nuw(75; CHECK-NEXT: [[A:%.*]] = trunc nuw i8 [[V:%.*]] to i176; CHECK-NEXT: call void @llvm.assume(i1 [[A]])77; CHECK-NEXT: call void @use(i1 false)78; CHECK-NEXT: call void @use(i1 true)79; CHECK-NEXT: call void @use(i1 false)80; CHECK-NEXT: call void @use(i1 true)81; CHECK-NEXT: ret void82;83 %a = trunc nuw i8 %v to i184 call void @llvm.assume(i1 %a)85 %c1 = icmp eq i8 %v, 086 call void @use(i1 %c1)87 %c2 = icmp ne i8 %v, 088 call void @use(i1 %c2)89 %c3 = icmp eq i8 0, %v90 call void @use(i1 %c3)91 %c4 = icmp ne i8 0, %v92 call void @use(i1 %c4)93 ret void94}95 96define void @neg_trunc(i8 %v) {97; CHECK-LABEL: @neg_trunc(98; CHECK-NEXT: [[A:%.*]] = trunc i8 [[V:%.*]] to i199; CHECK-NEXT: call void @llvm.assume(i1 [[A]])100; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V]], 0101; CHECK-NEXT: call void @use(i1 [[C1]])102; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V]], 0103; CHECK-NEXT: call void @use(i1 [[C2]])104; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 0, [[V]]105; CHECK-NEXT: call void @use(i1 [[C3]])106; CHECK-NEXT: [[C4:%.*]] = icmp ne i8 0, [[V]]107; CHECK-NEXT: call void @use(i1 [[C4]])108; CHECK-NEXT: ret void109;110 %a = trunc i8 %v to i1111 call void @llvm.assume(i1 %a)112 %c1 = icmp eq i8 %v, 0113 call void @use(i1 %c1)114 %c2 = icmp ne i8 %v, 0115 call void @use(i1 %c2)116 %c3 = icmp eq i8 0, %v117 call void @use(i1 %c3)118 %c4 = icmp ne i8 0, %v119 call void @use(i1 %c4)120 ret void121}122