1802d21cdSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3802d21cdSFlorian Hahn 4be0bf04bSFlorian Hahndeclare void @use(i1) 5be0bf04bSFlorian Hahn 6802d21cdSFlorian Hahn; Make sure conditions in loops are not used to simplify themselves. 7802d21cdSFlorian Hahn 834e477e9SFlorian Hahndefine void @loop1(ptr %T, ptr %x, i32 %points, i32 %trigint) { 9802d21cdSFlorian Hahn; CHECK-LABEL: @loop1( 10802d21cdSFlorian Hahn; CHECK-NEXT: entry: 11802d21cdSFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[POINTS:%.*]] to i64 1234e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds float, ptr [[X:%.*]], i64 [[IDX_EXT]] 1334e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR]], i64 -8 14802d21cdSFlorian Hahn; CHECK-NEXT: [[SHR:%.*]] = ashr i32 [[POINTS]], 1 15802d21cdSFlorian Hahn; CHECK-NEXT: [[IDX_EXT2:%.*]] = sext i32 [[SHR]] to i64 1634e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 [[IDX_EXT2]] 1734e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR4:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR3]], i64 -8 18802d21cdSFlorian Hahn; CHECK-NEXT: br label [[DO_BODY:%.*]] 19802d21cdSFlorian Hahn; CHECK: do.body: 2034e477e9SFlorian Hahn; CHECK-NEXT: [[X2_0:%.*]] = phi ptr [ [[ADD_PTR4]], [[ENTRY:%.*]] ], [ [[ADD_PTR106:%.*]], [[DO_BODY]] ] 2134e477e9SFlorian Hahn; CHECK-NEXT: [[X1_0:%.*]] = phi ptr [ [[ADD_PTR1]], [[ENTRY]] ], [ [[ADD_PTR105:%.*]], [[DO_BODY]] ] 2234e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR105]] = getelementptr inbounds float, ptr [[X1_0]], i64 -8 2334e477e9SFlorian Hahn; CHECK-NEXT: [[ADD_PTR106]] = getelementptr inbounds float, ptr [[X2_0]], i64 -8 2434e477e9SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[ADD_PTR106]], [[X]] 25802d21cdSFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[DO_BODY]], label [[DO_END:%.*]] 26802d21cdSFlorian Hahn; CHECK: do.end: 27802d21cdSFlorian Hahn; CHECK-NEXT: ret void 28802d21cdSFlorian Hahn; 29802d21cdSFlorian Hahnentry: 30802d21cdSFlorian Hahn %idx.ext = sext i32 %points to i64 3134e477e9SFlorian Hahn %add.ptr = getelementptr inbounds float, ptr %x, i64 %idx.ext 3234e477e9SFlorian Hahn %add.ptr1 = getelementptr inbounds float, ptr %add.ptr, i64 -8 33802d21cdSFlorian Hahn %shr = ashr i32 %points, 1 34802d21cdSFlorian Hahn %idx.ext2 = sext i32 %shr to i64 3534e477e9SFlorian Hahn %add.ptr3 = getelementptr inbounds float, ptr %x, i64 %idx.ext2 3634e477e9SFlorian Hahn %add.ptr4 = getelementptr inbounds float, ptr %add.ptr3, i64 -8 37802d21cdSFlorian Hahn br label %do.body 38802d21cdSFlorian Hahn 39802d21cdSFlorian Hahndo.body: ; preds = %do.body, %entry 4034e477e9SFlorian Hahn %x2.0 = phi ptr [ %add.ptr4, %entry ], [ %add.ptr106, %do.body ] 4134e477e9SFlorian Hahn %x1.0 = phi ptr [ %add.ptr1, %entry ], [ %add.ptr105, %do.body ] 4234e477e9SFlorian Hahn %add.ptr105 = getelementptr inbounds float, ptr %x1.0, i64 -8 4334e477e9SFlorian Hahn %add.ptr106 = getelementptr inbounds float, ptr %x2.0, i64 -8 4434e477e9SFlorian Hahn %cmp = icmp uge ptr %add.ptr106, %x 45802d21cdSFlorian Hahn br i1 %cmp, label %do.body, label %do.end 46802d21cdSFlorian Hahn 47802d21cdSFlorian Hahndo.end: ; preds = %do.body 48802d21cdSFlorian Hahn ret void 49802d21cdSFlorian Hahn} 50be0bf04bSFlorian Hahn 51be0bf04bSFlorian Hahn 52be0bf04bSFlorian Hahn; Some tests with loops with conditions in the header. 53be0bf04bSFlorian Hahn 54be0bf04bSFlorian Hahndefine i32 @loop_header_dom(i32 %y, i1 %c) { 55be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom( 56be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 57be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 58be0bf04bSFlorian Hahn; CHECK: loop.header: 59be0bf04bSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 60be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 61be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]] 62be0bf04bSFlorian Hahn; CHECK: loop.latch: 63be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 64be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 65be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 9 66be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 67be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 9 68be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 69be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 70be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 71be0bf04bSFlorian Hahn; CHECK: exit: 72be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10 73be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 74be0bf04bSFlorian Hahn; CHECK-NEXT: ret i32 20 75be0bf04bSFlorian Hahn; 76be0bf04bSFlorian Hahnentry: 77be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 78be0bf04bSFlorian Hahn 79be0bf04bSFlorian Hahnloop.header: 80be0bf04bSFlorian Hahn %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ] 81be0bf04bSFlorian Hahn %c.1 = icmp ule i32 %x, 10 82be0bf04bSFlorian Hahn br i1 %c.1, label %loop.latch, label %exit 83be0bf04bSFlorian Hahn 84be0bf04bSFlorian Hahnloop.latch: 85be0bf04bSFlorian Hahn %t.1 = icmp ule i32 %x, 10 86be0bf04bSFlorian Hahn call void @use(i1 %t.1) 87be0bf04bSFlorian Hahn %f.1 = icmp ugt i32 %x, 10 88be0bf04bSFlorian Hahn call void @use(i1 %f.1) 89be0bf04bSFlorian Hahn 90be0bf04bSFlorian Hahn %c.2 = icmp ule i32 %x, 9 91be0bf04bSFlorian Hahn call void @use(i1 %c.2) 92be0bf04bSFlorian Hahn %c.3 = icmp ugt i32 %x, 9 93be0bf04bSFlorian Hahn call void @use(i1 %c.3) 94be0bf04bSFlorian Hahn 95be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 96be0bf04bSFlorian Hahn br label %loop.header 97be0bf04bSFlorian Hahn 98be0bf04bSFlorian Hahnexit: 99be0bf04bSFlorian Hahn %c.4 = icmp ugt i32 %y, 10 100be0bf04bSFlorian Hahn call void @use(i1 %c.4) 101be0bf04bSFlorian Hahn ret i32 20 102be0bf04bSFlorian Hahn} 103be0bf04bSFlorian Hahn 104be0bf04bSFlorian Hahndefine i32 @loop_header_dom_successors_flipped(i32 %y, i1 %c) { 105be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_successors_flipped( 106be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 107be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 108be0bf04bSFlorian Hahn; CHECK: loop.header: 109be0bf04bSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 110be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 111be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[EXIT]], label [[LOOP_LATCH]] 112be0bf04bSFlorian Hahn; CHECK: loop.latch: 113be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 114be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 115be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 11 116be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 117be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 11 118be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 119be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 120be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 121be0bf04bSFlorian Hahn; CHECK: exit: 122be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10 123be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 124be0bf04bSFlorian Hahn; CHECK-NEXT: ret i32 20 125be0bf04bSFlorian Hahn; 126be0bf04bSFlorian Hahnentry: 127be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 128be0bf04bSFlorian Hahn 129be0bf04bSFlorian Hahnloop.header: 130be0bf04bSFlorian Hahn %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ] 131be0bf04bSFlorian Hahn %c.1 = icmp ule i32 %x, 10 132be0bf04bSFlorian Hahn br i1 %c.1, label %exit, label %loop.latch 133be0bf04bSFlorian Hahn 134be0bf04bSFlorian Hahnloop.latch: 135be0bf04bSFlorian Hahn %f.1 = icmp ule i32 %x, 10 136be0bf04bSFlorian Hahn call void @use(i1 %f.1) 137be0bf04bSFlorian Hahn %t.1 = icmp ugt i32 %x, 10 138be0bf04bSFlorian Hahn call void @use(i1 %t.1) 139be0bf04bSFlorian Hahn 140be0bf04bSFlorian Hahn %c.2 = icmp ugt i32 %x, 11 141be0bf04bSFlorian Hahn call void @use(i1 %c.2) 142be0bf04bSFlorian Hahn %c.3 = icmp ule i32 %x,11 143be0bf04bSFlorian Hahn call void @use(i1 %c.3) 144be0bf04bSFlorian Hahn 145be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 146be0bf04bSFlorian Hahn br label %loop.header 147be0bf04bSFlorian Hahn 148be0bf04bSFlorian Hahnexit: 149be0bf04bSFlorian Hahn %c.4 = icmp ugt i32 %y, 10 150be0bf04bSFlorian Hahn call void @use(i1 %c.4) 151be0bf04bSFlorian Hahn ret i32 20 152be0bf04bSFlorian Hahn} 153be0bf04bSFlorian Hahn 154*c32c668cSFlorian Hahndefine void @loop_header_dom_or(i32 %y, i1 %c, i32 %start) { 155be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_or( 156be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 157be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 158be0bf04bSFlorian Hahn; CHECK: loop.header: 159*c32c668cSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 160be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X]], 10 161be0bf04bSFlorian Hahn; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99 162be0bf04bSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]] 163be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[EXIT]], label [[LOOP_LATCH]] 164be0bf04bSFlorian Hahn; CHECK: loop.latch: 165be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 166be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 167be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[X]], 11 168be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 169be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 11 170be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 171be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 172be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 173be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[Y]], 98 174be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 175be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ule i32 [[Y]], 98 176be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 177be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 178be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 179be0bf04bSFlorian Hahn; CHECK: exit: 180be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y]], 10 181be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 182be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 183be0bf04bSFlorian Hahn; 184be0bf04bSFlorian Hahnentry: 185be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 186be0bf04bSFlorian Hahn 187be0bf04bSFlorian Hahnloop.header: 188*c32c668cSFlorian Hahn %x = phi i32 [ %start, %entry ], [ %x.next, %loop.latch ] 189be0bf04bSFlorian Hahn %x.1 = icmp ule i32 %x, 10 190be0bf04bSFlorian Hahn %y.1 = icmp ugt i32 %y, 99 191be0bf04bSFlorian Hahn %or = or i1 %x.1, %y.1 192be0bf04bSFlorian Hahn br i1 %or, label %exit, label %loop.latch 193be0bf04bSFlorian Hahn 194be0bf04bSFlorian Hahnloop.latch: 195be0bf04bSFlorian Hahn %t.1 = icmp ugt i32 %x, 10 196be0bf04bSFlorian Hahn call void @use(i1 %t.1) 197be0bf04bSFlorian Hahn %f.1 = icmp ule i32 %x, 10 198be0bf04bSFlorian Hahn call void @use(i1 %f.1) 199be0bf04bSFlorian Hahn %c.1 = icmp ugt i32 %x, 11 200be0bf04bSFlorian Hahn call void @use(i1 %c.1) 201be0bf04bSFlorian Hahn %c.2 = icmp ule i32 %x, 11 202be0bf04bSFlorian Hahn call void @use(i1 %c.2) 203be0bf04bSFlorian Hahn 204be0bf04bSFlorian Hahn 205be0bf04bSFlorian Hahn %t.2 = icmp ule i32 %y, 99 206be0bf04bSFlorian Hahn call void @use(i1 %t.2) 207be0bf04bSFlorian Hahn %f.2 = icmp ugt i32 %y, 99 208be0bf04bSFlorian Hahn call void @use(i1 %f.2) 209be0bf04bSFlorian Hahn 210be0bf04bSFlorian Hahn %c.3 = icmp ule i32 %y, 98 211be0bf04bSFlorian Hahn call void @use(i1 %c.3) 212be0bf04bSFlorian Hahn %c.4 = icmp ule i32 %y, 98 213be0bf04bSFlorian Hahn call void @use(i1 %c.4) 214be0bf04bSFlorian Hahn 215be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 216be0bf04bSFlorian Hahn br label %loop.header 217be0bf04bSFlorian Hahn 218be0bf04bSFlorian Hahnexit: 219be0bf04bSFlorian Hahn %c.5 = icmp ugt i32 %y, 10 220be0bf04bSFlorian Hahn call void @use(i1 %c.5) 221be0bf04bSFlorian Hahn ret void 222be0bf04bSFlorian Hahn} 223be0bf04bSFlorian Hahn 224be0bf04bSFlorian Hahndefine void @loop_header_dom_or_successors_flipped(i32 %y, i1 %c) { 225be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_or_successors_flipped( 226be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 227be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 228be0bf04bSFlorian Hahn; CHECK: loop.header: 229be0bf04bSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 230be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X]], 10 231be0bf04bSFlorian Hahn; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99 232be0bf04bSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]] 233be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[LOOP_LATCH]], label [[EXIT]] 234be0bf04bSFlorian Hahn; CHECK: loop.latch: 235be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 236be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 237be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 10 238be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 239be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 9 240be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 241be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 9 242be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 243be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y]], 99 244be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 245be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ule i32 [[Y]], 99 246be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 247be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i32 [[Y]], 100 248be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 249be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i32 [[Y]], 100 250be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 251be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 252be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 253be0bf04bSFlorian Hahn; CHECK: exit: 254be0bf04bSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[Y]], 10 255be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 256be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 257be0bf04bSFlorian Hahn; 258be0bf04bSFlorian Hahnentry: 259be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 260be0bf04bSFlorian Hahn 261be0bf04bSFlorian Hahnloop.header: 262be0bf04bSFlorian Hahn %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ] 263be0bf04bSFlorian Hahn %x.1 = icmp ule i32 %x, 10 264be0bf04bSFlorian Hahn %y.1 = icmp ugt i32 %y, 99 265be0bf04bSFlorian Hahn %or = or i1 %x.1, %y.1 266be0bf04bSFlorian Hahn br i1 %or, label %loop.latch, label %exit 267be0bf04bSFlorian Hahn 268be0bf04bSFlorian Hahnloop.latch: 269be0bf04bSFlorian Hahn %c.1 = icmp ule i32 %x, 10 270be0bf04bSFlorian Hahn call void @use(i1 %c.1) 271be0bf04bSFlorian Hahn %c.2 = icmp ugt i32 %x, 10 272be0bf04bSFlorian Hahn call void @use(i1 %c.2) 273be0bf04bSFlorian Hahn %c.3 = icmp ule i32 %x, 9 274be0bf04bSFlorian Hahn call void @use(i1 %c.3) 275be0bf04bSFlorian Hahn %c.4 = icmp ugt i32 %x, 9 276be0bf04bSFlorian Hahn call void @use(i1 %c.4) 277be0bf04bSFlorian Hahn 278be0bf04bSFlorian Hahn 279be0bf04bSFlorian Hahn %c.5 = icmp ugt i32 %y, 99 280be0bf04bSFlorian Hahn call void @use(i1 %c.5) 281be0bf04bSFlorian Hahn %c.6 = icmp ule i32 %y, 99 282be0bf04bSFlorian Hahn call void @use(i1 %c.6) 283be0bf04bSFlorian Hahn 284be0bf04bSFlorian Hahn %c.7 = icmp ugt i32 %y, 100 285be0bf04bSFlorian Hahn call void @use(i1 %c.7) 286be0bf04bSFlorian Hahn %c.8 = icmp ugt i32 %y, 100 287be0bf04bSFlorian Hahn call void @use(i1 %c.8) 288be0bf04bSFlorian Hahn 289be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 290be0bf04bSFlorian Hahn br label %loop.header 291be0bf04bSFlorian Hahn 292be0bf04bSFlorian Hahnexit: 293be0bf04bSFlorian Hahn %t.1 = icmp ugt i32 %y, 10 294be0bf04bSFlorian Hahn call void @use(i1 %t.1) 295be0bf04bSFlorian Hahn ret void 296be0bf04bSFlorian Hahn} 297be0bf04bSFlorian Hahn 298be0bf04bSFlorian Hahn 299be0bf04bSFlorian Hahndefine void @loop_header_dom_and(i32 %y, i1 %c) { 300be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_and( 301be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 302be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 303be0bf04bSFlorian Hahn; CHECK: exit: 304be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10 305be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 306be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 307be0bf04bSFlorian Hahn; CHECK: loop.header: 308be0bf04bSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 309be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X]], 10 310be0bf04bSFlorian Hahn; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 311be0bf04bSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]] 312be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]] 313be0bf04bSFlorian Hahn; CHECK: loop.latch: 314be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 315be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 316be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 9 317be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 318be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 9 319be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 320be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 321be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 322be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[Y]], 100 323be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 324be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y]], 100 325be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 326be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 327be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 328be0bf04bSFlorian Hahn; CHECK: exit.1: 329be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ugt i32 [[Y]], 10 330be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 331be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 332be0bf04bSFlorian Hahn; 333be0bf04bSFlorian Hahnentry: 334be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 335be0bf04bSFlorian Hahn 336be0bf04bSFlorian Hahnexit: 337be0bf04bSFlorian Hahn %c.5 = icmp ugt i32 %y, 10 338be0bf04bSFlorian Hahn call void @use(i1 %c.5) 339be0bf04bSFlorian Hahn ret void 340be0bf04bSFlorian Hahn 341be0bf04bSFlorian Hahnloop.header: 342be0bf04bSFlorian Hahn %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ] 343be0bf04bSFlorian Hahn %x.1 = icmp ule i32 %x, 10 344be0bf04bSFlorian Hahn %y.1 = icmp ugt i32 %y, 99 345be0bf04bSFlorian Hahn %and = and i1 %x.1, %y.1 346be0bf04bSFlorian Hahn br i1 %and, label %loop.latch, label %exit.1 347be0bf04bSFlorian Hahn 348be0bf04bSFlorian Hahnloop.latch: 349be0bf04bSFlorian Hahn %t.1 = icmp ule i32 %x, 10 350be0bf04bSFlorian Hahn call void @use(i1 %t.1) 351be0bf04bSFlorian Hahn %f.1 = icmp ugt i32 %x, 10 352be0bf04bSFlorian Hahn call void @use(i1 %f.1) 353be0bf04bSFlorian Hahn %c.1 = icmp ule i32 %x, 9 354be0bf04bSFlorian Hahn call void @use(i1 %c.1) 355be0bf04bSFlorian Hahn %c.2 = icmp ugt i32 %x, 9 356be0bf04bSFlorian Hahn call void @use(i1 %c.2) 357be0bf04bSFlorian Hahn 358be0bf04bSFlorian Hahn 359be0bf04bSFlorian Hahn %t.2 = icmp ugt i32 %y, 99 360be0bf04bSFlorian Hahn call void @use(i1 %t.2) 361be0bf04bSFlorian Hahn %f.2 = icmp ule i32 %y, 99 362be0bf04bSFlorian Hahn call void @use(i1 %f.2) 363be0bf04bSFlorian Hahn 364be0bf04bSFlorian Hahn %c.3 = icmp ugt i32 %y, 100 365be0bf04bSFlorian Hahn call void @use(i1 %c.3) 366be0bf04bSFlorian Hahn %c.4 = icmp ugt i32 %y, 100 367be0bf04bSFlorian Hahn call void @use(i1 %c.4) 368be0bf04bSFlorian Hahn 369be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 370be0bf04bSFlorian Hahn br label %loop.header 371be0bf04bSFlorian Hahn 372be0bf04bSFlorian Hahnexit.1: 373be0bf04bSFlorian Hahn %c.6 = icmp ugt i32 %y, 10 374be0bf04bSFlorian Hahn call void @use(i1 %c.6) 375be0bf04bSFlorian Hahn ret void 376be0bf04bSFlorian Hahn} 377be0bf04bSFlorian Hahn 378be0bf04bSFlorian Hahndefine void @loop_header_dom_and_successors_flipped(i32 %y, i1 %c) { 379be0bf04bSFlorian Hahn; CHECK-LABEL: @loop_header_dom_and_successors_flipped( 380be0bf04bSFlorian Hahn; CHECK-NEXT: entry: 381be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 382be0bf04bSFlorian Hahn; CHECK: exit: 383be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10 384be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_9]]) 385be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 386be0bf04bSFlorian Hahn; CHECK: loop.header: 387be0bf04bSFlorian Hahn; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 388be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X]], 10 389be0bf04bSFlorian Hahn; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 390be0bf04bSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]] 391be0bf04bSFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP_LATCH]] 392be0bf04bSFlorian Hahn; CHECK: loop.latch: 393be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 394be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 395be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 10 396be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 397be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 9 398be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 399be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 9 400be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 401be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y]], 99 402be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 403be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ule i32 [[Y]], 99 404be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 405be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i32 [[Y]], 100 406be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 407be0bf04bSFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i32 [[Y]], 100 408be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_8]]) 409be0bf04bSFlorian Hahn; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1 410be0bf04bSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 411be0bf04bSFlorian Hahn; CHECK: exit.1: 412be0bf04bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 413be0bf04bSFlorian Hahn; CHECK-NEXT: ret void 414be0bf04bSFlorian Hahn; 415be0bf04bSFlorian Hahnentry: 416be0bf04bSFlorian Hahn br i1 %c, label %loop.header, label %exit 417be0bf04bSFlorian Hahn 418be0bf04bSFlorian Hahnexit: 419be0bf04bSFlorian Hahn %c.9 = icmp ugt i32 %y, 10 420be0bf04bSFlorian Hahn call void @use(i1 %c.9) 421be0bf04bSFlorian Hahn ret void 422be0bf04bSFlorian Hahn 423be0bf04bSFlorian Hahnloop.header: 424be0bf04bSFlorian Hahn %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ] 425be0bf04bSFlorian Hahn %x.1 = icmp ule i32 %x, 10 426be0bf04bSFlorian Hahn %y.1 = icmp ugt i32 %y, 99 427be0bf04bSFlorian Hahn %and = and i1 %x.1, %y.1 428be0bf04bSFlorian Hahn br i1 %and, label %exit.1, label %loop.latch 429be0bf04bSFlorian Hahn 430be0bf04bSFlorian Hahnloop.latch: 431be0bf04bSFlorian Hahn %c.1 = icmp ule i32 %x, 10 432be0bf04bSFlorian Hahn call void @use(i1 %c.1) 433be0bf04bSFlorian Hahn %c.2 = icmp ugt i32 %x, 10 434be0bf04bSFlorian Hahn call void @use(i1 %c.2) 435be0bf04bSFlorian Hahn %c.3 = icmp ule i32 %x, 9 436be0bf04bSFlorian Hahn call void @use(i1 %c.3) 437be0bf04bSFlorian Hahn %c.4 = icmp ugt i32 %x, 9 438be0bf04bSFlorian Hahn call void @use(i1 %c.4) 439be0bf04bSFlorian Hahn 440be0bf04bSFlorian Hahn 441be0bf04bSFlorian Hahn %c.5 = icmp ugt i32 %y, 99 442be0bf04bSFlorian Hahn call void @use(i1 %c.5) 443be0bf04bSFlorian Hahn %c.6 = icmp ule i32 %y, 99 444be0bf04bSFlorian Hahn call void @use(i1 %c.6) 445be0bf04bSFlorian Hahn 446be0bf04bSFlorian Hahn %c.7 = icmp ugt i32 %y, 100 447be0bf04bSFlorian Hahn call void @use(i1 %c.7) 448be0bf04bSFlorian Hahn %c.8 = icmp ugt i32 %y, 100 449be0bf04bSFlorian Hahn call void @use(i1 %c.8) 450be0bf04bSFlorian Hahn 451be0bf04bSFlorian Hahn %x.next = add i32 %x, 1 452be0bf04bSFlorian Hahn br label %loop.header 453be0bf04bSFlorian Hahn 454be0bf04bSFlorian Hahnexit.1: 455be0bf04bSFlorian Hahn %t.1 = icmp ugt i32 %y, 10 456be0bf04bSFlorian Hahn call void @use(i1 %t.1) 457be0bf04bSFlorian Hahn ret void 458be0bf04bSFlorian Hahn} 459