brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.1 KiB · 23e1698 Raw
768 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @llvm.assume(i1 noundef) #05 6define i1 @gep_constant_positive_index(ptr %dst, ptr %lower, ptr %upper) {7; CHECK-LABEL: @gep_constant_positive_index(8; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i64 49; CHECK-NEXT:    [[PRE_DST_LOWER:%.*]] = icmp uge ptr [[DST]], [[LOWER:%.*]]10; CHECK-NEXT:    [[PRE_DST_UPPER:%.*]] = icmp ult ptr [[DST_ADD_4]], [[UPPER:%.*]]11; CHECK-NEXT:    [[AND:%.*]] = and i1 [[PRE_DST_LOWER]], [[PRE_DST_UPPER]]12; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]13; CHECK:       then:14; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true15; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 316; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true17; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], true18; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], true19; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], true20; CHECK-NEXT:    [[DST_ADD_5:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 521; CHECK-NEXT:    [[CMP_DST_ADD_5_UPPER:%.*]] = icmp ult ptr [[DST_ADD_5]], [[UPPER]]22; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], true23; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[CMP_DST_ADD_5_UPPER]]24; CHECK-NEXT:    ret i1 [[RES_7]]25; CHECK:       else:26; CHECK-NEXT:    ret i1 false27;28  %dst.add.4 = getelementptr inbounds i8, ptr %dst, i64 429  %pre.dst.lower = icmp uge ptr %dst, %lower30  %pre.dst.upper = icmp ult ptr %dst.add.4, %upper31  %and = and i1 %pre.dst.lower, %pre.dst.upper32  br i1 %and, label %then, label %else33 34then:35  %cmp.dst.lower = icmp uge ptr %dst, %lower36  %cmp.dst.upper = icmp ult ptr %dst, %upper37  %res.1 = xor i1 %cmp.dst.lower, %cmp.dst.upper38  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 339  %cmp.dst.add.3.lower = icmp uge ptr %dst.add.3, %lower40  %cmp.dst.add.3.upper = icmp ult ptr %dst.add.3, %upper41  %res.2 = xor i1 %res.1, %cmp.dst.add.3.lower42  %res.3 = xor i1 %res.2, %cmp.dst.add.3.upper43  %cmp.dst.add.4.lower = icmp uge ptr %dst.add.4, %lower44  %cmp.dst.add.4.upper = icmp ult ptr %dst.add.4, %upper45  %res.4 = xor i1 %res.3, %cmp.dst.add.4.lower46  %res.5 = xor i1 %res.4, %cmp.dst.add.4.upper47  %dst.add.5 = getelementptr inbounds i8, ptr %dst, i64 548  %cmp.dst.add.5.lower = icmp uge ptr %dst.add.5, %lower49  %cmp.dst.add.5.upper = icmp ult ptr %dst.add.5, %upper50  %res.6 = xor i1 %res.5, %cmp.dst.add.5.lower51  %res.7 = xor i1 %res.6, %cmp.dst.add.5.upper52  ret i1 %res.753 54else:55  ret i1 false56}57 58define i1 @gep_constant_negative_index(ptr %dst, ptr %lower, ptr %upper) {59; CHECK-LABEL: @gep_constant_negative_index(60; CHECK-NEXT:    [[DST_SUB_4:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i64 -461; CHECK-NEXT:    [[PRE_DST_LOWER:%.*]] = icmp uge ptr [[DST]], [[LOWER:%.*]]62; CHECK-NEXT:    [[PRE_DST_UPPER:%.*]] = icmp ult ptr [[DST_SUB_4]], [[UPPER:%.*]]63; CHECK-NEXT:    [[AND:%.*]] = and i1 [[PRE_DST_LOWER]], [[PRE_DST_UPPER]]64; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]65; CHECK:       then:66; CHECK-NEXT:    [[CMP_DST_UPPER:%.*]] = icmp ult ptr [[DST]], [[UPPER]]67; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[CMP_DST_UPPER]]68; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 -369; CHECK-NEXT:    [[CMP_DST_SUB_3_LOWER:%.*]] = icmp uge ptr [[DST_SUB_3]], [[LOWER]]70; CHECK-NEXT:    [[CMP_DST_SUB_3_UPPER:%.*]] = icmp ult ptr [[DST_SUB_3]], [[UPPER]]71; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_DST_SUB_3_LOWER]]72; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[CMP_DST_SUB_3_UPPER]]73; CHECK-NEXT:    [[CMP_DST_SUB_4_LOWER:%.*]] = icmp uge ptr [[DST_SUB_4]], [[LOWER]]74; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[CMP_DST_SUB_4_LOWER]]75; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], true76; CHECK-NEXT:    [[DST_SUB_5:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 -577; CHECK-NEXT:    [[CMP_DST_SUB_5_LOWER:%.*]] = icmp uge ptr [[DST_SUB_5]], [[LOWER]]78; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[CMP_DST_SUB_5_LOWER]]79; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], true80; CHECK-NEXT:    ret i1 [[RES_7]]81; CHECK:       else:82; CHECK-NEXT:    [[ELSE_CMP_DST_LOWER:%.*]] = icmp uge ptr [[DST]], [[LOWER]]83; CHECK-NEXT:    [[ELSE_CMP_DST_UPPER:%.*]] = icmp ult ptr [[DST]], [[UPPER]]84; CHECK-NEXT:    [[ELSE_RES_1:%.*]] = xor i1 [[ELSE_CMP_DST_LOWER]], [[ELSE_CMP_DST_UPPER]]85; CHECK-NEXT:    [[ELSE_DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 -386; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_3_LOWER:%.*]] = icmp uge ptr [[ELSE_DST_SUB_3]], [[LOWER]]87; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_3_UPPER:%.*]] = icmp ult ptr [[ELSE_DST_SUB_3]], [[UPPER]]88; CHECK-NEXT:    [[ELSE_RES_2:%.*]] = xor i1 [[ELSE_RES_1]], [[ELSE_CMP_DST_SUB_3_LOWER]]89; CHECK-NEXT:    [[ELSE_RES_3:%.*]] = xor i1 [[ELSE_RES_2]], [[ELSE_CMP_DST_SUB_3_UPPER]]90; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_4_LOWER:%.*]] = icmp uge ptr [[DST_SUB_4]], [[LOWER]]91; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_4_UPPER:%.*]] = icmp ult ptr [[DST_SUB_4]], [[UPPER]]92; CHECK-NEXT:    [[ELSE_RES_4:%.*]] = xor i1 [[ELSE_RES_3]], [[ELSE_CMP_DST_SUB_4_LOWER]]93; CHECK-NEXT:    [[ELSE_RES_5:%.*]] = xor i1 [[ELSE_RES_4]], [[ELSE_CMP_DST_SUB_4_UPPER]]94; CHECK-NEXT:    [[ELSE_DST_SUB_5:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 -595; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_5_LOWER:%.*]] = icmp uge ptr [[ELSE_DST_SUB_5]], [[LOWER]]96; CHECK-NEXT:    [[ELSE_CMP_DST_SUB_5_UPPER:%.*]] = icmp ult ptr [[ELSE_DST_SUB_5]], [[UPPER]]97; CHECK-NEXT:    [[ELSE_RES_6:%.*]] = xor i1 [[ELSE_RES_5]], [[ELSE_CMP_DST_SUB_5_LOWER]]98; CHECK-NEXT:    [[ELSE_RES_7:%.*]] = xor i1 [[ELSE_RES_6]], [[ELSE_CMP_DST_SUB_5_UPPER]]99; CHECK-NEXT:    ret i1 [[ELSE_RES_7]]100;101  %dst.sub.4 = getelementptr inbounds i8, ptr %dst, i64 -4102  %pre.dst.lower = icmp uge ptr %dst, %lower103  %pre.dst.upper = icmp ult ptr %dst.sub.4, %upper104  %and = and i1 %pre.dst.lower, %pre.dst.upper105  br i1 %and, label %then, label %else106 107then:108  %cmp.dst.lower = icmp uge ptr %dst, %lower109  %cmp.dst.upper = icmp ult ptr %dst, %upper110  %res.1 = xor i1 %cmp.dst.lower, %cmp.dst.upper111  %dst.sub.3 = getelementptr inbounds i8, ptr %dst, i64 -3112  %cmp.dst.sub.3.lower = icmp uge ptr %dst.sub.3, %lower113  %cmp.dst.sub.3.upper = icmp ult ptr %dst.sub.3, %upper114  %res.2 = xor i1 %res.1, %cmp.dst.sub.3.lower115  %res.3 = xor i1 %res.2, %cmp.dst.sub.3.upper116  %cmp.dst.sub.4.lower = icmp uge ptr %dst.sub.4, %lower117  %cmp.dst.sub.4.upper = icmp ult ptr %dst.sub.4, %upper118  %res.4 = xor i1 %res.3, %cmp.dst.sub.4.lower119  %res.5 = xor i1 %res.4, %cmp.dst.sub.4.upper120  %dst.sub.5 = getelementptr inbounds i8, ptr %dst, i64 -5121  %cmp.dst.sub.5.lower = icmp uge ptr %dst.sub.5, %lower122  %cmp.dst.sub.5.upper = icmp ult ptr %dst.sub.5, %upper123  %res.6 = xor i1 %res.5, %cmp.dst.sub.5.lower124  %res.7 = xor i1 %res.6, %cmp.dst.sub.5.upper125  ret i1 %res.7126 127else:128  %else.cmp.dst.lower = icmp uge ptr %dst, %lower129  %else.cmp.dst.upper = icmp ult ptr %dst, %upper130  %else.res.1 = xor i1 %else.cmp.dst.lower, %else.cmp.dst.upper131  %else.dst.sub.3 = getelementptr inbounds i8, ptr %dst, i64 -3132  %else.cmp.dst.sub.3.lower = icmp uge ptr %else.dst.sub.3, %lower133  %else.cmp.dst.sub.3.upper = icmp ult ptr %else.dst.sub.3, %upper134  %else.res.2 = xor i1 %else.res.1, %else.cmp.dst.sub.3.lower135  %else.res.3 = xor i1 %else.res.2, %else.cmp.dst.sub.3.upper136  %else.cmp.dst.sub.4.lower = icmp uge ptr %dst.sub.4, %lower137  %else.cmp.dst.sub.4.upper = icmp ult ptr %dst.sub.4, %upper138  %else.res.4 = xor i1 %else.res.3, %else.cmp.dst.sub.4.lower139  %else.res.5 = xor i1 %else.res.4, %else.cmp.dst.sub.4.upper140  %else.dst.sub.5 = getelementptr inbounds i8, ptr %dst, i64 -5141  %else.cmp.dst.sub.5.lower = icmp uge ptr %else.dst.sub.5, %lower142  %else.cmp.dst.sub.5.upper = icmp ult ptr %else.dst.sub.5, %upper143  %else.res.6 = xor i1 %else.res.5, %else.cmp.dst.sub.5.lower144  %else.res.7 = xor i1 %else.res.6, %else.cmp.dst.sub.5.upper145  ret i1 %else.res.7146}147 148define i4 @ptr_N_signed_positive_explicit_check_constant_step(ptr %src, ptr %lower, ptr %upper, i16 %N) {149; CHECK-LABEL: @ptr_N_signed_positive_explicit_check_constant_step(150; CHECK-NEXT:  entry:151; CHECK-NEXT:    [[N_POS:%.*]] = icmp sge i16 [[N:%.*]], 0152; CHECK-NEXT:    br i1 [[N_POS]], label [[ENTRY_1:%.*]], label [[TRAP_BB:%.*]]153; CHECK:       entry.1:154; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N]]155; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]156; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]157; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]158; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB]], label [[STEP_CHECK:%.*]]159; CHECK:       trap.bb:160; CHECK-NEXT:    ret i4 2161; CHECK:       step.check:162; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 1, [[N]]163; CHECK-NEXT:    br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]164; CHECK:       ptr.check:165; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 1166; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 false, false167; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]168; CHECK:       exit:169; CHECK-NEXT:    ret i4 3170;171entry:172  %N.pos = icmp sge i16 %N, 0173  br i1 %N.pos, label %entry.1, label %trap.bb174 175entry.1:176  %src.end = getelementptr inbounds i8, ptr %src, i16 %N177  %cmp.src.start = icmp ult ptr %src, %lower178  %cmp.src.end = icmp uge ptr %src.end, %upper179  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end180  br i1 %or.precond.0, label %trap.bb, label %step.check181 182trap.bb:183  ret i4 2184 185step.check:186  %step.ult.N = icmp ult i16 1, %N187  br i1 %step.ult.N, label %ptr.check, label %exit188 189ptr.check:190  %src.step = getelementptr inbounds i8, ptr %src, i16 1191  %cmp.step.start = icmp ult ptr %src.step, %lower192  %cmp.step.end = icmp uge ptr %src.step, %upper193  %or.check = or i1 %cmp.step.start, %cmp.step.end194  br i1 %or.check, label %trap.bb, label %exit195 196exit:197  ret i4 3198}199 200; Same as ptr_N_signed_positive_explicit_check_constant_step, but without inbounds.201define i4 @ptr_N_signed_positive_explicit_check_constant_step_no_inbonds(ptr %src, ptr %lower, ptr %upper, i16 %N) {202; CHECK-LABEL: @ptr_N_signed_positive_explicit_check_constant_step_no_inbonds(203; CHECK-NEXT:  entry:204; CHECK-NEXT:    [[N_POS:%.*]] = icmp sge i16 [[N:%.*]], 0205; CHECK-NEXT:    br i1 [[N_POS]], label [[ENTRY_1:%.*]], label [[TRAP_BB:%.*]]206; CHECK:       entry.1:207; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i16 [[N]]208; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]209; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]210; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]211; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB]], label [[STEP_CHECK:%.*]]212; CHECK:       trap.bb:213; CHECK-NEXT:    ret i4 2214; CHECK:       step.check:215; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 1, [[N]]216; CHECK-NEXT:    br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]217; CHECK:       ptr.check:218; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr i8, ptr [[SRC]], i16 1219; CHECK-NEXT:    [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]220; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]221; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]222; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]223; CHECK:       exit:224; CHECK-NEXT:    ret i4 3225;226entry:227  %N.pos = icmp sge i16 %N, 0228  br i1 %N.pos, label %entry.1, label %trap.bb229 230entry.1:231  %src.end = getelementptr i8, ptr %src, i16 %N232  %cmp.src.start = icmp ult ptr %src, %lower233  %cmp.src.end = icmp uge ptr %src.end, %upper234  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end235  br i1 %or.precond.0, label %trap.bb, label %step.check236 237trap.bb:238  ret i4 2239 240step.check:241  %step.ult.N = icmp ult i16 1, %N242  br i1 %step.ult.N, label %ptr.check, label %exit243 244ptr.check:245  %src.step = getelementptr i8, ptr %src, i16 1246  %cmp.step.start = icmp ult ptr %src.step, %lower247  %cmp.step.end = icmp uge ptr %src.step, %upper248  %or.check = or i1 %cmp.step.start, %cmp.step.end249  br i1 %or.check, label %trap.bb, label %exit250 251exit:252  ret i4 3253}254 255define i4 @ptr_N_and_step_signed_positive_explicit_check_constant_step(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 %step) {256; CHECK-LABEL: @ptr_N_and_step_signed_positive_explicit_check_constant_step(257; CHECK-NEXT:  entry:258; CHECK-NEXT:    [[N_POS:%.*]] = icmp sge i16 [[N:%.*]], 0259; CHECK-NEXT:    [[STEP_POS:%.*]] = icmp sge i16 [[STEP:%.*]], 0260; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[N_POS]], [[STEP_POS]]261; CHECK-NEXT:    br i1 [[AND_1]], label [[ENTRY_1:%.*]], label [[TRAP_BB:%.*]]262; CHECK:       entry.1:263; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N]]264; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]265; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]266; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]267; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB]], label [[STEP_CHECK:%.*]]268; CHECK:       trap.bb:269; CHECK-NEXT:    ret i4 2270; CHECK:       step.check:271; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP]], [[N]]272; CHECK-NEXT:    [[AND_2:%.*]] = and i1 true, [[STEP_ULT_N]]273; CHECK-NEXT:    br i1 [[AND_2]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]274; CHECK:       ptr.check:275; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 1276; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 false, false277; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]278; CHECK:       exit:279; CHECK-NEXT:    ret i4 3280;281entry:282  %N.pos = icmp sge i16 %N, 0283  %step.pos = icmp sge i16 %step, 0284  %and.1 = and i1 %N.pos, %step.pos285  br i1 %and.1, label %entry.1, label %trap.bb286 287entry.1:288  %src.end = getelementptr inbounds i8, ptr %src, i16 %N289  %cmp.src.start = icmp ult ptr %src, %lower290  %cmp.src.end = icmp uge ptr %src.end, %upper291  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end292  br i1 %or.precond.0, label %trap.bb, label %step.check293 294trap.bb:295  ret i4 2296 297step.check:298  %step.uge.0 = icmp uge i16 %step, 0299  %step.ult.N = icmp ult i16 %step, %N300  %and.2 = and i1 %step.uge.0, %step.ult.N301  br i1 %and.2, label %ptr.check, label %exit302 303ptr.check:304  %src.step = getelementptr inbounds i8, ptr %src, i16 1305  %cmp.step.start = icmp ult ptr %src.step, %lower306  %cmp.step.end = icmp uge ptr %src.step, %upper307  %or.check = or i1 %cmp.step.start, %cmp.step.end308  br i1 %or.check, label %trap.bb, label %exit309 310exit:311  ret i4 3312}313 314define i4 @ptr_N_and_step_signed_positive_unsigned_checks_only(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 %step) {315; CHECK-LABEL: @ptr_N_and_step_signed_positive_unsigned_checks_only(316; CHECK-NEXT:  entry:317; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]]318; CHECK-NEXT:    [[NO_OVERFLOW:%.*]] = icmp ule ptr [[SRC]], [[SRC_END]]319; CHECK-NEXT:    br i1 [[NO_OVERFLOW]], label [[ENTRY_1:%.*]], label [[TRAP_BB:%.*]]320; CHECK:       entry.1:321; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]322; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]323; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]324; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB]], label [[STEP_CHECK:%.*]]325; CHECK:       trap.bb:326; CHECK-NEXT:    ret i4 2327; CHECK:       step.check:328; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP:%.*]], [[N]]329; CHECK-NEXT:    [[AND_2:%.*]] = and i1 true, [[STEP_ULT_N]]330; CHECK-NEXT:    br i1 [[AND_2]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]331; CHECK:       ptr.check:332; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 1333; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]334; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 false, [[CMP_STEP_END]]335; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]336; CHECK:       exit:337; CHECK-NEXT:    ret i4 3338;339entry:340  %src.end = getelementptr inbounds i8, ptr %src, i16 %N341  %no.overflow = icmp ule ptr %src, %src.end342  br i1 %no.overflow, label %entry.1, label %trap.bb343 344entry.1:345  %cmp.src.start = icmp ult ptr %src, %lower346  %cmp.src.end = icmp uge ptr %src.end, %upper347  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end348  br i1 %or.precond.0, label %trap.bb, label %step.check349 350trap.bb:351  ret i4 2352 353step.check:354  %step.uge.0 = icmp uge i16 %step, 0355  %step.ult.N = icmp ult i16 %step, %N356  %and.2 = and i1 %step.uge.0, %step.ult.N357  br i1 %and.2, label %ptr.check, label %exit358 359ptr.check:360  %src.step = getelementptr inbounds i8, ptr %src, i16 1361  %cmp.step.start = icmp ult ptr %src.step, %lower362  %cmp.step.end = icmp uge ptr %src.step, %upper363  %or.check = or i1 %cmp.step.start, %cmp.step.end364  br i1 %or.check, label %trap.bb, label %exit365 366exit:367  ret i4 3368}369 370define i4 @ptr_N_signed_positive(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 %step) {371; CHECK-LABEL: @ptr_N_signed_positive(372; CHECK-NEXT:  entry:373; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]]374; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]375; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]376; CHECK-NEXT:    [[N_NEG:%.*]] = icmp slt i16 [[N]], 0377; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]378; CHECK-NEXT:    [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], [[N_NEG]]379; CHECK-NEXT:    br i1 [[OR_PRECOND_1]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]380; CHECK:       trap.bb:381; CHECK-NEXT:    ret i4 2382; CHECK:       step.check:383; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP:%.*]], [[N]]384; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]385; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]386; CHECK:       ptr.check:387; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 [[STEP]]388; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 false, false389; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]390; CHECK:       exit:391; CHECK-NEXT:    ret i4 3392;393entry:394  %src.end = getelementptr inbounds i8, ptr %src, i16 %N395  %cmp.src.start = icmp ult ptr %src, %lower396  %cmp.src.end = icmp uge ptr %src.end, %upper397  %N.neg = icmp slt i16 %N, 0398  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end399  %or.precond.1 = or i1 %or.precond.0, %N.neg400  br i1 %or.precond.1, label %trap.bb, label %step.check401 402trap.bb:403  ret i4 2404 405step.check:406  %step.pos = icmp uge i16 %step, 0407  %step.ult.N = icmp ult i16 %step, %N408  %and.step = and i1 %step.pos, %step.ult.N409  br i1 %and.step, label %ptr.check, label %exit410 411ptr.check:412  %src.step = getelementptr inbounds i8, ptr %src, i16 %step413  %cmp.step.start = icmp ult ptr %src.step, %lower414  %cmp.step.end = icmp uge ptr %src.step, %upper415  %or.check = or i1 %cmp.step.start, %cmp.step.end416  br i1 %or.check, label %trap.bb, label %exit417 418exit:419  ret i4 3420}421 422define i4 @ptr_N_could_be_negative(ptr %src, ptr %lower, ptr %upper, i8 %N, i8 %step) {423; CHECK-LABEL: @ptr_N_could_be_negative(424; CHECK-NEXT:  entry:425; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i8 [[N:%.*]]426; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]427; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]428; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]429; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]430; CHECK:       trap.bb:431; CHECK-NEXT:    ret i4 2432; CHECK:       step.check:433; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i8 [[STEP:%.*]], [[N]]434; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]435; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]436; CHECK:       ptr.check:437; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[STEP]]438; CHECK-NEXT:    [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]439; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]440; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]441; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]442; CHECK:       exit:443; CHECK-NEXT:    ret i4 3444;445entry:446  %src.end = getelementptr inbounds i8, ptr %src, i8 %N447  %cmp.src.start = icmp ult ptr %src, %lower448  %cmp.src.end = icmp uge ptr %src.end, %upper449  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end450  br i1 %or.precond.0, label %trap.bb, label %step.check451 452trap.bb:453  ret i4 2454 455step.check:456  %step.pos = icmp uge i8 %step, 0457  %step.ult.N = icmp ult i8 %step, %N458  %and.step = and i1 %step.pos, %step.ult.N459  br i1 %and.step, label %ptr.check, label %exit460 461ptr.check:462  %src.step = getelementptr inbounds i8, ptr %src, i8 %step463  %cmp.step.start = icmp ult ptr %src.step, %lower464  %cmp.step.end = icmp uge ptr %src.step, %upper465  %or.check = or i1 %cmp.step.start, %cmp.step.end466  br i1 %or.check, label %trap.bb, label %exit467 468exit:469  ret i4 3470}471 472define i4 @ptr_src_uge_end(ptr %src, ptr %lower, ptr %upper, i8 %N, i8 %step) {473; CHECK-LABEL: @ptr_src_uge_end(474; CHECK-NEXT:  entry:475; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i8 [[N:%.*]]476; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]477; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]478; CHECK-NEXT:    [[CMP_OVERFLOW:%.*]] = icmp ugt ptr [[SRC]], [[SRC_END]]479; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]480; CHECK-NEXT:    [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], [[CMP_OVERFLOW]]481; CHECK-NEXT:    br i1 [[OR_PRECOND_1]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]482; CHECK:       trap.bb:483; CHECK-NEXT:    ret i4 2484; CHECK:       step.check:485; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i8 [[STEP:%.*]], [[N]]486; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]487; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]488; CHECK:       ptr.check:489; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[STEP]]490; CHECK-NEXT:    [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]491; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]492; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]493; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]494; CHECK:       exit:495; CHECK-NEXT:    ret i4 3496;497entry:498  %src.end = getelementptr inbounds i8, ptr %src, i8 %N499  %cmp.src.start = icmp ult ptr %src, %lower500  %cmp.src.end = icmp uge ptr %src.end, %upper501  %cmp.overflow = icmp ugt ptr %src, %src.end502  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end503  %or.precond.1 = or i1 %or.precond.0, %cmp.overflow504  br i1 %or.precond.1, label %trap.bb, label %step.check505 506trap.bb:507  ret i4 2508 509step.check:510  %step.pos = icmp uge i8 %step, 0511  %step.ult.N = icmp ult i8 %step, %N512  %and.step = and i1 %step.pos, %step.ult.N513  br i1 %and.step, label %ptr.check, label %exit514 515ptr.check:516  %src.step = getelementptr inbounds i8, ptr %src, i8 %step517  %cmp.step.start = icmp ult ptr %src.step, %lower518  %cmp.step.end = icmp uge ptr %src.step, %upper519  %or.check = or i1 %cmp.step.start, %cmp.step.end520  br i1 %or.check, label %trap.bb, label %exit521 522exit:523  ret i4 3524}525 526; N might be negative, meaning %src.end could be < %src! Cannot remove checks!527define i4 @ptr_N_unsigned_positive(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 %step) {528; CHECK-LABEL: @ptr_N_unsigned_positive(529; CHECK-NEXT:  entry:530; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]]531; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]532; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]533; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]534; CHECK-NEXT:    [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], false535; CHECK-NEXT:    br i1 [[OR_PRECOND_1]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]536; CHECK:       trap.bb:537; CHECK-NEXT:    ret i4 2538; CHECK:       step.check:539; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP:%.*]], [[N]]540; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]541; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]542; CHECK:       ptr.check:543; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 [[STEP]]544; CHECK-NEXT:    [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]545; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]546; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]547; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]548; CHECK:       exit:549; CHECK-NEXT:    ret i4 3550;551entry:552  %src.end = getelementptr inbounds i8, ptr %src, i16 %N553  %cmp.src.start = icmp ult ptr %src, %lower554  %cmp.src.end = icmp uge ptr %src.end, %upper555  %N.neg = icmp ult i16 %N, 0556  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end557  %or.precond.1 = or i1 %or.precond.0, %N.neg558  br i1 %or.precond.1, label %trap.bb, label %step.check559 560trap.bb:561  ret i4 2562 563step.check:564  %step.pos = icmp uge i16 %step, 0565  %step.ult.N = icmp ult i16 %step, %N566  %and.step = and i1 %step.pos, %step.ult.N567  br i1 %and.step, label %ptr.check, label %exit568 569ptr.check:570  %src.step = getelementptr inbounds i8, ptr %src, i16 %step571  %cmp.step.start = icmp ult ptr %src.step, %lower572  %cmp.step.end = icmp uge ptr %src.step, %upper573  %or.check = or i1 %cmp.step.start, %cmp.step.end574  br i1 %or.check, label %trap.bb, label %exit575 576exit:577  ret i4 3578}579 580define i4 @ptr_N_signed_positive_assume(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 %step) {581; CHECK-LABEL: @ptr_N_signed_positive_assume(582; CHECK-NEXT:  entry:583; CHECK-NEXT:    [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]]584; CHECK-NEXT:    [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]585; CHECK-NEXT:    [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]586; CHECK-NEXT:    [[N_NEG:%.*]] = icmp slt i16 [[N]], 0587; CHECK-NEXT:    call void @llvm.assume(i1 [[N_NEG]])588; CHECK-NEXT:    [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]589; CHECK-NEXT:    br i1 [[OR_PRECOND_0]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]590; CHECK:       trap.bb:591; CHECK-NEXT:    ret i4 2592; CHECK:       step.check:593; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP:%.*]], [[N]]594; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]595; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]596; CHECK:       ptr.check:597; CHECK-NEXT:    [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 [[STEP]]598; CHECK-NEXT:    [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]599; CHECK-NEXT:    [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]600; CHECK-NEXT:    [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]601; CHECK-NEXT:    br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]602; CHECK:       exit:603; CHECK-NEXT:    ret i4 3604;605entry:606  %src.end = getelementptr inbounds i8, ptr %src, i16 %N607  %cmp.src.start = icmp ult ptr %src, %lower608  %cmp.src.end = icmp uge ptr %src.end, %upper609  %N.neg = icmp slt i16 %N, 0610  call void @llvm.assume(i1 %N.neg)611  %or.precond.0 = or i1 %cmp.src.start, %cmp.src.end612  br i1 %or.precond.0, label %trap.bb, label %step.check613 614trap.bb:615  ret i4 2616 617step.check:618  %step.pos = icmp uge i16 %step, 0619  %step.ult.N = icmp ult i16 %step, %N620  %and.step = and i1 %step.pos, %step.ult.N621  br i1 %and.step, label %ptr.check, label %exit622 623ptr.check:624  %src.step = getelementptr inbounds i8, ptr %src, i16 %step625  %cmp.step.start = icmp ult ptr %src.step, %lower626  %cmp.step.end = icmp uge ptr %src.step, %upper627  %or.check = or i1 %cmp.step.start, %cmp.step.end628  br i1 %or.check, label %trap.bb, label %exit629 630exit:631  ret i4 3632}633 634define i1 @test_nusw(ptr %p, i32 %x, i32 %y) {635; CHECK-LABEL: @test_nusw(636; CHECK-NEXT:    [[X_EXT:%.*]] = zext i32 [[X:%.*]] to i64637; CHECK-NEXT:    [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64638; 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 true643;644  %x.ext = zext i32 %x to i64645  %y.ext = zext i32 %y to i64646  %cmp1 = icmp ugt i64 %x.ext, %y.ext647  call void @llvm.assume(i1 %cmp1)648  %gep.x = getelementptr nusw i8, ptr %p, i64 %x.ext649  %gep.y = getelementptr nusw i8, ptr %p, i64 %y.ext650  %cmp2 = icmp ugt ptr %gep.x, %gep.y651  ret i1 %cmp2652}653 654define 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 i64657; CHECK-NEXT:    [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64658; 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 1662; CHECK-NEXT:    [[GEP_Y:%.*]] = getelementptr nusw i8, ptr [[P]], i64 [[Y_EXT]]663; CHECK-NEXT:    ret i1 true664;665  %x.ext = zext i32 %x to i64666  %y.ext = zext i32 %y to i64667  %cmp1 = icmp ugt i64 %x.ext, %y.ext668  call void @llvm.assume(i1 %cmp1)669  %gep.x = getelementptr nusw i8, ptr %p, i64 %x.ext670  %gep.x1 = getelementptr nusw i8, ptr %gep.x, i64 1671  %gep.y = getelementptr nusw i8, ptr %p, i64 %y.ext672  %cmp2 = icmp ugt ptr %gep.x1, %gep.y673  ret i1 %cmp2674}675 676define 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 i64679; CHECK-NEXT:    [[Y_EXT:%.*]] = zext i32 [[Y:%.*]] to i64680; 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 1684; 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 i64689  %y.ext = zext i32 %y to i64690  %cmp1 = icmp ugt i64 %x.ext, %y.ext691  call void @llvm.assume(i1 %cmp1)692  %gep.x = getelementptr nusw i8, ptr %p, i64 %x.ext693  %gep.x1 = getelementptr i8, ptr %gep.x, i64 1694  %gep.y = getelementptr nusw i8, ptr %p, i64 %y.ext695  %cmp2 = icmp ugt ptr %gep.x1, %gep.y696  ret i1 %cmp2697}698 699define i1 @test_nuw(ptr %p, i64 %x, i64 %y) {700; CHECK-LABEL: @test_nuw(701; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i64 [[X:%.*]], [[Y:%.*]]702; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP1]])703; CHECK-NEXT:    [[GEP_X:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[X]]704; CHECK-NEXT:    [[GEP_Y:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[Y]]705; CHECK-NEXT:    ret i1 true706;707  %cmp1 = icmp ugt i64 %x, %y708  call void @llvm.assume(i1 %cmp1)709  %gep.x = getelementptr nuw i8, ptr %p, i64 %x710  %gep.y = getelementptr nuw i8, ptr %p, i64 %y711  %cmp2 = icmp ugt ptr %gep.x, %gep.y712  ret i1 %cmp2713}714 715define i1 @test_nuw_nested(ptr %p, i64 %x, i64 %y) {716; CHECK-LABEL: @test_nuw_nested(717; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i64 [[X:%.*]], [[Y:%.*]]718; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP1]])719; CHECK-NEXT:    [[GEP_X:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[X]]720; CHECK-NEXT:    [[GEP_X1:%.*]] = getelementptr nuw i8, ptr [[GEP_X]], i64 1721; CHECK-NEXT:    [[GEP_Y:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[Y]]722; CHECK-NEXT:    ret i1 true723;724  %cmp1 = icmp ugt i64 %x, %y725  call void @llvm.assume(i1 %cmp1)726  %gep.x = getelementptr nuw i8, ptr %p, i64 %x727  %gep.x1 = getelementptr nuw i8, ptr %gep.x, i64 1728  %gep.y = getelementptr nuw i8, ptr %p, i64 %y729  %cmp2 = icmp ugt ptr %gep.x1, %gep.y730  ret i1 %cmp2731}732 733define i1 @test_nuw_nested_missing_nuw(ptr %p, i64 %x, i64 %y) {734; CHECK-LABEL: @test_nuw_nested_missing_nuw(735; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i64 [[X:%.*]], [[Y:%.*]]736; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP1]])737; CHECK-NEXT:    [[GEP_X:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[X]]738; CHECK-NEXT:    [[GEP_X1:%.*]] = getelementptr nuw i8, ptr [[GEP_X]], i64 1739; CHECK-NEXT:    [[GEP_Y:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[Y]]740; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt ptr [[GEP_X1]], [[GEP_Y]]741; CHECK-NEXT:    ret i1 [[CMP2]]742;743  %cmp1 = icmp ugt i64 %x, %y744  call void @llvm.assume(i1 %cmp1)745  %gep.x = getelementptr i8, ptr %p, i64 %x746  %gep.x1 = getelementptr nuw i8, ptr %gep.x, i64 1747  %gep.y = getelementptr nuw i8, ptr %p, i64 %y748  %cmp2 = icmp ugt ptr %gep.x1, %gep.y749  ret i1 %cmp2750}751 752define i1 @test_nuw_incorrect_precondition(ptr %p, i64 %x, i64 %y) {753; CHECK-LABEL: @test_nuw_incorrect_precondition(754; CHECK-NEXT:    [[CMP1:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]755; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP1]])756; CHECK-NEXT:    [[GEP_X:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[X]]757; CHECK-NEXT:    [[GEP_Y:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[Y]]758; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt ptr [[GEP_X]], [[GEP_Y]]759; CHECK-NEXT:    ret i1 [[CMP2]]760;761  %cmp1 = icmp uge i64 %x, %y762  call void @llvm.assume(i1 %cmp1)763  %gep.x = getelementptr nuw i8, ptr %p, i64 %x764  %gep.y = getelementptr nuw i8, ptr %p, i64 %y765  %cmp2 = icmp ugt ptr %gep.x, %gep.y766  ret i1 %cmp2767}768