@@ -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