186 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @use(i1)5 6define void @loop_iv_cond_variable_bound(i32 %n) {7; CHECK-LABEL: @loop_iv_cond_variable_bound(8; CHECK-NEXT: entry:9; CHECK-NEXT: br label [[LOOP:%.*]]10; CHECK: loop:11; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]12; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], [[N:%.*]]13; CHECK-NEXT: call void @use(i1 [[T_1]])14; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 015; CHECK-NEXT: call void @use(i1 [[T_2]])16; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -117; CHECK-NEXT: call void @use(i1 [[T_3]])18; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], [[N]]19; CHECK-NEXT: call void @use(i1 [[C_1]])20; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 121; CHECK-NEXT: call void @use(i1 [[C_2]])22; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV]], [[N]]23; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 124; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]25; CHECK: exit:26; CHECK-NEXT: ret void27;28entry:29 br label %loop30 31loop:32 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]33 %t.1 = icmp ule i32 %iv, %n34 call void @use(i1 %t.1)35 %t.2 = icmp sge i32 %iv, 036 call void @use(i1 %t.2)37 %t.3 = icmp sge i32 %iv, -138 call void @use(i1 %t.3)39 40 %c.1 = icmp ult i32 %iv, %n41 call void @use(i1 %c.1)42 %c.2 = icmp ugt i32 %iv, 143 call void @use(i1 %c.2)44 45 %cmp = icmp ult i32 %iv, %n46 %iv.next = add nuw nsw i32 %iv, 147 br i1 %cmp, label %loop, label %exit48 49exit:50 ret void51}52 53define void @loop_iv_cond_constant_bound() {54; CHECK-LABEL: @loop_iv_cond_constant_bound(55; CHECK-NEXT: entry:56; CHECK-NEXT: br label [[LOOP:%.*]]57; CHECK: loop:58; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]59; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], 260; CHECK-NEXT: call void @use(i1 [[T_1]])61; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 062; CHECK-NEXT: call void @use(i1 [[T_2]])63; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -164; CHECK-NEXT: call void @use(i1 [[T_3]])65; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], 266; CHECK-NEXT: call void @use(i1 [[C_1]])67; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 168; CHECK-NEXT: call void @use(i1 [[C_2]])69; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV]], 270; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 171; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]72; CHECK: exit:73; CHECK-NEXT: ret void74;75entry:76 br label %loop77 78loop:79 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]80 %t.1 = icmp ule i32 %iv, 281 call void @use(i1 %t.1)82 %t.2 = icmp sge i32 %iv, 083 call void @use(i1 %t.2)84 %t.3 = icmp sge i32 %iv, -185 call void @use(i1 %t.3)86 87 %c.1 = icmp ult i32 %iv, 288 call void @use(i1 %c.1)89 %c.2 = icmp ugt i32 %iv, 190 call void @use(i1 %c.2)91 92 %cmp = icmp ult i32 %iv, 293 %iv.next = add nuw nsw i32 %iv, 194 br i1 %cmp, label %loop, label %exit95 96exit:97 ret void98}99 100declare void @clobber()101 102define void @eq_exit_check_constant_int() {103; CHECK-LABEL: @eq_exit_check_constant_int(104; CHECK-NEXT: entry:105; CHECK-NEXT: br label [[LOOP:%.*]]106; CHECK: loop:107; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]108; CHECK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1109; CHECK-NEXT: call void @clobber()110; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[IV]], 2111; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[LOOP]]112; CHECK: exit:113; CHECK-NEXT: ret void114;115entry:116 br label %loop117 118loop:119 %iv = phi i64 [ 1, %entry], [ %iv.next, %loop ]120 %iv.next = add nuw i64 %iv, 1121 call void @clobber()122 %c = icmp eq i64 %iv, 2123 br i1 %c, label %exit, label %loop124 125exit:126 ret void127}128 129define void @eq_exit_check_variable(i64 %N) {130; CHECK-LABEL: @eq_exit_check_variable(131; CHECK-NEXT: entry:132; CHECK-NEXT: [[PRECOND:%.*]] = icmp eq i64 [[N:%.*]], 0133; CHECK-NEXT: br i1 [[PRECOND]], label [[EXIT:%.*]], label [[LOOP:%.*]]134; CHECK: loop:135; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]136; CHECK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1137; CHECK-NEXT: call void @clobber()138; CHECK-NEXT: [[EXITCOND86_NOT_I_I:%.*]] = icmp eq i64 [[IV]], [[N]]139; CHECK-NEXT: br i1 [[EXITCOND86_NOT_I_I]], label [[EXIT]], label [[LOOP]]140; CHECK: exit:141; CHECK-NEXT: ret void142;143entry:144 %precond = icmp eq i64 %N, 0145 br i1 %precond, label %exit, label %loop146 147loop:148 %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]149 %iv.next = add nuw i64 %iv, 1150 call void @clobber()151 %exitcond86.not.i.i = icmp eq i64 %iv, %N152 br i1 %exitcond86.not.i.i, label %exit, label %loop153 154exit:155 ret void156}157 158define void @eq_exit_check_constant_ptr(ptr %start) {159; CHECK-LABEL: @eq_exit_check_constant_ptr(160; CHECK-NEXT: entry:161; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i8 2162; CHECK-NEXT: br label [[LOOP:%.*]]163; CHECK: loop:164; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[START]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]165; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i8 1166; CHECK-NEXT: call void @clobber()167; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[IV]], [[UPPER]]168; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[LOOP]]169; CHECK: exit:170; CHECK-NEXT: ret void171;172entry:173 %upper = getelementptr inbounds i8, ptr %start, i8 2174 br label %loop175 176loop:177 %iv = phi ptr [ %start, %entry], [ %iv.next, %loop ]178 %iv.next = getelementptr inbounds i8, ptr %iv, i8 1179 call void @clobber()180 %c = icmp eq ptr %iv, %upper181 br i1 %c, label %exit, label %loop182 183exit:184 ret void185}186