10db72442SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --verbose 28ebb3eacSBjorn Pettersson; RUN: opt -S -passes=sccp %s | FileCheck %s 3e30c2578SFlorian Hahn 40db72442SFlorian Hahndeclare void @use(i1) 50db72442SFlorian Hahn 60db72442SFlorian Hahndefine void @and_range_limit(i64 %a) { 70db72442SFlorian Hahn; CHECK-LABEL: @and_range_limit( 80db72442SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 90db72442SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp slt i64 [[R]], 15 100db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 118a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 120db72442SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp eq i64 [[R]], 100 130db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 148a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 150db72442SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ne i64 [[R]], 100 160db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 178a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 180db72442SFlorian Hahn; CHECK-NEXT: ret void 190db72442SFlorian Hahn; 200db72442SFlorian Hahn %r = and i64 %a, 255 210db72442SFlorian Hahn %c.0 = icmp slt i64 %r, 15 220db72442SFlorian Hahn call void @use(i1 %c.0) 230db72442SFlorian Hahn %c.1 = icmp slt i64 %r, 256 240db72442SFlorian Hahn call void @use(i1 %c.1) 250db72442SFlorian Hahn %c.2 = icmp eq i64 %r, 100 260db72442SFlorian Hahn call void @use(i1 %c.2) 270db72442SFlorian Hahn %c.3 = icmp eq i64 %r, 300 280db72442SFlorian Hahn call void @use(i1 %c.3) 290db72442SFlorian Hahn %c.4 = icmp ne i64 %r, 100 300db72442SFlorian Hahn call void @use(i1 %c.4) 310db72442SFlorian Hahn %c.5 = icmp ne i64 %r, 300 320db72442SFlorian Hahn call void @use(i1 %c.5) 330db72442SFlorian Hahn ret void 340db72442SFlorian Hahn} 350db72442SFlorian Hahn 360db72442SFlorian Hahn; Below are test cases for PR44949. 37e30c2578SFlorian Hahn 38e30c2578SFlorian Hahn; We can remove `%res = and i64 %p, 255`, because %r = 0 and we can eliminate 39e30c2578SFlorian Hahn; %p as well. 40e30c2578SFlorian Hahndefine i64 @constant_and_undef(i1 %c1, i64 %a) { 41e30c2578SFlorian Hahn; CHECK-LABEL: @constant_and_undef( 42e30c2578SFlorian Hahn; CHECK-NEXT: entry: 43e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 44e30c2578SFlorian Hahn; CHECK: bb1: 45e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 46e30c2578SFlorian Hahn; CHECK: bb2: 47e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 48e30c2578SFlorian Hahn; CHECK: bb3: 49e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 0 50e30c2578SFlorian Hahn; 51e30c2578SFlorian Hahnentry: 52e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 53e30c2578SFlorian Hahn 54e30c2578SFlorian Hahnbb1: 55e30c2578SFlorian Hahn br label %bb3 56e30c2578SFlorian Hahn 57e30c2578SFlorian Hahnbb2: 58e30c2578SFlorian Hahn %r = and i64 %a, 0 59e30c2578SFlorian Hahn br label %bb3 60e30c2578SFlorian Hahn 61e30c2578SFlorian Hahnbb3: 62e30c2578SFlorian Hahn %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ] 63e30c2578SFlorian Hahn %res = and i64 %p, 255 64e30c2578SFlorian Hahn ret i64 %res 65e30c2578SFlorian Hahn} 66e30c2578SFlorian Hahn 67e30c2578SFlorian Hahn; Check that we go to overdefined when merging a constant range with undef. We 68e30c2578SFlorian Hahn; cannot remove '%res = and i64 %p, 255'. 69e30c2578SFlorian Hahndefine i64 @constant_range_and_undef(i1 %cond, i64 %a) { 70e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef( 71e30c2578SFlorian Hahn; CHECK-NEXT: entry: 72e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 73e30c2578SFlorian Hahn; CHECK: bb1: 74e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 75e30c2578SFlorian Hahn; CHECK: bb2: 76e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 77e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 78e30c2578SFlorian Hahn; CHECK: bb3: 79e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ] 80e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 81e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 82e30c2578SFlorian Hahn; 83e30c2578SFlorian Hahnentry: 84e30c2578SFlorian Hahn br i1 %cond, label %bb1, label %bb2 85e30c2578SFlorian Hahn 86e30c2578SFlorian Hahnbb1: 87e30c2578SFlorian Hahn br label %bb3 88e30c2578SFlorian Hahn 89e30c2578SFlorian Hahnbb2: 90e30c2578SFlorian Hahn %r = and i64 %a, 255 91e30c2578SFlorian Hahn br label %bb3 92e30c2578SFlorian Hahn 93e30c2578SFlorian Hahnbb3: 94e30c2578SFlorian Hahn %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ] 95e30c2578SFlorian Hahn %res = and i64 %p, 255 96e30c2578SFlorian Hahn ret i64 %res 97e30c2578SFlorian Hahn} 98e30c2578SFlorian Hahn 99e30c2578SFlorian Hahn; Same as @constant_range_and_undef, with the undef coming from the other 100e30c2578SFlorian Hahn; block. 101e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_switched_incoming(i1 %cond, i64 %a) { 102e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_switched_incoming( 103e30c2578SFlorian Hahn; CHECK-NEXT: entry: 104e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 105e30c2578SFlorian Hahn; CHECK: bb1: 106e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 107e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 108e30c2578SFlorian Hahn; CHECK: bb2: 109e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 110e30c2578SFlorian Hahn; CHECK: bb3: 111e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ] 112e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 113e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 114e30c2578SFlorian Hahn; 115e30c2578SFlorian Hahnentry: 116e30c2578SFlorian Hahn br i1 %cond, label %bb1, label %bb2 117e30c2578SFlorian Hahn 118e30c2578SFlorian Hahnbb1: 119e30c2578SFlorian Hahn %r = and i64 %a, 255 120e30c2578SFlorian Hahn br label %bb3 121e30c2578SFlorian Hahn 122e30c2578SFlorian Hahnbb2: 123e30c2578SFlorian Hahn br label %bb3 124e30c2578SFlorian Hahn 125e30c2578SFlorian Hahnbb3: 126e30c2578SFlorian Hahn %p = phi i64 [ %r, %bb1 ], [ undef, %bb2 ] 127e30c2578SFlorian Hahn %res = and i64 %p, 255 128e30c2578SFlorian Hahn ret i64 %res 129e30c2578SFlorian Hahn} 130e30c2578SFlorian Hahn 131b3754375SFlorian Hahndefine i64 @constant_range_and_255_100(i1 %cond, i64 %a) { 132e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_255_100( 133e30c2578SFlorian Hahn; CHECK-NEXT: entry: 134e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 135e30c2578SFlorian Hahn; CHECK: bb1: 136e30c2578SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = and i64 [[A:%.*]], 100 137e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 138e30c2578SFlorian Hahn; CHECK: bb2: 139e30c2578SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = and i64 [[A]], 255 140e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 141e30c2578SFlorian Hahn; CHECK: bb3: 142e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R_1]], [[BB1]] ], [ [[R_2]], [[BB2]] ] 143*0f4d9f9bSAlexander Shaposhnikov; CHECK-NEXT: [[P_AND:%.*]] = and i64 [[P]], 255 144b3754375SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 145b3754375SFlorian Hahn; CHECK-NEXT: ret i64 [[P_AND]] 146e30c2578SFlorian Hahn; 147e30c2578SFlorian Hahnentry: 148e30c2578SFlorian Hahn br i1 %cond, label %bb1, label %bb2 149e30c2578SFlorian Hahn 150e30c2578SFlorian Hahnbb1: 151e30c2578SFlorian Hahn %r.1 = and i64 %a, 100 152e30c2578SFlorian Hahn br label %bb3 153e30c2578SFlorian Hahn 154e30c2578SFlorian Hahnbb2: 155e30c2578SFlorian Hahn %r.2 = and i64 %a, 255 156e30c2578SFlorian Hahn br label %bb3 157e30c2578SFlorian Hahn 158e30c2578SFlorian Hahnbb3: 159e30c2578SFlorian Hahn %p = phi i64 [ %r.1, %bb1 ], [ %r.2, %bb2 ] 160*0f4d9f9bSAlexander Shaposhnikov %p.and = and i64 %p, 255 161e30c2578SFlorian Hahn %c = icmp ult i64 %p.and, 256 162b3754375SFlorian Hahn call void @use(i1 %c) 163b3754375SFlorian Hahn ret i64 %p.and 164e30c2578SFlorian Hahn} 165e30c2578SFlorian Hahn 166e30c2578SFlorian Hahn 167e30c2578SFlorian Hahndefine i64 @constant_range_and_undef2(i1 %c1, i1 %c2, i64 %a) { 168e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef2( 169e30c2578SFlorian Hahn; CHECK-NEXT: entry: 170e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 171e30c2578SFlorian Hahn; CHECK: bb1: 172e30c2578SFlorian Hahn; CHECK-NEXT: [[V1:%.*]] = add i64 undef, undef 173e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 174e30c2578SFlorian Hahn; CHECK: bb2: 175e30c2578SFlorian Hahn; CHECK-NEXT: [[V2:%.*]] = and i64 [[A:%.*]], 255 176e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 177e30c2578SFlorian Hahn; CHECK: bb3: 178e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[V1]], [[BB1]] ], [ [[V2]], [[BB2]] ] 179e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB4:%.*]], label [[BB5:%.*]] 180e30c2578SFlorian Hahn; CHECK: bb4: 181e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB6:%.*]] 182e30c2578SFlorian Hahn; CHECK: bb5: 183e30c2578SFlorian Hahn; CHECK-NEXT: [[V3:%.*]] = and i64 [[A]], 255 184e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB6]] 185e30c2578SFlorian Hahn; CHECK: bb6: 186e30c2578SFlorian Hahn; CHECK-NEXT: [[P2:%.*]] = phi i64 [ [[P]], [[BB4]] ], [ [[V3]], [[BB5]] ] 187e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P2]], 255 188e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 189e30c2578SFlorian Hahn; 190e30c2578SFlorian Hahnentry: 191e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 192e30c2578SFlorian Hahn 193e30c2578SFlorian Hahnbb1: 194e30c2578SFlorian Hahn %v1 = add i64 undef, undef 195e30c2578SFlorian Hahn br label %bb3 196e30c2578SFlorian Hahn 197e30c2578SFlorian Hahnbb2: 198e30c2578SFlorian Hahn %v2 = and i64 %a, 255 199e30c2578SFlorian Hahn br label %bb3 200e30c2578SFlorian Hahn 201e30c2578SFlorian Hahnbb3: 202e30c2578SFlorian Hahn %p = phi i64 [ %v1, %bb1 ], [ %v2, %bb2 ] 203e30c2578SFlorian Hahn br i1 %c2, label %bb4, label %bb5 204e30c2578SFlorian Hahn 205e30c2578SFlorian Hahnbb4: 206e30c2578SFlorian Hahn br label %bb6 207e30c2578SFlorian Hahn 208e30c2578SFlorian Hahnbb5: 209e30c2578SFlorian Hahn %v3 = and i64 %a, 255 210e30c2578SFlorian Hahn br label %bb6 211e30c2578SFlorian Hahn 212e30c2578SFlorian Hahnbb6: 213e30c2578SFlorian Hahn %p2 = phi i64 [ %p, %bb4 ], [ %v3, %bb5 ] 214e30c2578SFlorian Hahn %res = and i64 %p2, 255 215e30c2578SFlorian Hahn ret i64 %res 216e30c2578SFlorian Hahn} 217e30c2578SFlorian Hahn 218e30c2578SFlorian Hahndefine i1 @constant_range_and_undef_3(i1 %cond, i64 %a) { 219e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3( 220e30c2578SFlorian Hahn; CHECK-NEXT: entry: 221e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 222e30c2578SFlorian Hahn; CHECK: bb1: 223e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 224e30c2578SFlorian Hahn; CHECK: bb2: 225e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 226e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 227e30c2578SFlorian Hahn; CHECK: bb3: 228e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ] 229b3754375SFlorian Hahn; CHECK-NEXT: ret i1 true 230e30c2578SFlorian Hahn; 231e30c2578SFlorian Hahnentry: 232e30c2578SFlorian Hahn br i1 %cond, label %bb1, label %bb2 233e30c2578SFlorian Hahn 234e30c2578SFlorian Hahnbb1: 235e30c2578SFlorian Hahn br label %bb3 236e30c2578SFlorian Hahn 237e30c2578SFlorian Hahnbb2: 238e30c2578SFlorian Hahn %r = and i64 %a, 255 239e30c2578SFlorian Hahn br label %bb3 240e30c2578SFlorian Hahn 241e30c2578SFlorian Hahnbb3: 242e30c2578SFlorian Hahn %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ] 243e30c2578SFlorian Hahn %c = icmp ult i64 %p, 256 244e30c2578SFlorian Hahn ret i1 %c 245e30c2578SFlorian Hahn} 246e30c2578SFlorian Hahn 247e30c2578SFlorian Hahndefine i1 @constant_range_and_undef_3_switched_incoming(i1 %cond, i64 %a) { 248e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_switched_incoming( 249e30c2578SFlorian Hahn; CHECK-NEXT: entry: 250e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 251e30c2578SFlorian Hahn; CHECK: bb1: 252e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 253e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 254e30c2578SFlorian Hahn; CHECK: bb2: 255e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 256e30c2578SFlorian Hahn; CHECK: bb3: 257e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ] 258b3754375SFlorian Hahn; CHECK-NEXT: ret i1 true 259e30c2578SFlorian Hahn; 260e30c2578SFlorian Hahnentry: 261e30c2578SFlorian Hahn br i1 %cond, label %bb1, label %bb2 262e30c2578SFlorian Hahn 263e30c2578SFlorian Hahnbb1: 264e30c2578SFlorian Hahn %r = and i64 %a, 255 265e30c2578SFlorian Hahn br label %bb3 266e30c2578SFlorian Hahn 267e30c2578SFlorian Hahnbb2: 268e30c2578SFlorian Hahn br label %bb3 269e30c2578SFlorian Hahn 270e30c2578SFlorian Hahnbb3: 271e30c2578SFlorian Hahn %p = phi i64 [ %r, %bb1 ], [ undef, %bb2 ] 272e30c2578SFlorian Hahn %c = icmp ult i64 %p, 256 273e30c2578SFlorian Hahn ret i1 %c 274e30c2578SFlorian Hahn} 275e30c2578SFlorian Hahn 276e30c2578SFlorian Hahn; Same as @constant_range_and_undef, but with 3 incoming 277e30c2578SFlorian Hahn; values: undef, a constant and a constant range. 278e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v1(i1 %c1, i1 %c2, i64 %a) { 279e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v1( 280e30c2578SFlorian Hahn; CHECK-NEXT: entry: 281e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 282e30c2578SFlorian Hahn; CHECK: bb1: 283e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 284e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4:%.*]] 285e30c2578SFlorian Hahn; CHECK: bb2: 286e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]] 287e30c2578SFlorian Hahn; CHECK: bb3: 288e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4]] 289e30c2578SFlorian Hahn; CHECK: bb4: 290e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB2]] ], [ undef, [[BB3]] ] 291e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 292e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 293e30c2578SFlorian Hahn; 294e30c2578SFlorian Hahnentry: 295e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 296e30c2578SFlorian Hahn 297e30c2578SFlorian Hahnbb1: 298e30c2578SFlorian Hahn %r = and i64 %a, 255 299e30c2578SFlorian Hahn br label %bb4 300e30c2578SFlorian Hahn 301e30c2578SFlorian Hahnbb2: 302e30c2578SFlorian Hahn br i1 %c2, label %bb3, label %bb4 303e30c2578SFlorian Hahn 304e30c2578SFlorian Hahnbb3: 305e30c2578SFlorian Hahn br label %bb4 306e30c2578SFlorian Hahn 307e30c2578SFlorian Hahnbb4: 308e30c2578SFlorian Hahn %p = phi i64 [ %r, %bb1 ], [ 10, %bb2], [ undef, %bb3 ] 309e30c2578SFlorian Hahn %res = and i64 %p, 255 310e30c2578SFlorian Hahn ret i64 %res 311e30c2578SFlorian Hahn} 312e30c2578SFlorian Hahn 313e30c2578SFlorian Hahn; Same as @constant_range_and_undef_3_incoming_v1, but with different order of 314e30c2578SFlorian Hahn; incoming values. 315e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v2(i1 %c1, i1 %c2, i64 %a) { 316e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v2( 317e30c2578SFlorian Hahn; CHECK-NEXT: entry: 318e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 319e30c2578SFlorian Hahn; CHECK: bb1: 320e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4:%.*]] 321e30c2578SFlorian Hahn; CHECK: bb2: 322e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]] 323e30c2578SFlorian Hahn; CHECK: bb3: 324e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 325e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4]] 326e30c2578SFlorian Hahn; CHECK: bb4: 327e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ 10, [[BB2]] ], [ [[R]], [[BB3]] ] 328e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 329e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 330e30c2578SFlorian Hahn; 331e30c2578SFlorian Hahnentry: 332e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 333e30c2578SFlorian Hahn 334e30c2578SFlorian Hahnbb1: 335e30c2578SFlorian Hahn br label %bb4 336e30c2578SFlorian Hahn 337e30c2578SFlorian Hahnbb2: 338e30c2578SFlorian Hahn br i1 %c2, label %bb3, label %bb4 339e30c2578SFlorian Hahn 340e30c2578SFlorian Hahnbb3: 341e30c2578SFlorian Hahn %r = and i64 %a, 255 342e30c2578SFlorian Hahn br label %bb4 343e30c2578SFlorian Hahn 344e30c2578SFlorian Hahnbb4: 345e30c2578SFlorian Hahn %p = phi i64 [ undef, %bb1 ], [ 10, %bb2], [ %r, %bb3 ] 346e30c2578SFlorian Hahn %res = and i64 %p, 255 347e30c2578SFlorian Hahn ret i64 %res 348e30c2578SFlorian Hahn} 349e30c2578SFlorian Hahn 350e30c2578SFlorian Hahn; Same as @constant_range_and_undef_3_incoming_v1, but with different order of 351e30c2578SFlorian Hahn; incoming values. 352e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v3(i1 %c1, i1 %c2, i64 %a) { 353e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v3( 354e30c2578SFlorian Hahn; CHECK-NEXT: entry: 355e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 356e30c2578SFlorian Hahn; CHECK: bb1: 357e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 358e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4:%.*]] 359e30c2578SFlorian Hahn; CHECK: bb2: 360e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]] 361e30c2578SFlorian Hahn; CHECK: bb3: 362e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4]] 363e30c2578SFlorian Hahn; CHECK: bb4: 364e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ], [ 10, [[BB3]] ] 365e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 366e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 367e30c2578SFlorian Hahn; 368e30c2578SFlorian Hahnentry: 369e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 370e30c2578SFlorian Hahn 371e30c2578SFlorian Hahnbb1: 372e30c2578SFlorian Hahn %r = and i64 %a, 255 373e30c2578SFlorian Hahn br label %bb4 374e30c2578SFlorian Hahn 375e30c2578SFlorian Hahnbb2: 376e30c2578SFlorian Hahn br i1 %c2, label %bb3, label %bb4 377e30c2578SFlorian Hahn 378e30c2578SFlorian Hahnbb3: 379e30c2578SFlorian Hahn br label %bb4 380e30c2578SFlorian Hahn 381e30c2578SFlorian Hahnbb4: 382e30c2578SFlorian Hahn %p = phi i64 [ %r, %bb1 ], [ undef, %bb2], [ 10, %bb3 ] 383e30c2578SFlorian Hahn %res = and i64 %p, 255 384e30c2578SFlorian Hahn ret i64 %res 385e30c2578SFlorian Hahn} 386e30c2578SFlorian Hahn 387e30c2578SFlorian Hahn 388e30c2578SFlorian Hahndefine i64 @constant_range_and_phi_constant_undef(i1 %c1, i1 %c2, i64 %a) { 389e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_phi_constant_undef( 390e30c2578SFlorian Hahn; CHECK-NEXT: entry: 391e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 392e30c2578SFlorian Hahn; CHECK: bb1: 393e30c2578SFlorian Hahn; CHECK-NEXT: [[R:%.*]] = and i64 [[A:%.*]], 255 394e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB5:%.*]] 395e30c2578SFlorian Hahn; CHECK: bb2: 396e30c2578SFlorian Hahn; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4:%.*]] 397e30c2578SFlorian Hahn; CHECK: bb3: 398e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB4]] 399e30c2578SFlorian Hahn; CHECK: bb4: 400e30c2578SFlorian Hahn; CHECK-NEXT: br label [[BB5]] 401e30c2578SFlorian Hahn; CHECK: bb5: 402e30c2578SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB4]] ] 403e30c2578SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i64 [[P]], 255 404e30c2578SFlorian Hahn; CHECK-NEXT: ret i64 [[RES]] 405e30c2578SFlorian Hahn; 406e30c2578SFlorian Hahnentry: 407e30c2578SFlorian Hahn br i1 %c1, label %bb1, label %bb2 408e30c2578SFlorian Hahn 409e30c2578SFlorian Hahnbb1: 410e30c2578SFlorian Hahn %r = and i64 %a, 255 411e30c2578SFlorian Hahn br label %bb5 412e30c2578SFlorian Hahn 413e30c2578SFlorian Hahnbb2: 414e30c2578SFlorian Hahn br i1 %c2, label %bb3, label %bb4 415e30c2578SFlorian Hahn 416e30c2578SFlorian Hahnbb3: 417e30c2578SFlorian Hahn br label %bb4 418e30c2578SFlorian Hahn 419e30c2578SFlorian Hahnbb4: 420e30c2578SFlorian Hahn %p.1 = phi i64 [ 10, %bb2 ], [ undef, %bb3] 421e30c2578SFlorian Hahn br label %bb5 422e30c2578SFlorian Hahn 423e30c2578SFlorian Hahnbb5: 424e30c2578SFlorian Hahn %p = phi i64 [ %r, %bb1 ], [ %p.1, %bb4] 425e30c2578SFlorian Hahn %res = and i64 %p, 255 426e30c2578SFlorian Hahn ret i64 %res 427e30c2578SFlorian Hahn} 428