@@ -384,3 +384,137 @@ end:
384
384
%r = phi i32 [ %i0 , %entry ], [ %i0 , %left ], [ %i1 , %right ]
385
385
ret i32 %r
386
386
}
387
+
388
+ define i32 @extractvalue_of_constant_phi (i1 %c ) {
389
+ ; CHECK-LABEL: @extractvalue_of_constant_phi(
390
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
391
+ ; CHECK: if:
392
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
393
+ ; CHECK: else:
394
+ ; CHECK-NEXT: br label [[JOIN]]
395
+ ; CHECK: join:
396
+ ; CHECK-NEXT: [[PHI:%.*]] = phi { i32, i32 } [ { i32 1, i32 2 }, [[IF]] ], [ { i32 3, i32 4 }, [[ELSE]] ]
397
+ ; CHECK-NEXT: [[EV:%.*]] = extractvalue { i32, i32 } [[PHI]], 0
398
+ ; CHECK-NEXT: ret i32 [[EV]]
399
+ ;
400
+ br i1 %c , label %if , label %else
401
+
402
+ if:
403
+ br label %join
404
+
405
+ else:
406
+ br label %join
407
+
408
+ join:
409
+ %phi = phi { i32 , i32 } [ { i32 1 , i32 2 }, %if ], [ { i32 3 , i32 4 }, %else ]
410
+ %ev = extractvalue { i32 , i32 } %phi , 0
411
+ ret i32 %ev
412
+ }
413
+
414
+ define i32 @extractvalue_of_one_constant_phi (i1 %c , { i32 , i32 } %arg ) {
415
+ ; CHECK-LABEL: @extractvalue_of_one_constant_phi(
416
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
417
+ ; CHECK: if:
418
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
419
+ ; CHECK: else:
420
+ ; CHECK-NEXT: br label [[JOIN]]
421
+ ; CHECK: join:
422
+ ; CHECK-NEXT: [[PHI:%.*]] = phi { i32, i32 } [ [[ARG:%.*]], [[IF]] ], [ { i32 3, i32 4 }, [[ELSE]] ]
423
+ ; CHECK-NEXT: [[EV:%.*]] = extractvalue { i32, i32 } [[PHI]], 0
424
+ ; CHECK-NEXT: ret i32 [[EV]]
425
+ ;
426
+ br i1 %c , label %if , label %else
427
+
428
+ if:
429
+ br label %join
430
+
431
+ else:
432
+ br label %join
433
+
434
+ join:
435
+ %phi = phi { i32 , i32 } [ %arg , %if ], [ { i32 3 , i32 4 }, %else ]
436
+ %ev = extractvalue { i32 , i32 } %phi , 0
437
+ ret i32 %ev
438
+ }
439
+
440
+ define i32 @extractvalue_of_constant_phi_multi_index (i1 %c ) {
441
+ ; CHECK-LABEL: @extractvalue_of_constant_phi_multi_index(
442
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
443
+ ; CHECK: if:
444
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
445
+ ; CHECK: else:
446
+ ; CHECK-NEXT: br label [[JOIN]]
447
+ ; CHECK: join:
448
+ ; CHECK-NEXT: [[PHI:%.*]] = phi { i32, { i32, i32 } } [ { i32 1, { i32, i32 } { i32 2, i32 3 } }, [[IF]] ], [ { i32 4, { i32, i32 } { i32 5, i32 6 } }, [[ELSE]] ]
449
+ ; CHECK-NEXT: [[EV:%.*]] = extractvalue { i32, { i32, i32 } } [[PHI]], 1, 1
450
+ ; CHECK-NEXT: ret i32 [[EV]]
451
+ ;
452
+ br i1 %c , label %if , label %else
453
+
454
+ if:
455
+ br label %join
456
+
457
+ else:
458
+ br label %join
459
+
460
+ join:
461
+ %phi = phi { i32 , { i32 , i32 } } [ { i32 1 , { i32 , i32 } { i32 2 , i32 3 } }, %if ], [ { i32 4 , { i32 , i32 } { i32 5 , i32 6 } }, %else ]
462
+ %ev = extractvalue { i32 , { i32 , i32 } } %phi , 1 , 1
463
+ ret i32 %ev
464
+ }
465
+
466
+ define i32 @extractvalue_of_one_constant_phi_multi_index (i1 %c , { i32 , { i32 , i32 } } %arg ) {
467
+ ; CHECK-LABEL: @extractvalue_of_one_constant_phi_multi_index(
468
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
469
+ ; CHECK: if:
470
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
471
+ ; CHECK: else:
472
+ ; CHECK-NEXT: br label [[JOIN]]
473
+ ; CHECK: join:
474
+ ; CHECK-NEXT: [[PHI:%.*]] = phi { i32, { i32, i32 } } [ [[ARG:%.*]], [[IF]] ], [ { i32 4, { i32, i32 } { i32 5, i32 6 } }, [[ELSE]] ]
475
+ ; CHECK-NEXT: [[EV:%.*]] = extractvalue { i32, { i32, i32 } } [[PHI]], 1, 1
476
+ ; CHECK-NEXT: ret i32 [[EV]]
477
+ ;
478
+ br i1 %c , label %if , label %else
479
+
480
+ if:
481
+ br label %join
482
+
483
+ else:
484
+ br label %join
485
+
486
+ join:
487
+ %phi = phi { i32 , { i32 , i32 } } [ %arg , %if ], [ { i32 4 , { i32 , i32 } { i32 5 , i32 6 } }, %else ]
488
+ %ev = extractvalue { i32 , { i32 , i32 } } %phi , 1 , 1
489
+ ret i32 %ev
490
+ }
491
+
492
+ define i32 @extractvalue_of_constant_phi_multiuse (i1 %c ) {
493
+ ; CHECK-LABEL: @extractvalue_of_constant_phi_multiuse(
494
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
495
+ ; CHECK: if:
496
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
497
+ ; CHECK: else:
498
+ ; CHECK-NEXT: br label [[JOIN]]
499
+ ; CHECK: join:
500
+ ; CHECK-NEXT: [[PHI:%.*]] = phi { i32, i32 } [ { i32 1, i32 2 }, [[IF]] ], [ { i32 3, i32 4 }, [[ELSE]] ]
501
+ ; CHECK-NEXT: [[EV0:%.*]] = extractvalue { i32, i32 } [[PHI]], 0
502
+ ; CHECK-NEXT: [[EV1:%.*]] = extractvalue { i32, i32 } [[PHI]], 1
503
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[EV0]], [[EV1]]
504
+ ; CHECK-NEXT: ret i32 [[ADD]]
505
+ ;
506
+ br i1 %c , label %if , label %else
507
+
508
+ if:
509
+ br label %join
510
+
511
+ else:
512
+ br label %join
513
+
514
+ join:
515
+ %phi = phi { i32 , i32 } [ { i32 1 , i32 2 }, %if ], [ { i32 3 , i32 4 }, %else ]
516
+ %ev0 = extractvalue { i32 , i32 } %phi , 0
517
+ %ev1 = extractvalue { i32 , i32 } %phi , 1
518
+ %add = add i32 %ev0 , %ev1
519
+ ret i32 %add
520
+ }
0 commit comments