1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 ; RUN: opt -S -indvars -verify -loop-rotate -loop-idiom < %s | FileCheck %s 3 target triple = "x86_64-unknown-linux-gnu" 4 5 ; Verify that we invalidate SCEV properly. 6 7 define void @test_01() { 8 ; CHECK-LABEL: @test_01( 9 ; CHECK-NEXT: entry: 10 ; CHECK-NEXT: br label [[LBL1:%.*]] 11 ; CHECK: lbl1: 12 ; CHECK-NEXT: br label [[FOR_COND:%.*]] 13 ; CHECK: for.cond: 14 ; CHECK-NEXT: br i1 false, label [[FOR_BODY3_LR_PH:%.*]], label [[FOR_COND_FOR_END5_CRIT_EDGE:%.*]] 15 ; CHECK: for.body3.lr.ph: 16 ; CHECK-NEXT: br label [[FOR_BODY3:%.*]] 17 ; CHECK: for.cond1: 18 ; CHECK-NEXT: br i1 false, label [[FOR_BODY3]], label [[FOR_COND1_FOR_END5_CRIT_EDGE:%.*]] 19 ; CHECK: for.body3: 20 ; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[FOR_COND1:%.*]] 21 ; CHECK: if.then: 22 ; CHECK-NEXT: br label [[LBL1]] 23 ; CHECK: for.cond.for.end5_crit_edge: 24 ; CHECK-NEXT: br label [[FOR_END5:%.*]] 25 ; CHECK: for.cond1.for.end5_crit_edge: 26 ; CHECK-NEXT: br label [[FOR_END5]] 27 ; CHECK: for.end5: 28 ; CHECK-NEXT: ret void 29 ; 30 entry: 31 br label %lbl1 32 33 lbl1: ; preds = %if.then, %entry 34 br label %for.cond 35 36 for.cond: ; preds = %lbl1 37 br label %for.cond1 38 39 for.cond1: ; preds = %if.end, %for.cond 40 br i1 false, label %for.body3, label %for.end5 41 42 for.body3: ; preds = %for.cond1 43 br i1 false, label %if.then, label %if.end 44 45 if.then: ; preds = %for.body3 46 br label %lbl1 47 48 if.end: ; preds = %for.body3 49 br label %for.cond1 50 51 for.end5: ; preds = %for.cond1 52 ret void 53 } 54 55 define void @test_02() { 56 ; CHECK-LABEL: @test_02( 57 ; CHECK-NEXT: entry: 58 ; CHECK-NEXT: br label [[LBL1:%.*]] 59 ; CHECK: lbl1: 60 ; CHECK-NEXT: br label [[FOR_COND:%.*]] 61 ; CHECK: for.cond: 62 ; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END7:%.*]] 63 ; CHECK: if.then: 64 ; CHECK-NEXT: br i1 false, label [[FOR_BODY_LR_PH:%.*]], label [[IF_THEN_FOR_END6_CRIT_EDGE:%.*]] 65 ; CHECK: for.body.lr.ph: 66 ; CHECK-NEXT: br label [[FOR_BODY:%.*]] 67 ; CHECK: for.body: 68 ; CHECK-NEXT: br i1 false, label [[IF_THEN3:%.*]], label [[IF_END:%.*]] 69 ; CHECK: if.then3: 70 ; CHECK-NEXT: br label [[LBL1]] 71 ; CHECK: if.end: 72 ; CHECK-NEXT: br label [[FOR_COND4:%.*]] 73 ; CHECK: for.cond4: 74 ; CHECK-NEXT: br i1 false, label [[FOR_BODY]], label [[FOR_COND1_FOR_END6_CRIT_EDGE:%.*]] 75 ; CHECK: if.then.for.end6_crit_edge: 76 ; CHECK-NEXT: br label [[FOR_END6:%.*]] 77 ; CHECK: for.cond1.for.end6_crit_edge: 78 ; CHECK-NEXT: br label [[FOR_END6]] 79 ; CHECK: for.end6: 80 ; CHECK-NEXT: ret void 81 ; CHECK: if.end7: 82 ; CHECK-NEXT: unreachable 83 ; 84 entry: 85 br label %lbl1 86 87 lbl1: ; preds = %if.then3, %entry 88 br label %for.cond 89 90 for.cond: ; preds = %lbl1 91 br i1 false, label %if.then, label %if.end7 92 93 if.then: ; preds = %for.cond 94 br label %for.cond1 95 96 for.cond1: ; preds = %for.cond4, %if.then 97 br i1 undef, label %for.body, label %for.end6 98 99 for.body: ; preds = %for.cond1 100 br i1 false, label %if.then3, label %if.end 101 102 if.then3: ; preds = %for.body 103 br label %lbl1 104 105 if.end: ; preds = %for.body 106 br label %for.cond4 107 108 for.cond4: ; preds = %if.end 109 br label %for.cond1 110 111 for.end6: ; preds = %for.cond1 112 ret void 113 114 if.end7: ; preds = %for.cond 115 unreachable 116 } 117