1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -S -passes='simple-loop-unswitch<nontrivial>' < %s | FileCheck %s 3 4; Make sure invariant condition injection does not result in exponential 5; size increase. 6 7; FIXME: It probably shouldn't result in linear size increase either. 8 9define void @ham(i64 %arg) { 10; CHECK-LABEL: define void @ham( 11; CHECK-SAME: i64 [[ARG:%.*]]) { 12; CHECK-NEXT: bb: 13; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i64 [[ARG]], [[ARG]] 14; CHECK-NEXT: [[INJECTED_COND_FR:%.*]] = freeze i1 [[INJECTED_COND]] 15; CHECK-NEXT: br i1 [[INJECTED_COND_FR]], label [[BB_SPLIT_US:%.*]], label [[BB_SPLIT:%.*]] 16; CHECK: bb.split.us: 17; CHECK-NEXT: [[INJECTED_COND1:%.*]] = icmp ule i64 [[ARG]], [[ARG]] 18; CHECK-NEXT: [[INJECTED_COND1_FR:%.*]] = freeze i1 [[INJECTED_COND1]] 19; CHECK-NEXT: br i1 [[INJECTED_COND1_FR]], label [[BB_SPLIT_US_SPLIT_US:%.*]], label [[BB_SPLIT_US_SPLIT:%.*]] 20; CHECK: bb.split.us.split.us: 21; CHECK-NEXT: [[INJECTED_COND2:%.*]] = icmp ule i64 [[ARG]], [[ARG]] 22; CHECK-NEXT: [[INJECTED_COND2_FR:%.*]] = freeze i1 [[INJECTED_COND2]] 23; CHECK-NEXT: br i1 [[INJECTED_COND2_FR]], label [[BB_SPLIT_US_SPLIT_US_SPLIT_US:%.*]], label [[BB_SPLIT_US_SPLIT_US_SPLIT:%.*]] 24; CHECK: bb.split.us.split.us.split.us: 25; CHECK-NEXT: [[INJECTED_COND3:%.*]] = icmp ule i64 [[ARG]], [[ARG]] 26; CHECK-NEXT: [[INJECTED_COND3_FR:%.*]] = freeze i1 [[INJECTED_COND3]] 27; CHECK-NEXT: br i1 [[INJECTED_COND3_FR]], label [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]], label [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT:%.*]] 28; CHECK: bb.split.us.split.us.split.us.split.us: 29; CHECK-NEXT: [[INJECTED_COND4:%.*]] = icmp ule i64 [[ARG]], [[ARG]] 30; CHECK-NEXT: [[INJECTED_COND4_FR:%.*]] = freeze i1 [[INJECTED_COND4]] 31; CHECK-NEXT: br i1 [[INJECTED_COND4_FR]], label [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]], label [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT:%.*]] 32; CHECK: bb.split.us.split.us.split.us.split.us.split.us: 33; CHECK-NEXT: br label [[BB1_US_US_US_US_US:%.*]] 34; CHECK: bb1.us.us.us.us.us: 35; CHECK-NEXT: [[PHI_US_US_US_US_US:%.*]] = phi i64 [ 0, [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US]] ], [ [[ADD_US_US_US_US_US:%.*]], [[BB20_US_US_US_US_US:%.*]] ] 36; CHECK-NEXT: [[ADD_US_US_US_US_US]] = add nuw i64 [[PHI_US_US_US_US_US]], 1 37; CHECK-NEXT: [[ICMP_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 38; CHECK-NEXT: br i1 [[ICMP_US_US_US_US_US]], label [[BB2_US_US_US_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]], !prof [[PROF0:![0-9]+]] 39; CHECK: bb2.us.us.us.us.us: 40; CHECK-NEXT: [[ICMP3_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 41; CHECK-NEXT: br label [[BB4_US_US_US_US_US:%.*]] 42; CHECK: bb4.us.us.us.us.us: 43; CHECK-NEXT: [[ICMP5_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 44; CHECK-NEXT: br label [[BB6_US_US_US_US_US:%.*]] 45; CHECK: bb6.us.us.us.us.us: 46; CHECK-NEXT: [[ICMP7_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 47; CHECK-NEXT: br label [[BB8_US_US_US_US_US:%.*]] 48; CHECK: bb8.us.us.us.us.us: 49; CHECK-NEXT: [[ICMP9_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 50; CHECK-NEXT: br label [[BB10_US_US_US_US_US:%.*]] 51; CHECK: bb10.us.us.us.us.us: 52; CHECK-NEXT: [[ICMP11_US_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US_US]], [[ARG]] 53; CHECK-NEXT: br label [[BB20_US_US_US_US_US]] 54; CHECK: bb20.us.us.us.us.us: 55; CHECK-NEXT: br label [[BB1_US_US_US_US_US]] 56; CHECK: bb21.split.us.split.us.split.us.split.us.split.us: 57; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 58; CHECK: bb.split.us.split.us.split.us.split.us.split: 59; CHECK-NEXT: br label [[BB1_US_US_US_US:%.*]] 60; CHECK: bb1.us.us.us.us: 61; CHECK-NEXT: [[PHI_US_US_US_US:%.*]] = phi i64 [ 0, [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT]] ], [ [[ADD_US_US_US_US:%.*]], [[BB20_US_US_US_US:%.*]] ] 62; CHECK-NEXT: [[ADD_US_US_US_US]] = add nuw i64 [[PHI_US_US_US_US]], 1 63; CHECK-NEXT: [[ICMP_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 64; CHECK-NEXT: br i1 [[ICMP_US_US_US_US]], label [[BB2_US_US_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT:%.*]], !prof [[PROF0]] 65; CHECK: bb2.us.us.us.us: 66; CHECK-NEXT: [[ICMP3_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 67; CHECK-NEXT: br label [[BB4_US_US_US_US:%.*]] 68; CHECK: bb4.us.us.us.us: 69; CHECK-NEXT: [[ICMP5_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 70; CHECK-NEXT: br label [[BB6_US_US_US_US:%.*]] 71; CHECK: bb6.us.us.us.us: 72; CHECK-NEXT: [[ICMP7_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 73; CHECK-NEXT: br label [[BB8_US_US_US_US:%.*]] 74; CHECK: bb8.us.us.us.us: 75; CHECK-NEXT: [[ICMP9_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 76; CHECK-NEXT: br label [[BB10_US_US_US_US:%.*]] 77; CHECK: bb10.us.us.us.us: 78; CHECK-NEXT: [[ICMP11_US_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US_US]], [[ARG]] 79; CHECK-NEXT: br label [[BB10_US_US_US_US_CHECK:%.*]] 80; CHECK: bb10.us.us.us.us.check: 81; CHECK-NEXT: br i1 [[ICMP11_US_US_US_US]], label [[BB20_US_US_US_US]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT]] 82; CHECK: bb20.us.us.us.us: 83; CHECK-NEXT: br label [[BB1_US_US_US_US]], !llvm.loop [[LOOP1:![0-9]+]] 84; CHECK: bb21.split.us.split.us.split.us.split.us.split: 85; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US]] 86; CHECK: bb21.split.us.split.us.split.us.split.us: 87; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] 88; CHECK: bb.split.us.split.us.split.us.split: 89; CHECK-NEXT: br label [[BB1_US_US_US:%.*]] 90; CHECK: bb1.us.us.us: 91; CHECK-NEXT: [[PHI_US_US_US:%.*]] = phi i64 [ 0, [[BB_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT]] ], [ [[ADD_US_US_US:%.*]], [[BB20_US_US_US:%.*]] ] 92; CHECK-NEXT: [[ADD_US_US_US]] = add nuw i64 [[PHI_US_US_US]], 1 93; CHECK-NEXT: [[ICMP_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 94; CHECK-NEXT: br i1 [[ICMP_US_US_US]], label [[BB2_US_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT:%.*]], !prof [[PROF0]] 95; CHECK: bb2.us.us.us: 96; CHECK-NEXT: [[ICMP3_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 97; CHECK-NEXT: br label [[BB4_US_US_US:%.*]] 98; CHECK: bb4.us.us.us: 99; CHECK-NEXT: [[ICMP5_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 100; CHECK-NEXT: br label [[BB6_US_US_US:%.*]] 101; CHECK: bb6.us.us.us: 102; CHECK-NEXT: [[ICMP7_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 103; CHECK-NEXT: br label [[BB8_US_US_US:%.*]] 104; CHECK: bb8.us.us.us: 105; CHECK-NEXT: [[ICMP9_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 106; CHECK-NEXT: br label [[BB8_US_US_US_CHECK:%.*]] 107; CHECK: bb8.us.us.us.check: 108; CHECK-NEXT: br i1 [[ICMP9_US_US_US]], label [[BB10_US_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT]] 109; CHECK: bb10.us.us.us: 110; CHECK-NEXT: [[ICMP11_US_US_US:%.*]] = icmp ult i64 [[PHI_US_US_US]], [[ARG]] 111; CHECK-NEXT: br i1 [[ICMP11_US_US_US]], label [[BB20_US_US_US]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT]], !prof [[PROF0]] 112; CHECK: bb20.us.us.us: 113; CHECK-NEXT: br label [[BB1_US_US_US]], !llvm.loop [[LOOP3:![0-9]+]] 114; CHECK: bb21.split.us.split.us.split.us.split: 115; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US_SPLIT_US]] 116; CHECK: bb21.split.us.split.us.split.us: 117; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US:%.*]] 118; CHECK: bb.split.us.split.us.split: 119; CHECK-NEXT: br label [[BB1_US_US:%.*]] 120; CHECK: bb1.us.us: 121; CHECK-NEXT: [[PHI_US_US:%.*]] = phi i64 [ 0, [[BB_SPLIT_US_SPLIT_US_SPLIT]] ], [ [[ADD_US_US:%.*]], [[BB20_US_US:%.*]] ] 122; CHECK-NEXT: [[ADD_US_US]] = add nuw i64 [[PHI_US_US]], 1 123; CHECK-NEXT: [[ICMP_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 124; CHECK-NEXT: br i1 [[ICMP_US_US]], label [[BB2_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT:%.*]], !prof [[PROF0]] 125; CHECK: bb2.us.us: 126; CHECK-NEXT: [[ICMP3_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 127; CHECK-NEXT: br label [[BB4_US_US:%.*]] 128; CHECK: bb4.us.us: 129; CHECK-NEXT: [[ICMP5_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 130; CHECK-NEXT: br label [[BB6_US_US:%.*]] 131; CHECK: bb6.us.us: 132; CHECK-NEXT: [[ICMP7_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 133; CHECK-NEXT: br label [[BB6_US_US_CHECK:%.*]] 134; CHECK: bb6.us.us.check: 135; CHECK-NEXT: br i1 [[ICMP7_US_US]], label [[BB8_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT]] 136; CHECK: bb8.us.us: 137; CHECK-NEXT: [[ICMP9_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 138; CHECK-NEXT: br i1 [[ICMP9_US_US]], label [[BB10_US_US:%.*]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT]], !prof [[PROF0]] 139; CHECK: bb10.us.us: 140; CHECK-NEXT: [[ICMP11_US_US:%.*]] = icmp ult i64 [[PHI_US_US]], [[ARG]] 141; CHECK-NEXT: br i1 [[ICMP11_US_US]], label [[BB20_US_US]], label [[BB21_SPLIT_US_SPLIT_US_SPLIT]], !prof [[PROF0]] 142; CHECK: bb20.us.us: 143; CHECK-NEXT: br label [[BB1_US_US]], !llvm.loop [[LOOP4:![0-9]+]] 144; CHECK: bb21.split.us.split.us.split: 145; CHECK-NEXT: br label [[BB21_SPLIT_US_SPLIT_US]] 146; CHECK: bb21.split.us.split.us: 147; CHECK-NEXT: br label [[BB21_SPLIT_US:%.*]] 148; CHECK: bb.split.us.split: 149; CHECK-NEXT: br label [[BB1_US:%.*]] 150; CHECK: bb1.us: 151; CHECK-NEXT: [[PHI_US:%.*]] = phi i64 [ 0, [[BB_SPLIT_US_SPLIT]] ], [ [[ADD_US:%.*]], [[BB20_US:%.*]] ] 152; CHECK-NEXT: [[ADD_US]] = add nuw i64 [[PHI_US]], 1 153; CHECK-NEXT: [[ICMP_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 154; CHECK-NEXT: br i1 [[ICMP_US]], label [[BB2_US:%.*]], label [[BB21_SPLIT_US_SPLIT:%.*]], !prof [[PROF0]] 155; CHECK: bb2.us: 156; CHECK-NEXT: [[ICMP3_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 157; CHECK-NEXT: br label [[BB4_US:%.*]] 158; CHECK: bb4.us: 159; CHECK-NEXT: [[ICMP5_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 160; CHECK-NEXT: br label [[BB4_US_CHECK:%.*]] 161; CHECK: bb4.us.check: 162; CHECK-NEXT: br i1 [[ICMP5_US]], label [[BB6_US:%.*]], label [[BB22_SPLIT_US:%.*]] 163; CHECK: bb6.us: 164; CHECK-NEXT: [[ICMP7_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 165; CHECK-NEXT: br i1 [[ICMP7_US]], label [[BB8_US:%.*]], label [[BB21_SPLIT_US_SPLIT]], !prof [[PROF0]] 166; CHECK: bb8.us: 167; CHECK-NEXT: [[ICMP9_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 168; CHECK-NEXT: br i1 [[ICMP9_US]], label [[BB10_US:%.*]], label [[BB21_SPLIT_US_SPLIT]], !prof [[PROF0]] 169; CHECK: bb10.us: 170; CHECK-NEXT: [[ICMP11_US:%.*]] = icmp ult i64 [[PHI_US]], [[ARG]] 171; CHECK-NEXT: br i1 [[ICMP11_US]], label [[BB20_US]], label [[BB21_SPLIT_US_SPLIT]], !prof [[PROF0]] 172; CHECK: bb20.us: 173; CHECK-NEXT: br label [[BB1_US]], !llvm.loop [[LOOP5:![0-9]+]] 174; CHECK: bb21.split.us.split: 175; CHECK-NEXT: br label [[BB21_SPLIT_US]] 176; CHECK: bb21.split.us: 177; CHECK-NEXT: br label [[BB21:%.*]] 178; CHECK: bb22.split.us: 179; CHECK-NEXT: br label [[BB22:%.*]] 180; CHECK: bb.split: 181; CHECK-NEXT: br label [[BB1:%.*]] 182; CHECK: bb1: 183; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, [[BB_SPLIT]] ], [ [[ADD:%.*]], [[BB20:%.*]] ] 184; CHECK-NEXT: [[ADD]] = add nuw i64 [[PHI]], 1 185; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 186; CHECK-NEXT: br i1 [[ICMP]], label [[BB2:%.*]], label [[BB21_SPLIT:%.*]], !prof [[PROF0]] 187; CHECK: bb2: 188; CHECK-NEXT: [[ICMP3:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 189; CHECK-NEXT: br label [[BB2_CHECK:%.*]] 190; CHECK: bb2.check: 191; CHECK-NEXT: br i1 [[ICMP3]], label [[BB4:%.*]], label [[BB21_SPLIT]] 192; CHECK: bb4: 193; CHECK-NEXT: [[ICMP5:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 194; CHECK-NEXT: br i1 [[ICMP5]], label [[BB6:%.*]], label [[BB22_SPLIT:%.*]], !prof [[PROF0]] 195; CHECK: bb6: 196; CHECK-NEXT: [[ICMP7:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 197; CHECK-NEXT: br i1 [[ICMP7]], label [[BB8:%.*]], label [[BB21_SPLIT]], !prof [[PROF0]] 198; CHECK: bb8: 199; CHECK-NEXT: [[ICMP9:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 200; CHECK-NEXT: br i1 [[ICMP9]], label [[BB10:%.*]], label [[BB21_SPLIT]], !prof [[PROF0]] 201; CHECK: bb10: 202; CHECK-NEXT: [[ICMP11:%.*]] = icmp ult i64 [[PHI]], [[ARG]] 203; CHECK-NEXT: br i1 [[ICMP11]], label [[BB20]], label [[BB21_SPLIT]], !prof [[PROF0]] 204; CHECK: bb20: 205; CHECK-NEXT: br label [[BB1]], !llvm.loop [[LOOP6:![0-9]+]] 206; CHECK: bb21.split: 207; CHECK-NEXT: br label [[BB21]] 208; CHECK: bb21: 209; CHECK-NEXT: call void @zot() 210; CHECK-NEXT: ret void 211; CHECK: bb22.split: 212; CHECK-NEXT: br label [[BB22]] 213; CHECK: bb22: 214; CHECK-NEXT: call void @zot() 215; CHECK-NEXT: ret void 216; 217bb: 218 br label %bb1 219 220bb1: ; preds = %bb20, %bb 221 %phi = phi i64 [ 0, %bb ], [ %add, %bb20 ] 222 %add = add nuw i64 %phi, 1 223 %icmp = icmp ult i64 %phi, %arg 224 br i1 %icmp, label %bb2, label %bb21, !prof !0 225 226bb2: ; preds = %bb1 227 %icmp3 = icmp ult i64 %phi, %arg 228 br i1 %icmp3, label %bb4, label %bb21, !prof !0 229 230bb4: ; preds = %bb2 231 %icmp5 = icmp ult i64 %phi, %arg 232 br i1 %icmp5, label %bb6, label %bb22, !prof !0 233 234bb6: ; preds = %bb4 235 %icmp7 = icmp ult i64 %phi, %arg 236 br i1 %icmp7, label %bb8, label %bb21, !prof !0 237 238bb8: ; preds = %bb6 239 %icmp9 = icmp ult i64 %phi, %arg 240 br i1 %icmp9, label %bb10, label %bb21, !prof !0 241 242bb10: ; preds = %bb8 243 %icmp11 = icmp ult i64 %phi, %arg 244 br i1 %icmp11, label %bb20, label %bb21, !prof !0 245 246bb20: ; preds = %bb18 247 br label %bb1 248 249bb21: ; preds = %bb18, %bb16, %bb14, %bb12, %bb10, %bb8, %bb6, %bb2, %bb1 250 call void @zot() 251 ret void 252 253bb22: ; preds = %bb4 254 call void @zot() 255 ret void 256} 257 258declare void @zot() 259 260!0 = !{!"branch_weights", i32 2000, i32 1} 261