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(i8 %x, i8 %y, i8 %z) { 7; CHECK-LABEL: @test_1_variable_constraint( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[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 uge i8 [[X]], 10 14; CHECK-NEXT: call void @use(i1 [[C_2]]) 15; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8 [[Y]], [[X]] 16; CHECK-NEXT: call void @use(i1 [[C_3]]) 17; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 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 uge i8 [[X]], 10 24; CHECK-NEXT: call void @use(i1 [[C_5]]) 25; CHECK-NEXT: [[C_6:%.*]] = icmp uge i8 10, [[X]] 26; CHECK-NEXT: call void @use(i1 [[C_6]]) 27; CHECK-NEXT: ret void 28; 29entry: 30 %c.1 = icmp uge i8 %x, %y 31 br i1 %c.1, label %bb1, label %bb2 32 33bb1: 34 %t.1 = icmp uge i8 %x, %y 35 call void @use(i1 %t.1) 36 %c.2 = icmp uge i8 %x, 10 37 call void @use(i1 %c.2) 38 %c.3 = icmp uge i8 %y, %x 39 call void @use(i1 %c.3) 40 %c.4 = icmp uge i8 10, %x 41 call void @use(i1 %c.4) 42 ret void 43 44bb2: 45 %t.2 = icmp uge i8 %y, %x 46 call void @use(i1 %t.2) 47 %f.1 = icmp uge i8 %x, %y 48 call void @use(i1 %f.1) 49 %c.5 = icmp uge i8 %x, 10 50 call void @use(i1 %c.5) 51 %c.6 = icmp uge i8 10, %x 52 call void @use(i1 %c.6) 53 ret void 54} 55 56define void @test_1_constant_constraint(i8 %x) { 57; CHECK-LABEL: @test_1_constant_constraint( 58; CHECK-NEXT: entry: 59; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[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 uge i8 [[X]], 11 65; CHECK-NEXT: call void @use(i1 [[C_2]]) 66; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 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 uge i8 [[X]], 9 74; CHECK-NEXT: call void @use(i1 [[C_5]]) 75; CHECK-NEXT: [[C_6:%.*]] = icmp uge i8 1, [[X]] 76; CHECK-NEXT: call void @use(i1 [[C_6]]) 77; CHECK-NEXT: ret void 78; 79entry: 80 %c.1 = icmp uge i8 %x, 10 81 br i1 %c.1, label %bb1, label %bb2 82 83bb1: 84 %t.1 = icmp uge i8 %x, 10 85 call void @use(i1 %t.1) 86 %t.2 = icmp uge i8 %x, 9 87 call void @use(i1 %t.2) 88 %c.2 = icmp uge i8 %x, 11 89 call void @use(i1 %c.2) 90 %c.4 = icmp uge i8 10, %x 91 call void @use(i1 %c.4) 92 ret void 93 94bb2: 95 %t.3 = icmp uge i8 11, %x 96 call void @use(i1 %t.3) 97 %f.1 = icmp uge i8 %x, 10 98 call void @use(i1 %f.1) 99 100 101 %f.1.1 = icmp uge i8 %x, 10 102 call void @use(i1 %f.1.1) 103 %c.5 = icmp uge i8 %x, 9 104 call void @use(i1 %c.5) 105 %c.6 = icmp uge i8 1, %x 106 call void @use(i1 %c.6) 107 ret void 108} 109 110define i8 @test1(i8 %x, i8 %y, i8 %z) { 111; CHECK-LABEL: @test1( 112; CHECK-NEXT: entry: 113; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] 114; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 115; CHECK: bb1: 116; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[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 i8 10 122; CHECK: exit: 123; CHECK-NEXT: ret i8 20 124; 125entry: 126 %c.1 = icmp uge i8 %x, %y 127 br i1 %c.1, label %bb1, label %exit 128 129bb1: 130 %c.2 = icmp uge i8 %y, %z 131 br i1 %c.2, label %bb2, label %exit 132 133bb2: 134 %c.3 = icmp uge i8 %x, %z 135 br i1 %c.3, label %bb3, label %exit 136 137bb3: 138 ret i8 10 139 140exit: 141 ret i8 20 142} 143 144 145define i8 @test2(i8 %x, i8 %y, i8 %z, i8 %a) { 146; CHECK-LABEL: @test2( 147; CHECK-NEXT: entry: 148; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] 149; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 150; CHECK: bb1: 151; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[Y]], [[Z:%.*]] 152; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 153; CHECK: bb2: 154; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8 [[X]], [[A:%.*]] 155; CHECK-NEXT: br i1 [[C_3]], label [[BB3:%.*]], label [[EXIT]] 156; CHECK: bb3: 157; CHECK-NEXT: ret i8 10 158; CHECK: exit: 159; CHECK-NEXT: ret i8 20 160; 161entry: 162 %c.1 = icmp uge i8 %x, %y 163 br i1 %c.1, label %bb1, label %exit 164 165bb1: 166 %c.2 = icmp uge i8 %y, %z 167 br i1 %c.2, label %bb2, label %exit 168 169bb2: 170 %c.3 = icmp uge i8 %x, %a 171 br i1 %c.3, label %bb3, label %exit 172 173bb3: 174 ret i8 10 175 176exit: 177 ret i8 20 178} 179 180 181define i8 @test3(i8 %x, i8 %y) { 182; CHECK-LABEL: @test3( 183; CHECK-NEXT: entry: 184; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[X:%.*]], 10 185; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 186; CHECK: bb1: 187; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[Y:%.*]], 20 188; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 189; CHECK: bb2: 190; CHECK-NEXT: ret i8 10 191; CHECK: exit: 192; CHECK-NEXT: ret i8 20 193; 194entry: 195 %c.1 = icmp uge i8 %x, 10 196 br i1 %c.1, label %bb1, label %exit 197 198bb1: 199 %c.2 = icmp uge i8 %y, 20 200 br i1 %c.2, label %bb2, label %exit 201 202bb2: 203 ret i8 10 204 205exit: 206 ret i8 20 207} 208 209define i8 @test4(i8 %x, i8 %y, i8 %z) { 210; CHECK-LABEL: @test4( 211; CHECK-NEXT: entry: 212; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] 213; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 214; CHECK: bb1: 215; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[Y]], [[Z:%.*]] 216; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 217; CHECK: bb2: 218; CHECK-NEXT: call void @use(i1 true) 219; CHECK-NEXT: [[U_1:%.*]] = icmp eq i8 [[X]], [[Z]] 220; CHECK-NEXT: call void @use(i1 [[U_1]]) 221; CHECK-NEXT: ret i8 10 222; CHECK: exit: 223; CHECK-NEXT: ret i8 20 224; 225entry: 226 %c.1 = icmp uge i8 %x, %y 227 br i1 %c.1, label %bb1, label %exit 228 229bb1: 230 %c.2 = icmp uge i8 %y, %z 231 br i1 %c.2, label %bb2, label %exit 232 233bb2: 234 %t.1 = icmp uge i8 %x, %z 235 call void @use(i1 %t.1) 236 %u.1 = icmp eq i8 %x, %z 237 call void @use(i1 %u.1) 238 ret i8 10 239 240 241exit: 242 ret i8 20 243} 244