@@ -349,4 +349,223 @@ bb.2:
349
349
ret void
350
350
}
351
351
352
+ ; Should not produce a broken phi
353
+
354
+ define void @broken_phi () {
355
+ ; GFX906-LABEL: define void @broken_phi(
356
+ ; GFX906-SAME: ) #[[ATTR0]] {
357
+ ; GFX906-NEXT: bb:
358
+ ; GFX906-NEXT: br label [[BB1:%.*]]
359
+ ; GFX906: bb1:
360
+ ; GFX906-NEXT: [[I:%.*]] = phi <4 x i8> [ <i8 1, i8 1, i8 1, i8 1>, [[BB:%.*]] ], [ [[I8:%.*]], [[BB7:%.*]] ]
361
+ ; GFX906-NEXT: br i1 false, label [[BB3:%.*]], label [[BB2:%.*]]
362
+ ; GFX906: bb2:
363
+ ; GFX906-NEXT: br label [[BB3]]
364
+ ; GFX906: bb3:
365
+ ; GFX906-NEXT: [[I4:%.*]] = phi <4 x i8> [ zeroinitializer, [[BB2]] ], [ [[I]], [[BB1]] ]
366
+ ; GFX906-NEXT: br i1 false, label [[BB7]], label [[BB5:%.*]]
367
+ ; GFX906: bb5:
368
+ ; GFX906-NEXT: [[I6:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[I4]], <4 x i8> zeroinitializer)
369
+ ; GFX906-NEXT: br label [[BB7]]
370
+ ; GFX906: bb7:
371
+ ; GFX906-NEXT: [[I8]] = phi <4 x i8> [ zeroinitializer, [[BB5]] ], [ zeroinitializer, [[BB3]] ]
372
+ ; GFX906-NEXT: br label [[BB1]]
373
+ ;
374
+ bb:
375
+ br label %bb1
376
+ bb1:
377
+ %i = phi <4 x i8 > [ <i8 1 , i8 1 , i8 1 , i8 1 >, %bb ], [ %i8 , %bb7 ]
378
+ br i1 false , label %bb3 , label %bb2
379
+ bb2:
380
+ br label %bb3
381
+ bb3:
382
+ %i4 = phi <4 x i8 > [ zeroinitializer , %bb2 ], [ %i , %bb1 ]
383
+ br i1 false , label %bb7 , label %bb5
384
+ bb5:
385
+ %i6 = call <4 x i8 > @llvm.smax.v4i8 (<4 x i8 > %i4 , <4 x i8 > zeroinitializer )
386
+ br label %bb7
387
+ bb7:
388
+ %i8 = phi <4 x i8 > [ zeroinitializer , %bb5 ], [ zeroinitializer , %bb3 ]
389
+ br label %bb1
390
+ }
391
+
392
+ ; %sel1 should just use %sel0 instead of trying to convert back the
393
+ ; converted version of %sel0
394
+
395
+ define amdgpu_kernel void @reuseOp () {
396
+ ; GFX906-LABEL: define amdgpu_kernel void @reuseOp(
397
+ ; GFX906-SAME: ) #[[ATTR0]] {
398
+ ; GFX906-NEXT: entry:
399
+ ; GFX906-NEXT: [[VEC1:%.*]] = insertelement <16 x i8> zeroinitializer, i8 0, i64 0
400
+ ; GFX906-NEXT: [[VEC1_BC:%.*]] = bitcast <16 x i8> [[VEC1]] to <4 x i32>
401
+ ; GFX906-NEXT: br label [[BB_1:%.*]]
402
+ ; GFX906: bb.1:
403
+ ; GFX906-NEXT: [[VEC1_BC_BC:%.*]] = bitcast <4 x i32> [[VEC1_BC]] to <16 x i8>
404
+ ; GFX906-NEXT: [[SEL0:%.*]] = select i1 false, <16 x i8> zeroinitializer, <16 x i8> zeroinitializer
405
+ ; GFX906-NEXT: [[SEL0_BC:%.*]] = bitcast <16 x i8> [[SEL0]] to <4 x i32>
406
+ ; GFX906-NEXT: [[SEL1:%.*]] = select i1 false, <16 x i8> [[VEC1_BC_BC]], <16 x i8> [[SEL0]]
407
+ ; GFX906-NEXT: br label [[BB_2:%.*]]
408
+ ; GFX906: bb.2:
409
+ ; GFX906-NEXT: [[SEL0_BC_BC:%.*]] = bitcast <4 x i32> [[SEL0_BC]] to <16 x i8>
410
+ ; GFX906-NEXT: [[VAL:%.*]] = extractelement <16 x i8> [[SEL0_BC_BC]], i64 0
411
+ ; GFX906-NEXT: ret void
412
+ ;
413
+ entry:
414
+ %vec1 = insertelement <16 x i8 > zeroinitializer , i8 0 , i64 0
415
+ br label %bb.1
416
+
417
+ bb.1 :
418
+ %sel0 = select i1 false , <16 x i8 > zeroinitializer , <16 x i8 > zeroinitializer
419
+ %sel1 = select i1 false , <16 x i8 > %vec1 , <16 x i8 > %sel0
420
+ br label %bb.2
421
+
422
+ bb.2 :
423
+ %val = extractelement <16 x i8 > %sel0 , i64 0
424
+ ret void
425
+ }
426
+
427
+
428
+ define amdgpu_kernel void @deletedPHI (i32 %in0 , i1 %cmp , <10 x i8 > %invec0 ) {
429
+ ; GFX906-LABEL: define amdgpu_kernel void @deletedPHI(
430
+ ; GFX906-SAME: i32 [[IN0:%.*]], i1 [[CMP:%.*]], <10 x i8> [[INVEC0:%.*]]) #[[ATTR0]] {
431
+ ; GFX906-NEXT: entry:
432
+ ; GFX906-NEXT: br label [[BB_1:%.*]]
433
+ ; GFX906: bb.1:
434
+ ; GFX906-NEXT: [[PHI0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[BB_11:%.*]] ]
435
+ ; GFX906-NEXT: [[PHI1:%.*]] = phi <10 x i8> [ <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, [[ENTRY]] ], [ [[VEC1:%.*]], [[BB_11]] ]
436
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_3:%.*]], label [[BB_2:%.*]]
437
+ ; GFX906: bb.2:
438
+ ; GFX906-NEXT: br label [[BB_3]]
439
+ ; GFX906: bb.3:
440
+ ; GFX906-NEXT: [[PHI2:%.*]] = phi <10 x i8> [ zeroinitializer, [[BB_2]] ], [ [[PHI1]], [[BB_1]] ]
441
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_5:%.*]], label [[BB_4:%.*]]
442
+ ; GFX906: bb.4:
443
+ ; GFX906-NEXT: [[VEC0:%.*]] = insertelement <10 x i8> [[PHI2]], i8 0, i64 0
444
+ ; GFX906-NEXT: br label [[BB_5]]
445
+ ; GFX906: bb.5:
446
+ ; GFX906-NEXT: [[PHI3:%.*]] = phi <10 x i8> [ [[VEC0]], [[BB_4]] ], [ [[PHI2]], [[BB_3]] ]
447
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_7:%.*]], label [[BB_6:%.*]]
448
+ ; GFX906: bb.6:
449
+ ; GFX906-NEXT: br label [[BB_7]]
450
+ ; GFX906: bb.7:
451
+ ; GFX906-NEXT: [[PHI4:%.*]] = phi <10 x i8> [ [[INVEC0]], [[BB_6]] ], [ [[PHI3]], [[BB_5]] ]
452
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_9:%.*]], label [[BB_8:%.*]]
453
+ ; GFX906: bb.8:
454
+ ; GFX906-NEXT: br label [[BB_9]]
455
+ ; GFX906: bb.9:
456
+ ; GFX906-NEXT: [[PHI5:%.*]] = phi <10 x i8> [ [[INVEC0]], [[BB_8]] ], [ [[PHI4]], [[BB_7]] ]
457
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_11]], label [[BB_10:%.*]]
458
+ ; GFX906: bb.10:
459
+ ; GFX906-NEXT: br label [[BB_11]]
460
+ ; GFX906: bb.11:
461
+ ; GFX906-NEXT: [[PHI6:%.*]] = phi <10 x i8> [ zeroinitializer, [[BB_10]] ], [ [[PHI5]], [[BB_9]] ]
462
+ ; GFX906-NEXT: [[VEC1]] = shufflevector <10 x i8> [[PHI6]], <10 x i8> zeroinitializer, <10 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 15, i32 16, i32 17, i32 18, i32 19>
463
+ ; GFX906-NEXT: br label [[BB_1]]
464
+ ;
465
+ entry:
466
+ br label %bb.1
467
+
468
+ bb.1 :
469
+ %phi0 = phi i32 [ 0 , %entry ], [ 1 , %bb.11 ]
470
+ %phi1 = phi <10 x i8 > [ <i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 >, %entry ], [ %vec1 , %bb.11 ]
471
+ br i1 %cmp , label %bb.3 , label %bb.2
472
+
473
+ bb.2 :
474
+ br label %bb.3
475
+
476
+ bb.3 :
477
+ %phi2 = phi <10 x i8 > [ zeroinitializer , %bb.2 ], [ %phi1 , %bb.1 ]
478
+ br i1 %cmp , label %bb.5 , label %bb.4
479
+
480
+ bb.4 :
481
+ %vec0 = insertelement <10 x i8 > %phi2 , i8 0 , i64 0
482
+ br label %bb.5
483
+
484
+ bb.5 : ; preds = %bb.4, %bb.3
485
+ %phi3 = phi <10 x i8 > [ %vec0 , %bb.4 ], [ %phi2 , %bb.3 ]
486
+ br i1 %cmp , label %bb.7 , label %bb.6
487
+
488
+ bb.6 :
489
+ br label %bb.7
490
+
491
+ bb.7 : ; preds = %bb.6, %bb.5
492
+ %phi4 = phi <10 x i8 > [ %invec0 , %bb.6 ], [ %phi3 , %bb.5 ]
493
+ br i1 %cmp , label %bb.9 , label %bb.8
494
+
495
+ bb.8 :
496
+ br label %bb.9
497
+
498
+ bb.9 :
499
+ %phi5 = phi <10 x i8 > [ %invec0 , %bb.8 ], [ %phi4 , %bb.7 ]
500
+ br i1 %cmp , label %bb.11 , label %bb.10
501
+
502
+ bb.10 :
503
+ br label %bb.11
504
+
505
+ bb.11 :
506
+ %phi6 = phi <10 x i8 > [ zeroinitializer , %bb.10 ], [ %phi5 , %bb.9 ]
507
+ %vec1 = shufflevector <10 x i8 > %phi6 , <10 x i8 > zeroinitializer , <10 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 15 , i32 16 , i32 17 , i32 18 , i32 19 >
508
+ br label %bb.1
509
+ }
510
+
511
+ define amdgpu_kernel void @multiple_unwind (i1 %cmp , <10 x i8 > %invec ) {
512
+ ; GFX906-LABEL: define amdgpu_kernel void @multiple_unwind(
513
+ ; GFX906-SAME: i1 [[CMP:%.*]], <10 x i8> [[INVEC:%.*]]) #[[ATTR0]] {
514
+ ; GFX906-NEXT: entry:
515
+ ; GFX906-NEXT: br label [[BB_1:%.*]]
516
+ ; GFX906: bb.1:
517
+ ; GFX906-NEXT: [[PHI0:%.*]] = phi <10 x i8> [ <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, [[ENTRY:%.*]] ], [ [[PHI3:%.*]], [[BB_8:%.*]] ]
518
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_3:%.*]], label [[BB_2:%.*]]
519
+ ; GFX906: bb.2:
520
+ ; GFX906-NEXT: br label [[BB_3]]
521
+ ; GFX906: bb.3:
522
+ ; GFX906-NEXT: [[PHI1:%.*]] = phi <10 x i8> [ zeroinitializer, [[BB_2]] ], [ [[PHI0]], [[BB_1]] ]
523
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_5:%.*]], label [[BB_4:%.*]]
524
+ ; GFX906: bb.4:
525
+ ; GFX906-NEXT: br label [[BB_5]]
526
+ ; GFX906: bb.5:
527
+ ; GFX906-NEXT: [[PHI2:%.*]] = phi <10 x i8> [ [[PHI0]], [[BB_4]] ], [ [[PHI1]], [[BB_3]] ]
528
+ ; GFX906-NEXT: br i1 [[CMP]], label [[BB_7:%.*]], label [[BB_6:%.*]]
529
+ ; GFX906: bb.6:
530
+ ; GFX906-NEXT: br label [[BB_7]]
531
+ ; GFX906: bb.7:
532
+ ; GFX906-NEXT: [[PHI3]] = phi <10 x i8> [ [[INVEC]], [[BB_6]] ], [ [[PHI2]], [[BB_5]] ]
533
+ ; GFX906-NEXT: br label [[BB_8]]
534
+ ; GFX906: bb.8:
535
+ ; GFX906-NEXT: br label [[BB_1]]
536
+ ;
537
+ entry:
538
+ br label %bb.1
539
+
540
+ bb.1 :
541
+ %phi0 = phi <10 x i8 > [ <i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 >, %entry ], [ %phi3 , %bb.8 ]
542
+ br i1 %cmp , label %bb.3 , label %bb.2
543
+
544
+ bb.2 :
545
+ br label %bb.3
546
+
547
+ bb.3 :
548
+ %phi1 = phi <10 x i8 > [ zeroinitializer , %bb.2 ], [ %phi0 , %bb.1 ]
549
+ br i1 %cmp , label %bb.5 , label %bb.4
550
+
551
+ bb.4 :
552
+ br label %bb.5
553
+
554
+ bb.5 :
555
+ %phi2 = phi <10 x i8 > [ %phi0 , %bb.4 ], [ %phi1 , %bb.3 ]
556
+ br i1 %cmp , label %bb.7 , label %bb.6
557
+
558
+ bb.6 : ; preds = %bb.5
559
+ br label %bb.7
560
+
561
+ bb.7 :
562
+ %phi3 = phi <10 x i8 > [ %invec , %bb.6 ], [ %phi2 , %bb.5 ]
563
+ br label %bb.8
564
+
565
+ bb.8 :
566
+ br label %bb.1
567
+ }
568
+
569
+
570
+
352
571
declare i32 @llvm.amdgcn.workitem.id.x ()
0 commit comments