brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 17aa4d5 Raw
289 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6 7declare void @use(i8)8declare void @use.i1(i1)9declare void @llvm.assume(i1)10declare i1 @cond()11 12define void @test_iv_wraps_1(i8 %len.n, i8 %a) {13; CHECK-LABEL: @test_iv_wraps_1(14; CHECK-NEXT:  loop.ph:15; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]16; CHECK:       loop.header:17; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ -1, [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]18; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], 119; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[LOOP_LATCH]]20; CHECK:       loop.latch:21; CHECK-NEXT:    [[T_1:%.*]] = icmp uge i8 [[IV]], -122; CHECK-NEXT:    call void @use.i1(i1 [[T_1]])23; CHECK-NEXT:    [[IV_NEXT]] = add i8 [[IV]], 124; CHECK-NEXT:    br label [[LOOP_HEADER]]25; CHECK:       exit:26; CHECK-NEXT:    ret void27;28loop.ph:29  br label %loop.header30 31loop.header:32  %iv = phi i8 [ 255, %loop.ph ], [ %iv.next, %loop.latch ]33  %c = icmp eq i8 %iv, 134  br i1 %c, label %exit, label %loop.latch35 36loop.latch:37  %t.1 = icmp uge i8 %iv, 25538  call void @use.i1(i1 %t.1)39  %iv.next = add i8 %iv, 140  br label %loop.header41 42exit:43  ret void44}45 46define void @test_iv_nuw_nsw_1_uge_start(i8 %len.n, i8 %a) {47; CHECK-LABEL: @test_iv_nuw_nsw_1_uge_start(48; CHECK-NEXT:  loop.ph:49; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]50; CHECK:       loop.header:51; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ -1, [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]52; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], 153; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]54; CHECK:       for.body:55; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()56; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]57; CHECK:       loop.latch:58; CHECK-NEXT:    call void @use.i1(i1 true)59; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 160; CHECK-NEXT:    br label [[LOOP_HEADER]]61; CHECK:       exit:62; CHECK-NEXT:    ret void63;64loop.ph:65  br label %loop.header66 67loop.header:68  %iv = phi i8 [ 255, %loop.ph ], [ %iv.next, %loop.latch ]69  %c = icmp eq i8 %iv, 170  br i1 %c, label %exit, label %for.body71 72for.body:73  %c.2 = call i1 @cond()74  br i1 %c.2, label %loop.latch, label %exit75 76loop.latch:77  %t.1 = icmp uge i8 %iv, 25578  call void @use.i1(i1 %t.1)79  %iv.next = add nsw nuw i8 %iv, 180  br label %loop.header81 82exit:83  ret void84}85 86define void @test_iv_nuw_nsw_2_uge_start(i8 %len.n, i8 %a) {87; CHECK-LABEL: @test_iv_nuw_nsw_2_uge_start(88; CHECK-NEXT:  loop.ph:89; CHECK-NEXT:    [[START:%.*]] = add i8 -2, 190; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]91; CHECK:       loop.header:92; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ [[START]], [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]93; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], 194; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]95; CHECK:       for.body:96; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()97; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]98; CHECK:       loop.latch:99; CHECK-NEXT:    call void @use.i1(i1 true)100; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1101; CHECK-NEXT:    br label [[LOOP_HEADER]]102; CHECK:       exit:103; CHECK-NEXT:    ret void104;105loop.ph:106  %start = add i8 254, 1107  br label %loop.header108 109loop.header:110  %iv = phi i8 [ %start, %loop.ph ], [ %iv.next, %loop.latch ]111  %c = icmp eq i8 %iv, 1112  br i1 %c, label %exit, label %for.body113 114for.body:115  %c.2 = call i1 @cond()116  br i1 %c.2, label %loop.latch, label %exit117 118loop.latch:119  %t.1 = icmp uge i8 %iv, 255120  call void @use.i1(i1 %t.1)121  %iv.next = add nsw nuw i8 %iv, 1122  br label %loop.header123 124exit:125  ret void126}127 128define void @test_iv_nsw_nuw_1_ult_end(i8 %len.n, i8 %a) {129; CHECK-LABEL: @test_iv_nsw_nuw_1_ult_end(130; CHECK-NEXT:  loop.ph:131; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]132; CHECK:       loop.header:133; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ -2, [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]134; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], 1135; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]136; CHECK:       for.body:137; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()138; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]139; CHECK:       loop.latch:140; CHECK-NEXT:    call void @use.i1(i1 false)141; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1142; CHECK-NEXT:    br label [[LOOP_HEADER]]143; CHECK:       exit:144; CHECK-NEXT:    ret void145;146loop.ph:147  br label %loop.header148 149loop.header:150  %iv = phi i8 [ 254, %loop.ph ], [ %iv.next, %loop.latch ]151  %c = icmp eq i8 %iv, 1152  br i1 %c, label %exit, label %for.body153 154for.body:155  %c.2 = call i1 @cond()156  br i1 %c.2, label %loop.latch, label %exit157 158loop.latch:159  %t.1 = icmp ult i8 %iv, 1160  call void @use.i1(i1 %t.1)161  %iv.next = add nsw nuw i8 %iv, 1162  br label %loop.header163 164exit:165  ret void166}167 168 169define void @test_iv_nsw_nuw_2_ult_end(i8 %len.n, i8 %a, i8 %b) {170; CHECK-LABEL: @test_iv_nsw_nuw_2_ult_end(171; CHECK-NEXT:  loop.ph:172; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]173; CHECK:       loop.header:174; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ [[A:%.*]], [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]175; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], [[B:%.*]]176; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]177; CHECK:       for.body:178; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()179; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]180; CHECK:       loop.latch:181; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[IV]], [[B]]182; CHECK-NEXT:    call void @use.i1(i1 [[T_1]])183; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1184; CHECK-NEXT:    br label [[LOOP_HEADER]]185; CHECK:       exit:186; CHECK-NEXT:    ret void187;188loop.ph:189  br label %loop.header190 191loop.header:192  %iv = phi i8 [ %a, %loop.ph ], [ %iv.next, %loop.latch ]193  %c = icmp eq i8 %iv, %b194  br i1 %c, label %exit, label %for.body195 196for.body:197  %c.2 = call i1 @cond()198  br i1 %c.2, label %loop.latch, label %exit199 200loop.latch:201  %t.1 = icmp ult i8 %iv, %b202  call void @use.i1(i1 %t.1)203  %iv.next = add nsw nuw i8 %iv, 1204  br label %loop.header205 206exit:207  ret void208}209 210define void @test_iv_nsw_nuw_3_ult_start_var(i8 %len.n, i8 %a, i8 %b) {211; CHECK-LABEL: @test_iv_nsw_nuw_3_ult_start_var(212; CHECK-NEXT:  loop.ph:213; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]214; CHECK:       loop.header:215; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ [[A:%.*]], [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]216; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], [[B:%.*]]217; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]218; CHECK:       for.body:219; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()220; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]221; CHECK:       loop.latch:222; CHECK-NEXT:    call void @use.i1(i1 false)223; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1224; CHECK-NEXT:    br label [[LOOP_HEADER]]225; CHECK:       exit:226; CHECK-NEXT:    ret void227;228loop.ph:229  br label %loop.header230 231loop.header:232  %iv = phi i8 [ %a, %loop.ph ], [ %iv.next, %loop.latch ]233  %c = icmp eq i8 %iv, %b234  br i1 %c, label %exit, label %for.body235 236for.body:237  %c.2 = call i1 @cond()238  br i1 %c.2, label %loop.latch, label %exit239 240loop.latch:241  %t.1 = icmp ult i8 %iv, %a242  call void @use.i1(i1 %t.1)243  %iv.next = add nsw nuw i8 %iv, 1244  br label %loop.header245 246exit:247  ret void248}249 250define void @test_iv_nsw_nuw_inc_2_ult_start_var(i8 %len.n, i8 %a, i8 %b) {251; CHECK-LABEL: @test_iv_nsw_nuw_inc_2_ult_start_var(252; CHECK-NEXT:  loop.ph:253; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]254; CHECK:       loop.header:255; CHECK-NEXT:    [[IV:%.*]] = phi i8 [ [[A:%.*]], [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]256; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[IV]], [[B:%.*]]257; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]258; CHECK:       for.body:259; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()260; CHECK-NEXT:    br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]261; CHECK:       loop.latch:262; CHECK-NEXT:    call void @use.i1(i1 false)263; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i8 [[IV]], 2264; CHECK-NEXT:    br label [[LOOP_HEADER]]265; CHECK:       exit:266; CHECK-NEXT:    ret void267;268loop.ph:269  br label %loop.header270 271loop.header:272  %iv = phi i8 [ %a, %loop.ph ], [ %iv.next, %loop.latch ]273  %c = icmp eq i8 %iv, %b274  br i1 %c, label %exit, label %for.body275 276for.body:277  %c.2 = call i1 @cond()278  br i1 %c.2, label %loop.latch, label %exit279 280loop.latch:281  %t.1 = icmp ult i8 %iv, %a282  call void @use.i1(i1 %t.1)283  %iv.next = add nsw nuw i8 %iv, 2284  br label %loop.header285 286exit:287  ret void288}289