@@ -630,3 +630,68 @@ ptr.check:
630
630
exit:
631
631
ret i4 3
632
632
}
633
+
634
+ define i1 @test_nusw (ptr %p , i32 %x , i32 %y ) {
635
+ ; CHECK-LABEL: @test_nusw(
636
+ ; CHECK-NEXT: [[X_EXT:%.*]] = zext i32 [[X:%.*]] to i64
637
+ ; CHECK-NEXT: [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64
638
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[X_EXT]], [[Y_EXT]]
639
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]])
640
+ ; CHECK-NEXT: [[GEP_X:%.*]] = getelementptr nusw i8, ptr [[P:%.*]], i64 [[X_EXT]]
641
+ ; CHECK-NEXT: [[GEP_Y:%.*]] = getelementptr nusw i8, ptr [[P]], i64 [[Y_EXT]]
642
+ ; CHECK-NEXT: ret i1 true
643
+ ;
644
+ %x.ext = zext i32 %x to i64
645
+ %y.ext = zext i32 %y to i64
646
+ %cmp1 = icmp ugt i64 %x.ext , %y.ext
647
+ call void @llvm.assume (i1 %cmp1 )
648
+ %gep.x = getelementptr nusw i8 , ptr %p , i64 %x.ext
649
+ %gep.y = getelementptr nusw i8 , ptr %p , i64 %y.ext
650
+ %cmp2 = icmp ugt ptr %gep.x , %gep.y
651
+ ret i1 %cmp2
652
+ }
653
+
654
+ define i1 @test_nusw_nested (ptr %p , i32 %x , i32 %y ) {
655
+ ; CHECK-LABEL: @test_nusw_nested(
656
+ ; CHECK-NEXT: [[X_EXT:%.*]] = zext i32 [[X:%.*]] to i64
657
+ ; CHECK-NEXT: [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64
658
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[X_EXT]], [[Y_EXT]]
659
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]])
660
+ ; CHECK-NEXT: [[GEP_X:%.*]] = getelementptr nusw i8, ptr [[P:%.*]], i64 [[X_EXT]]
661
+ ; CHECK-NEXT: [[GEP_X1:%.*]] = getelementptr nusw i8, ptr [[GEP_X]], i64 1
662
+ ; CHECK-NEXT: [[GEP_Y:%.*]] = getelementptr nusw i8, ptr [[P]], i64 [[Y_EXT]]
663
+ ; CHECK-NEXT: ret i1 true
664
+ ;
665
+ %x.ext = zext i32 %x to i64
666
+ %y.ext = zext i32 %y to i64
667
+ %cmp1 = icmp ugt i64 %x.ext , %y.ext
668
+ call void @llvm.assume (i1 %cmp1 )
669
+ %gep.x = getelementptr nusw i8 , ptr %p , i64 %x.ext
670
+ %gep.x1 = getelementptr nusw i8 , ptr %gep.x , i64 1
671
+ %gep.y = getelementptr nusw i8 , ptr %p , i64 %y.ext
672
+ %cmp2 = icmp ugt ptr %gep.x1 , %gep.y
673
+ ret i1 %cmp2
674
+ }
675
+
676
+ define i1 @test_missing_nusw (ptr %p , i32 %x , i32 %y ) {
677
+ ; CHECK-LABEL: @test_missing_nusw(
678
+ ; CHECK-NEXT: [[X_EXT:%.*]] = zext i32 [[X:%.*]] to i64
679
+ ; CHECK-NEXT: [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64
680
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[X_EXT]], [[Y_EXT]]
681
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]])
682
+ ; CHECK-NEXT: [[GEP_X:%.*]] = getelementptr nusw i8, ptr [[P:%.*]], i64 [[X_EXT]]
683
+ ; CHECK-NEXT: [[GEP_X1:%.*]] = getelementptr i8, ptr [[GEP_X]], i64 1
684
+ ; CHECK-NEXT: [[GEP_Y:%.*]] = getelementptr nusw i8, ptr [[P]], i64 [[Y_EXT]]
685
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt ptr [[GEP_X1]], [[GEP_Y]]
686
+ ; CHECK-NEXT: ret i1 [[CMP2]]
687
+ ;
688
+ %x.ext = zext i32 %x to i64
689
+ %y.ext = zext i32 %y to i64
690
+ %cmp1 = icmp ugt i64 %x.ext , %y.ext
691
+ call void @llvm.assume (i1 %cmp1 )
692
+ %gep.x = getelementptr nusw i8 , ptr %p , i64 %x.ext
693
+ %gep.x1 = getelementptr i8 , ptr %gep.x , i64 1
694
+ %gep.y = getelementptr nusw i8 , ptr %p , i64 %y.ext
695
+ %cmp2 = icmp ugt ptr %gep.x1 , %gep.y
696
+ ret i1 %cmp2
697
+ }
0 commit comments