1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4define i1 @test_eq_ne_0(i8 %a, i8 %b) { 5; CHECK-LABEL: @test_eq_ne_0( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 0 8; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 9; CHECK: then: 10; CHECK-NEXT: [[F_1:%.*]] = icmp ne i8 [[A]], 0 11; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 1 12; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 13; CHECK-NEXT: [[RES_1:%.*]] = xor i1 false, [[C_1]] 14; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 15; CHECK-NEXT: ret i1 [[RES_2]] 16; CHECK: else: 17; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 0 18; CHECK-NEXT: [[C_3:%.*]] = icmp ne i8 [[A]], 1 19; CHECK-NEXT: [[C_4:%.*]] = icmp ne i8 [[A]], [[B]] 20; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, [[C_3]] 21; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 22; CHECK-NEXT: ret i1 [[RES_4]] 23; 24entry: 25 %cmp = icmp eq i8 %a, 0 26 br i1 %cmp, label %then, label %else 27 28then: 29 %f.1 = icmp ne i8 %a, 0 30 %c.1 = icmp ne i8 %a, 1 31 %c.2 = icmp ne i8 %a, %b 32 %res.1 = xor i1 %f.1, %c.1 33 %res.2 = xor i1 %res.1, %c.2 34 ret i1 %res.2 35 36else: 37 %t.1 = icmp ne i8 %a, 0 38 %c.3 = icmp ne i8 %a, 1 39 %c.4 = icmp ne i8 %a, %b 40 %res.3 = xor i1 %t.1, %c.3 41 %res.4 = xor i1 %res.3, %c.4 42 ret i1 %res.4 43} 44 45define i1 @test_ne_eq_0(i8 %a, i8 %b) { 46; CHECK-LABEL: @test_ne_eq_0( 47; CHECK-NEXT: entry: 48; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 0 49; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 50; CHECK: then: 51; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 0 52; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 1 53; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]] 54; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 55; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 56; CHECK-NEXT: [[C_3:%.*]] = icmp eq i8 [[A]], [[B]] 57; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]] 58; CHECK-NEXT: [[C_4:%.*]] = icmp eq i8 [[A]], 0 59; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], false 60; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i8 [[A]], 0 61; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], true 62; CHECK-NEXT: [[T_3:%.*]] = icmp uge i8 [[A]], 1 63; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], true 64; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[A]], 1 65; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]] 66; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i8 [[A]], 0 67; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]] 68; CHECK-NEXT: ret i1 [[RES_8]] 69; CHECK: else: 70; CHECK-NEXT: [[F_1:%.*]] = icmp ne i8 [[A]], 0 71; CHECK-NEXT: [[C_7:%.*]] = icmp ne i8 [[A]], 1 72; CHECK-NEXT: [[RES_9:%.*]] = xor i1 false, [[C_7]] 73; CHECK-NEXT: [[C_8:%.*]] = icmp ne i8 [[A]], [[B]] 74; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_8]] 75; CHECK-NEXT: [[C_9:%.*]] = icmp eq i8 [[A]], [[B]] 76; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_9]] 77; CHECK-NEXT: [[C_10:%.*]] = icmp eq i8 [[A]], 0 78; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], true 79; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[A]], 0 80; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], false 81; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[A]], 1 82; CHECK-NEXT: [[RES_14:%.*]] = xor i1 [[RES_13]], false 83; CHECK-NEXT: [[C_11:%.*]] = icmp ugt i8 [[A]], 1 84; CHECK-NEXT: [[RES_15:%.*]] = xor i1 [[RES_14]], false 85; CHECK-NEXT: [[C_12:%.*]] = icmp sgt i8 [[A]], 0 86; CHECK-NEXT: [[RES_16:%.*]] = xor i1 [[RES_15]], [[C_12]] 87; CHECK-NEXT: ret i1 [[RES_16]] 88; 89entry: 90 %cmp = icmp ne i8 %a, 0 91 br i1 %cmp, label %then, label %else 92 93then: 94 %t.1 = icmp ne i8 %a, 0 95 %c.1 = icmp ne i8 %a, 1 96 %res.1 = xor i1 %t.1, %c.1 97 98 %c.2 = icmp ne i8 %a, %b 99 %res.2 = xor i1 %res.1, %c.2 100 101 %c.3 = icmp eq i8 %a, %b 102 %res.3 = xor i1 %res.2, %c.3 103 104 %c.4 = icmp eq i8 %a, 0 105 %res.4 = xor i1 %res.3, %c.4 106 107 %t.2 = icmp ugt i8 %a, 0 108 %res.5 = xor i1 %res.4, %t.2 109 110 %t.3 = icmp uge i8 %a, 1 111 %res.6 = xor i1 %res.5, %t.3 112 113 %c.5 = icmp ugt i8 %a, 1 114 %res.7 = xor i1 %res.6, %c.5 115 116 %c.6 = icmp sgt i8 %a, 0 117 %res.8 = xor i1 %res.7, %c.6 118 119 ret i1 %res.8 120 121else: 122 %f.1 = icmp ne i8 %a, 0 123 %c.7 = icmp ne i8 %a, 1 124 %res.9 = xor i1 %f.1, %c.7 125 126 %c.8 = icmp ne i8 %a, %b 127 %res.10 = xor i1 %res.9, %c.8 128 129 %c.9 = icmp eq i8 %a, %b 130 %res.11 = xor i1 %res.10, %c.9 131 132 %c.10 = icmp eq i8 %a, 0 133 %res.12 = xor i1 %res.11, %c.10 134 135 %f.2 = icmp ugt i8 %a, 0 136 %res.13 = xor i1 %res.12, %f.2 137 138 %f.3 = icmp uge i8 %a, 1 139 %res.14 = xor i1 %res.13, %f.3 140 141 %c.11 = icmp ugt i8 %a, 1 142 %res.15 = xor i1 %res.14, %c.11 143 144 %c.12 = icmp sgt i8 %a, 0 145 %res.16 = xor i1 %res.15, %c.12 146 147 ret i1 %res.16 148} 149 150define i1 @test_eq_ne_1(i8 %a, i8 %b) { 151; CHECK-LABEL: @test_eq_ne_1( 152; CHECK-NEXT: entry: 153; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 1 154; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 155; CHECK: then: 156; CHECK-NEXT: [[F_1:%.*]] = icmp ne i8 [[A]], 0 157; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 1 158; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 159; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]] 160; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 161; CHECK-NEXT: ret i1 [[RES_2]] 162; CHECK: else: 163; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 0 164; CHECK-NEXT: [[C_3:%.*]] = icmp ne i8 [[A]], 1 165; CHECK-NEXT: [[C_4:%.*]] = icmp ne i8 [[A]], [[B]] 166; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_1]], [[C_3]] 167; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 168; CHECK-NEXT: ret i1 [[RES_4]] 169; 170entry: 171 %cmp = icmp eq i8 %a, 1 172 br i1 %cmp, label %then, label %else 173 174then: 175 %f.1 = icmp ne i8 %a, 0 176 %c.1 = icmp ne i8 %a, 1 177 %c.2 = icmp ne i8 %a, %b 178 %res.1 = xor i1 %f.1, %c.1 179 %res.2 = xor i1 %res.1, %c.2 180 ret i1 %res.2 181 182else: 183 %t.1 = icmp ne i8 %a, 0 184 %c.3 = icmp ne i8 %a, 1 185 %c.4 = icmp ne i8 %a, %b 186 %res.3 = xor i1 %t.1, %c.3 187 %res.4 = xor i1 %res.3, %c.4 188 ret i1 %res.4 189} 190 191define i1 @test_ne_eq_1(i8 %a, i8 %b) { 192; CHECK-LABEL: @test_ne_eq_1( 193; CHECK-NEXT: entry: 194; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 1 195; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 196; CHECK: then: 197; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 1 198; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 0 199; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]] 200; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 201; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 202; CHECK-NEXT: [[C_3:%.*]] = icmp eq i8 [[A]], [[B]] 203; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]] 204; CHECK-NEXT: [[C_4:%.*]] = icmp eq i8 [[A]], 0 205; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 206; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[A]], 0 207; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], [[C_5]] 208; CHECK-NEXT: [[C_6:%.*]] = icmp uge i8 [[A]], 1 209; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_6]] 210; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[A]], 1 211; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]] 212; CHECK-NEXT: [[C_8:%.*]] = icmp sgt i8 [[A]], 0 213; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]] 214; CHECK-NEXT: ret i1 [[RES_8]] 215; CHECK: else: 216; CHECK-NEXT: [[T_2:%.*]] = icmp ne i8 [[A]], 0 217; CHECK-NEXT: [[C_9:%.*]] = icmp ne i8 [[A]], 1 218; CHECK-NEXT: [[RES_9:%.*]] = xor i1 true, [[C_9]] 219; CHECK-NEXT: [[C_10:%.*]] = icmp ne i8 [[A]], [[B]] 220; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_10]] 221; CHECK-NEXT: [[C_11:%.*]] = icmp eq i8 [[A]], [[B]] 222; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_11]] 223; CHECK-NEXT: [[F_1:%.*]] = icmp eq i8 [[A]], 0 224; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], false 225; CHECK-NEXT: [[T_3:%.*]] = icmp ugt i8 [[A]], 0 226; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], true 227; CHECK-NEXT: [[T_4:%.*]] = icmp uge i8 [[A]], 1 228; CHECK-NEXT: [[RES_14:%.*]] = xor i1 [[RES_13]], true 229; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[A]], 1 230; CHECK-NEXT: [[RES_15:%.*]] = xor i1 [[RES_14]], false 231; CHECK-NEXT: [[C_12:%.*]] = icmp sgt i8 [[A]], 0 232; CHECK-NEXT: [[RES_16:%.*]] = xor i1 [[RES_15]], [[C_12]] 233; CHECK-NEXT: ret i1 [[RES_16]] 234; 235entry: 236 %cmp = icmp ne i8 %a, 1 237 br i1 %cmp, label %then, label %else 238 239then: 240 %t.1 = icmp ne i8 %a, 1 241 %c.1 = icmp ne i8 %a, 0 242 %res.1 = xor i1 %t.1, %c.1 243 244 %c.2 = icmp ne i8 %a, %b 245 %res.2 = xor i1 %res.1, %c.2 246 247 %c.3 = icmp eq i8 %a, %b 248 %res.3 = xor i1 %res.2, %c.3 249 250 %c.4 = icmp eq i8 %a, 0 251 %res.4 = xor i1 %res.3, %c.4 252 253 %c.5 = icmp ugt i8 %a, 0 254 %res.5 = xor i1 %res.4, %c.5 255 256 %c.6 = icmp uge i8 %a, 1 257 %res.6 = xor i1 %res.5, %c.6 258 259 %c.7 = icmp ugt i8 %a, 1 260 %res.7 = xor i1 %res.6, %c.5 261 262 %c.8 = icmp sgt i8 %a, 0 263 %res.8 = xor i1 %res.7, %c.6 264 265 ret i1 %res.8 266 267else: 268 %t.2 = icmp ne i8 %a, 0 269 %c.9 = icmp ne i8 %a, 1 270 %res.9 = xor i1 %t.2, %c.9 271 272 %c.10 = icmp ne i8 %a, %b 273 %res.10 = xor i1 %res.9, %c.10 274 275 %c.11 = icmp eq i8 %a, %b 276 %res.11 = xor i1 %res.10, %c.11 277 278 %f.1 = icmp eq i8 %a, 0 279 %res.12 = xor i1 %res.11, %f.1 280 281 %t.3 = icmp ugt i8 %a, 0 282 %res.13 = xor i1 %res.12, %t.3 283 284 %t.4 = icmp uge i8 %a, 1 285 %res.14 = xor i1 %res.13, %t.4 286 287 %f.2 = icmp ugt i8 %a, 1 288 %res.15 = xor i1 %res.14, %f.2 289 290 %c.12 = icmp sgt i8 %a, 0 291 %res.16 = xor i1 %res.15, %c.12 292 293 ret i1 %res.16 294} 295