@@ -417,3 +417,141 @@ loop:
417417exit:
418418 ret void
419419}
420+
421+ ; FIXME: These are miscompilation issues.
422+ define void @test_fp_to_int_irrealizable_initval () {
423+ ; CHECK-LABEL: @test_fp_to_int_irrealizable_initval(
424+ ; CHECK-NEXT: entry:
425+ ; CHECK-NEXT: br label [[LOOP:%.*]]
426+ ; CHECK: loop:
427+ ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100000000, [[ENTRY:%.*]] ], [ [[IV_NEXT_INT:%.*]], [[LOOP]] ]
428+ ; CHECK-NEXT: call void @opaque()
429+ ; CHECK-NEXT: [[IV_NEXT_INT]] = add nsw i32 [[IV_INT]], -17
430+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i32 [[IV_NEXT_INT]], 25
431+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
432+ ; CHECK: exit:
433+ ; CHECK-NEXT: ret void
434+ ;
435+ entry:
436+ br label %loop
437+
438+ loop:
439+ %iv = phi float [ 1 .000000e+08 , %entry ], [ %iv.next , %loop ]
440+ call void @opaque ()
441+ %iv.next = fadd float %iv , -1 .700000e+01
442+ %cmp = fcmp ult float %iv.next , 2 .500000e+01
443+ br i1 %cmp , label %exit , label %loop
444+
445+ exit:
446+ ret void
447+ }
448+
449+ define void @test_fp_to_int_irrealizable_exitval () {
450+ ; CHECK-LABEL: @test_fp_to_int_irrealizable_exitval(
451+ ; CHECK-NEXT: entry:
452+ ; CHECK-NEXT: br label [[LOOP:%.*]]
453+ ; CHECK: loop:
454+ ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 25, [[ENTRY:%.*]] ], [ [[IV_NEXT_INT:%.*]], [[LOOP]] ]
455+ ; CHECK-NEXT: call void @opaque()
456+ ; CHECK-NEXT: [[IV_NEXT_INT]] = add nuw nsw i32 [[IV_INT]], 17
457+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[IV_NEXT_INT]], 100000000
458+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
459+ ; CHECK: exit:
460+ ; CHECK-NEXT: ret void
461+ ;
462+ entry:
463+ br label %loop
464+
465+ loop:
466+ %iv = phi float [ 2 .500000e+01 , %entry ], [ %iv.next , %loop ]
467+ call void @opaque ()
468+ %iv.next = fadd float %iv , 1 .700000e+01
469+ %cmp = fcmp ugt float %iv.next , 1 .000000e+08
470+ br i1 %cmp , label %exit , label %loop
471+
472+ exit:
473+ ret void
474+ }
475+
476+ define void @test_fp_to_int_irrealizable_negative_exitval () {
477+ ; CHECK-LABEL: @test_fp_to_int_irrealizable_negative_exitval(
478+ ; CHECK-NEXT: entry:
479+ ; CHECK-NEXT: br label [[LOOP:%.*]]
480+ ; CHECK: loop:
481+ ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ -25, [[ENTRY:%.*]] ], [ [[IV_NEXT_INT:%.*]], [[LOOP]] ]
482+ ; CHECK-NEXT: call void @opaque()
483+ ; CHECK-NEXT: [[IV_NEXT_INT]] = add nsw i32 [[IV_INT]], -17
484+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[IV_NEXT_INT]], -100000000
485+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
486+ ; CHECK: exit:
487+ ; CHECK-NEXT: ret void
488+ ;
489+ entry:
490+ br label %loop
491+
492+ loop:
493+ %iv = phi float [ -2 .500000e+01 , %entry ], [ %iv.next , %loop ]
494+ call void @opaque ()
495+ %iv.next = fadd float %iv , -1 .700000e+01
496+ %cmp = fcmp ult float %iv.next , -1 .000000e+08
497+ br i1 %cmp , label %exit , label %loop
498+
499+ exit:
500+ ret void
501+ }
502+
503+ define void @test_fp_to_int_irrealizable_exitval_pow_2_24 () {
504+ ; CHECK-LABEL: @test_fp_to_int_irrealizable_exitval_pow_2_24(
505+ ; CHECK-NEXT: entry:
506+ ; CHECK-NEXT: br label [[LOOP:%.*]]
507+ ; CHECK: loop:
508+ ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_INT:%.*]], [[LOOP]] ]
509+ ; CHECK-NEXT: call void @opaque()
510+ ; CHECK-NEXT: [[IV_NEXT_INT]] = add nuw nsw i32 [[IV_INT]], 1
511+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[IV_NEXT_INT]], 16777216
512+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
513+ ; CHECK: exit:
514+ ; CHECK-NEXT: ret void
515+ ;
516+ entry:
517+ br label %loop
518+
519+ loop:
520+ %iv = phi float [ 0 .000000e+00 , %entry ], [ %iv.next , %loop ]
521+ call void @opaque ()
522+ %iv.next = fadd float %iv , 1 .000000e+00
523+ %cmp = fcmp ugt float %iv.next , 0x4170000000000000
524+ br i1 %cmp , label %exit , label %loop
525+
526+ exit:
527+ ret void
528+ }
529+
530+ define void @test_fp_to_int_irrealizable_exitval_int64_min () {
531+ ; CHECK-LABEL: @test_fp_to_int_irrealizable_exitval_int64_min(
532+ ; CHECK-NEXT: entry:
533+ ; CHECK-NEXT: br label [[LOOP:%.*]]
534+ ; CHECK: loop:
535+ ; CHECK-NEXT: [[IV:%.*]] = phi double [ 2.500000e+01, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
536+ ; CHECK-NEXT: call void @opaque()
537+ ; CHECK-NEXT: [[IV_NEXT]] = fadd double [[IV]], 1.700000e+01
538+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[IV_NEXT]], 0xC3E0000000000000
539+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
540+ ; CHECK: exit:
541+ ; CHECK-NEXT: ret void
542+ ;
543+ entry:
544+ br label %loop
545+
546+ loop:
547+ %iv = phi double [ 2 .500000e+01 , %entry ], [ %iv.next , %loop ]
548+ call void @opaque ()
549+ %iv.next = fadd double %iv , 1 .700000e+01
550+ %cmp = fcmp ult double %iv.next , 0xC3E0000000000000
551+ br i1 %cmp , label %exit , label %loop
552+
553+ exit:
554+ ret void
555+ }
556+
557+ declare void @opaque ()
0 commit comments