1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4declare void @use(i1) 5 6define void @test_1_variable_constraint(i32 %x, i32 %y, i32 %z) { 7; CHECK-LABEL: @test_1_variable_constraint( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 10; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]] 11; CHECK: bb1: 12; CHECK-NEXT: call void @use(i1 true) 13; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[X]], 10 14; CHECK-NEXT: call void @use(i1 [[C_2]]) 15; CHECK-NEXT: [[C_3:%.*]] = icmp sge i32 [[Y]], [[X]] 16; CHECK-NEXT: call void @use(i1 [[C_3]]) 17; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 10, [[X]] 18; CHECK-NEXT: call void @use(i1 [[C_4]]) 19; CHECK-NEXT: ret void 20; CHECK: bb2: 21; CHECK-NEXT: call void @use(i1 true) 22; CHECK-NEXT: call void @use(i1 false) 23; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 10 24; CHECK-NEXT: call void @use(i1 [[C_5]]) 25; CHECK-NEXT: [[C_6:%.*]] = icmp sge i32 10, [[X]] 26; CHECK-NEXT: call void @use(i1 [[C_6]]) 27; CHECK-NEXT: ret void 28; 29entry: 30 %c.1 = icmp sge i32 %x, %y 31 br i1 %c.1, label %bb1, label %bb2 32 33bb1: 34 %t.1 = icmp sge i32 %x, %y 35 call void @use(i1 %t.1) 36 %c.2 = icmp sge i32 %x, 10 37 call void @use(i1 %c.2) 38 %c.3 = icmp sge i32 %y, %x 39 call void @use(i1 %c.3) 40 %c.4 = icmp sge i32 10, %x 41 call void @use(i1 %c.4) 42 ret void 43 44bb2: 45 %t.2 = icmp sge i32 %y, %x 46 call void @use(i1 %t.2) 47 %f.1 = icmp sge i32 %x, %y 48 call void @use(i1 %f.1) 49 %c.5 = icmp sge i32 %x, 10 50 call void @use(i1 %c.5) 51 %c.6 = icmp sge i32 10, %x 52 call void @use(i1 %c.6) 53 ret void 54} 55 56define void @test_1_constant_constraint(i32 %x) { 57; CHECK-LABEL: @test_1_constant_constraint( 58; CHECK-NEXT: entry: 59; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], 10 60; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]] 61; CHECK: bb1: 62; CHECK-NEXT: call void @use(i1 true) 63; CHECK-NEXT: call void @use(i1 true) 64; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[X]], 11 65; CHECK-NEXT: call void @use(i1 [[C_2]]) 66; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 10, [[X]] 67; CHECK-NEXT: call void @use(i1 [[C_4]]) 68; CHECK-NEXT: ret void 69; CHECK: bb2: 70; CHECK-NEXT: call void @use(i1 true) 71; CHECK-NEXT: call void @use(i1 false) 72; CHECK-NEXT: call void @use(i1 false) 73; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 9 74; CHECK-NEXT: call void @use(i1 [[C_5]]) 75; CHECK-NEXT: [[C_6:%.*]] = icmp sge i32 1, [[X]] 76; CHECK-NEXT: call void @use(i1 [[C_6]]) 77; CHECK-NEXT: ret void 78; 79entry: 80 %c.1 = icmp sge i32 %x, 10 81 br i1 %c.1, label %bb1, label %bb2 82 83bb1: 84 %t.1 = icmp sge i32 %x, 10 85 call void @use(i1 %t.1) 86 %t.2 = icmp sge i32 %x, 9 87 call void @use(i1 %t.2) 88 %c.2 = icmp sge i32 %x, 11 89 call void @use(i1 %c.2) 90 %c.4 = icmp sge i32 10, %x 91 call void @use(i1 %c.4) 92 ret void 93 94bb2: 95 %t.3 = icmp sge i32 11, %x 96 call void @use(i1 %t.3) 97 %f.1 = icmp sge i32 %x, 10 98 call void @use(i1 %f.1) 99 100 101 %f.1.1 = icmp sge i32 %x, 10 102 call void @use(i1 %f.1.1) 103 %c.5 = icmp sge i32 %x, 9 104 call void @use(i1 %c.5) 105 %c.6 = icmp sge i32 1, %x 106 call void @use(i1 %c.6) 107 ret void 108} 109 110define i32 @test1(i32 %x, i32 %y, i32 %z) { 111; CHECK-LABEL: @test1( 112; CHECK-NEXT: entry: 113; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 114; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 115; CHECK: bb1: 116; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y]], [[Z:%.*]] 117; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 118; CHECK: bb2: 119; CHECK-NEXT: br i1 true, label [[BB3:%.*]], label [[EXIT]] 120; CHECK: bb3: 121; CHECK-NEXT: ret i32 10 122; CHECK: exit: 123; CHECK-NEXT: ret i32 20 124; 125entry: 126 %c.1 = icmp sge i32 %x, %y 127 br i1 %c.1, label %bb1, label %exit 128 129bb1: 130 %c.2 = icmp sge i32 %y, %z 131 br i1 %c.2, label %bb2, label %exit 132 133bb2: 134 %c.3 = icmp sge i32 %x, %z 135 br i1 %c.3, label %bb3, label %exit 136 137bb3: 138 ret i32 10 139 140exit: 141 ret i32 20 142} 143 144define i32 @test2(i32 %x, i32 %y, i32 %z, i32 %a) { 145; CHECK-LABEL: @test2( 146; CHECK-NEXT: entry: 147; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 148; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 149; CHECK: bb1: 150; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y]], [[Z:%.*]] 151; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 152; CHECK: bb2: 153; CHECK-NEXT: [[C_3:%.*]] = icmp sge i32 [[X]], [[A:%.*]] 154; CHECK-NEXT: br i1 [[C_3]], label [[BB3:%.*]], label [[EXIT]] 155; CHECK: bb3: 156; CHECK-NEXT: ret i32 10 157; CHECK: exit: 158; CHECK-NEXT: ret i32 20 159; 160entry: 161 %c.1 = icmp sge i32 %x, %y 162 br i1 %c.1, label %bb1, label %exit 163 164bb1: 165 %c.2 = icmp sge i32 %y, %z 166 br i1 %c.2, label %bb2, label %exit 167 168bb2: 169 %c.3 = icmp sge i32 %x, %a 170 br i1 %c.3, label %bb3, label %exit 171 172bb3: 173 ret i32 10 174 175exit: 176 ret i32 20 177} 178 179 180define i32 @test3(i32 %x, i32 %y) { 181; CHECK-LABEL: @test3( 182; CHECK-NEXT: entry: 183; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], 10 184; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 185; CHECK: bb1: 186; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y:%.*]], 20 187; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 188; CHECK: bb2: 189; CHECK-NEXT: ret i32 10 190; CHECK: exit: 191; CHECK-NEXT: ret i32 20 192; 193entry: 194 %c.1 = icmp sge i32 %x, 10 195 br i1 %c.1, label %bb1, label %exit 196 197bb1: 198 %c.2 = icmp sge i32 %y, 20 199 br i1 %c.2, label %bb2, label %exit 200 201bb2: 202 ret i32 10 203 204exit: 205 ret i32 20 206} 207 208define i32 @test4(i32 %x, i32 %y, i32 %z) { 209; CHECK-LABEL: @test4( 210; CHECK-NEXT: entry: 211; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 212; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 213; CHECK: bb1: 214; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y]], [[Z:%.*]] 215; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 216; CHECK: bb2: 217; CHECK-NEXT: call void @use(i1 true) 218; CHECK-NEXT: [[U_1:%.*]] = icmp eq i32 [[X]], [[Z]] 219; CHECK-NEXT: call void @use(i1 [[U_1]]) 220; CHECK-NEXT: ret i32 10 221; CHECK: exit: 222; CHECK-NEXT: ret i32 20 223; 224entry: 225 %c.1 = icmp sge i32 %x, %y 226 br i1 %c.1, label %bb1, label %exit 227 228bb1: 229 %c.2 = icmp sge i32 %y, %z 230 br i1 %c.2, label %bb2, label %exit 231 232bb2: 233 %t.1 = icmp sge i32 %x, %z 234 call void @use(i1 %t.1) 235 %u.1 = icmp eq i32 %x, %z 236 call void @use(i1 %u.1) 237 ret i32 10 238 239 240exit: 241 ret i32 20 242} 243 244define i1 @sge_sgt(i32 %x, i32 %y, i32 %z) { 245; CHECK-LABEL: @sge_sgt( 246; CHECK-NEXT: entry: 247; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i32 [[X:%.*]], -1 248; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 249; CHECK: then: 250; CHECK-NEXT: ret i1 true 251; CHECK: else: 252; CHECK-NEXT: ret i1 false 253; 254entry: 255 %c.1 = icmp sgt i32 %x, -1 256 br i1 %c.1, label %then, label %else 257 258then: 259 %t.1 = icmp sge i32 %x, 0 260 ret i1 %t.1 261 262else: 263 %f.1 = icmp sge i32 %x, 0 264 ret i1 %f.1 265} 266