1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt < %s -passes='print<scalar-evolution>,simple-loop-unswitch<nontrivial>' -verify-scev -S | FileCheck %s 3 4; This is a reproducer for https://github.com/llvm/llvm-project/issues/61080 5; 6; Note that the print<scalar-evolution> in the beginning of the pipeline is 7; needed for reproducing the original problem, as we need something that 8; calculate SCEV before the loop unswitch, to verify that we invalidate SCEV 9; correctly while doing the unswitch. 10; 11; Verify that we no longer hit that assert. Also perform checks to show the IR 12; transformation that is going on in this test. 13 14 15define i32 @foo(i1 %not) { 16; CHECK-LABEL: define i32 @foo 17; CHECK-SAME: (i1 [[NOT:%.*]]) { 18; CHECK-NEXT: entry: 19; CHECK-NEXT: [[FALSE:%.*]] = and i1 true, false 20; CHECK-NEXT: br i1 [[NOT]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] 21; CHECK: entry.split.us: 22; CHECK-NEXT: br i1 [[FALSE]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]] 23; CHECK: entry.split.us.split.us: 24; CHECK-NEXT: br label [[FOR_COND_US_US:%.*]] 25; CHECK: for.cond.us.us: 26; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_US_US:%.*]] 27; CHECK: for.cond.split.us.us.us: 28; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 29; CHECK: for.cond.split.us.split.us.split.us.split.us: 30; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 31; CHECK: entry.split.us.split: 32; CHECK-NEXT: br label [[FOR_COND_US:%.*]] 33; CHECK: for.cond.us: 34; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_US:%.*]] 35; CHECK: for.inc11.us: 36; CHECK-NEXT: br label [[FOR_COND_US]] 37; CHECK: for.cond.split.us.us: 38; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US11:%.*]] 39; CHECK: for.cond5.preheader.us.us9: 40; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_US_US10:%.*]] 41; CHECK: for.inc8.us.us: 42; CHECK-NEXT: br i1 false, label [[FOR_INC8_FOR_COND5_PREHEADER_CRIT_EDGE_US_US:%.*]], label [[FOR_INC11_SPLIT_US_US:%.*]] 43; CHECK: for.inc8.for.cond5.preheader_crit_edge.us.us: 44; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US9:%.*]] 45; CHECK: for.end.us.us: 46; CHECK-NEXT: br i1 false, label [[FOR_INC8_US_US:%.*]], label [[CLEANUP15_SPLIT_US_SPLIT_US:%.*]] 47; CHECK: for.cond5.preheader.split.us.us.us10: 48; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US7_US:%.*]] 49; CHECK: for.body7.us.us4.us: 50; CHECK-NEXT: br label [[HANDLER_POINTER_OVERFLOW_US_US5_US:%.*]] 51; CHECK: handler.pointer_overflow.us.us5.us: 52; CHECK-NEXT: br label [[CONT_US_US6_US:%.*]] 53; CHECK: cont.us.us6.us: 54; CHECK-NEXT: br label [[FOR_END_SPLIT_US_US_US:%.*]] 55; CHECK: for.end.split.us.us.us: 56; CHECK-NEXT: br label [[FOR_END_US_US:%.*]] 57; CHECK: for.cond5.preheader.split.us.split.us7.us: 58; CHECK-NEXT: br label [[FOR_BODY7_US_US4_US:%.*]] 59; CHECK: for.inc11.split.us.us: 60; CHECK-NEXT: br label [[FOR_INC11_US:%.*]] 61; CHECK: for.cond.split.us.split.us11: 62; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US9]] 63; CHECK: for.cond.split.us.split.us.split.us: 64; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US:%.*]] 65; CHECK: cleanup15.split.us.split.us: 66; CHECK-NEXT: br label [[CLEANUP15_SPLIT_US:%.*]] 67; CHECK: entry.split: 68; CHECK-NEXT: br i1 [[FALSE]], label [[ENTRY_SPLIT_SPLIT_US:%.*]], label [[ENTRY_SPLIT_SPLIT:%.*]] 69; CHECK: entry.split.split.us: 70; CHECK-NEXT: br label [[FOR_COND_US12:%.*]] 71; CHECK: for.cond.us12: 72; CHECK-NEXT: br label [[FOR_COND_SPLIT_US:%.*]] 73; CHECK: for.cond.split.us: 74; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT_US_SPLIT_US:%.*]] 75; CHECK: for.cond.split.split.us.split.us: 76; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT_US:%.*]] 77; CHECK: entry.split.split: 78; CHECK-NEXT: br label [[FOR_COND:%.*]] 79; CHECK: for.cond: 80; CHECK-NEXT: br label [[FOR_COND_SPLIT:%.*]] 81; CHECK: for.cond.split.us.split.us: 82; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US:%.*]] 83; CHECK: for.cond5.preheader.us.us: 84; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_US_US:%.*]] 85; CHECK: for.cond5.preheader.split.us.us.us: 86; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 87; CHECK: for.cond5.preheader.split.us.split.us.split.us.split.us: 88; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 89; CHECK: cleanup15.split.us: 90; CHECK-NEXT: br label [[CLEANUP15:%.*]] 91; CHECK: for.cond5.preheader.split.us.split.us.split.us: 92; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US:%.*]] 93; CHECK: for.cond.split: 94; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT:%.*]] 95; CHECK: for.cond.split.split.us: 96; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US8:%.*]] 97; CHECK: for.cond5.preheader.us8: 98; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US:%.*]] 99; CHECK: for.cond5.preheader.split.us: 100; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT_US_SPLIT_US:%.*]] 101; CHECK: for.cond5.preheader.split.split.us.split.us: 102; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT_US:%.*]] 103; CHECK: for.cond.split.split: 104; CHECK-NEXT: br label [[FOR_COND5_PREHEADER:%.*]] 105; CHECK: for.cond5.preheader: 106; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT:%.*]] 107; CHECK: for.cond5.preheader.split.us.split.us: 108; CHECK-NEXT: br label [[FOR_BODY7_US_US:%.*]] 109; CHECK: for.body7.us.us: 110; CHECK-NEXT: br label [[HANDLER_POINTER_OVERFLOW_US_US:%.*]] 111; CHECK: handler.pointer_overflow.us.us: 112; CHECK-NEXT: br label [[CONT_US_US:%.*]] 113; CHECK: cont.us.us: 114; CHECK-NEXT: br label [[CONT_FOR_BODY7_CRIT_EDGE_US_US:%.*]] 115; CHECK: cont.for.body7_crit_edge.us.us: 116; CHECK-NEXT: br label [[FOR_BODY7_US_US]] 117; CHECK: for.cond5.preheader.split: 118; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT:%.*]] 119; CHECK: for.cond5.preheader.split.split.us: 120; CHECK-NEXT: br label [[FOR_BODY7_US1:%.*]] 121; CHECK: for.body7.us1: 122; CHECK-NEXT: br label [[CONT_US2:%.*]] 123; CHECK: cont.us2: 124; CHECK-NEXT: br label [[CONT_FOR_BODY7_CRIT_EDGE_US3:%.*]] 125; CHECK: cont.for.body7_crit_edge.us3: 126; CHECK-NEXT: br label [[FOR_BODY7_US1]] 127; CHECK: for.cond5.preheader.split.split: 128; CHECK-NEXT: br label [[FOR_BODY7:%.*]] 129; CHECK: for.body7: 130; CHECK-NEXT: br label [[CONT:%.*]] 131; CHECK: cont: 132; CHECK-NEXT: br label [[FOR_END_SPLIT:%.*]] 133; CHECK: for.end.split: 134; CHECK-NEXT: br label [[FOR_END:%.*]] 135; CHECK: for.end: 136; CHECK-NEXT: br i1 false, label [[FOR_INC8:%.*]], label [[CLEANUP15_SPLIT:%.*]] 137; CHECK: for.inc8: 138; CHECK-NEXT: br i1 false, label [[FOR_INC8_FOR_COND5_PREHEADER_CRIT_EDGE:%.*]], label [[FOR_INC11_SPLIT:%.*]] 139; CHECK: for.inc8.for.cond5.preheader_crit_edge: 140; CHECK-NEXT: br label [[FOR_COND5_PREHEADER]] 141; CHECK: for.inc11.split: 142; CHECK-NEXT: br label [[FOR_INC11:%.*]] 143; CHECK: for.inc11: 144; CHECK-NEXT: br label [[FOR_COND]] 145; CHECK: cleanup15.split: 146; CHECK-NEXT: br label [[CLEANUP15]] 147; CHECK: cleanup15: 148; CHECK-NEXT: ret i32 0 149; 150entry: 151 %false = and i1 1, 0 152 br label %for.cond 153 154for.cond: ; preds = %for.inc11, %entry 155 br label %for.cond5.preheader 156 157for.cond5.preheader: ; preds = %for.inc8.for.cond5.preheader_crit_edge, %for.cond 158 br label %for.body7 159 160for.body7: ; preds = %cont.for.body7_crit_edge, %for.cond5.preheader 161 br i1 %not, label %handler.pointer_overflow, label %cont 162 163handler.pointer_overflow: ; preds = %for.body7 164 br label %cont 165 166cont: ; preds = %handler.pointer_overflow, %for.body7 167 br i1 %false, label %cont.for.body7_crit_edge, label %for.end 168 169cont.for.body7_crit_edge: ; preds = %cont 170 br label %for.body7 171 172for.end: ; preds = %cont 173 br i1 %false, label %for.inc8, label %cleanup15 174 175for.inc8: ; preds = %for.end 176 br i1 %false, label %for.inc8.for.cond5.preheader_crit_edge, label %for.inc11 177 178for.inc8.for.cond5.preheader_crit_edge: ; preds = %for.inc8 179 br label %for.cond5.preheader 180 181for.inc11: ; preds = %for.inc8 182 br label %for.cond 183 184cleanup15: ; preds = %for.end 185 ret i32 0 186} 187