@@ -630,3 +630,68 @@ ptr.check:
630630exit:
631631 ret i4 3
632632}
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