brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.5 KiB · 5e24164 Raw
392 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_add_1_uge_inbounds(ptr %dst, ptr %lower) {7; CHECK-LABEL: @gep_add_1_uge_inbounds(8; CHECK-NEXT:    [[PRE:%.*]] = icmp uge ptr [[DST:%.*]], [[LOWER:%.*]]9; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])10; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 311; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 112; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_1]], i64 113; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true14; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 315; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true16; CHECK-NEXT:    ret i1 [[RES_2]]17;18  %pre = icmp uge ptr %dst, %lower19  call void @llvm.assume(i1 %pre)20  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 321  %dst.add.1 = getelementptr inbounds i8, ptr %dst, i64 122  %cmp.add.1 = icmp uge ptr %dst.add.1, %lower23  %dst.add.2 = getelementptr inbounds i8, ptr %dst.add.1, i64 124  %cmp.add.3 = icmp uge ptr %dst.add.3, %lower25  %res.1 = xor i1 %cmp.add.1, %cmp.add.326  %dst.add.4 = getelementptr inbounds i8, ptr %dst.add.3, i64 327  %cmp.add.4 = icmp uge ptr %dst.add.4, %lower28  %res.2 = xor i1 %res.1, %cmp.add.429  ret i1 %res.230}31 32define i1 @gep_add_1_uge_inbounds_scalable_vector(ptr %dst, ptr %lower) {33; CHECK-LABEL: @gep_add_1_uge_inbounds_scalable_vector(34; CHECK-NEXT:    [[PRE:%.*]] = icmp uge ptr [[DST:%.*]], [[LOWER:%.*]]35; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])36; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds <vscale x 4 x i8>, ptr [[DST]], i64 337; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds <vscale x 4 x i8>, ptr [[DST]], i64 138; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp uge ptr [[DST_ADD_1]], [[LOWER]]39; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr inbounds <vscale x 4 x i8>, ptr [[DST_ADD_1]], i64 140; CHECK-NEXT:    [[CMP_ADD_3:%.*]] = icmp uge ptr [[DST_ADD_3]], [[LOWER]]41; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_ADD_1]], [[CMP_ADD_3]]42; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds <vscale x 4 x i8>, ptr [[DST_ADD_3]], i64 343; CHECK-NEXT:    [[CMP_ADD_4:%.*]] = icmp uge ptr [[DST_ADD_4]], [[LOWER]]44; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_ADD_4]]45; CHECK-NEXT:    ret i1 [[RES_2]]46;47  %pre = icmp uge ptr %dst, %lower48  call void @llvm.assume(i1 %pre)49  %dst.add.3 = getelementptr inbounds <vscale x 4 x i8>, ptr %dst, i64 350  %dst.add.1 = getelementptr inbounds <vscale x 4 x i8>, ptr %dst, i64 151  %cmp.add.1 = icmp uge ptr %dst.add.1, %lower52  %dst.add.2 = getelementptr inbounds <vscale x 4 x i8>, ptr %dst.add.1, i64 153  %cmp.add.3 = icmp uge ptr %dst.add.3, %lower54  %res.1 = xor i1 %cmp.add.1, %cmp.add.355  %dst.add.4 = getelementptr inbounds <vscale x 4 x i8>, ptr %dst.add.3, i64 356  %cmp.add.4 = icmp uge ptr %dst.add.4, %lower57  %res.2 = xor i1 %res.1, %cmp.add.458  ret i1 %res.259}60 61define i1 @gep_add_1_uge_only_inner_inbounds(ptr %dst, ptr %lower) {62; CHECK-LABEL: @gep_add_1_uge_only_inner_inbounds(63; CHECK-NEXT:    [[PRE:%.*]] = icmp uge ptr [[DST:%.*]], [[LOWER:%.*]]64; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])65; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 366; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 167; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr i8, ptr [[DST_ADD_1]], i64 168; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true69; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 370; CHECK-NEXT:    [[CMP_ADD_4:%.*]] = icmp uge ptr [[DST_ADD_4]], [[LOWER]]71; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_ADD_4]]72; CHECK-NEXT:    ret i1 [[RES_2]]73;74  %pre = icmp uge ptr %dst, %lower75  call void @llvm.assume(i1 %pre)76  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 377  %dst.add.1 = getelementptr inbounds i8, ptr %dst, i64 178  %cmp.add.1 = icmp uge ptr %dst.add.1, %lower79  %dst.add.2 = getelementptr i8, ptr %dst.add.1, i64 180  %cmp.add.3 = icmp uge ptr %dst.add.3, %lower81  %res.1 = xor i1 %cmp.add.1, %cmp.add.382  %dst.add.4 = getelementptr i8, ptr %dst.add.3, i64 383  %cmp.add.4 = icmp uge ptr %dst.add.4, %lower84  %res.2 = xor i1 %res.1, %cmp.add.485  ret i1 %res.286}87 88define i1 @gep_add_1_uge_only_outer_inbounds(ptr %dst, ptr %lower) {89; CHECK-LABEL: @gep_add_1_uge_only_outer_inbounds(90; CHECK-NEXT:    [[PRE:%.*]] = icmp uge ptr [[DST:%.*]], [[LOWER:%.*]]91; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])92; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr i8, ptr [[DST]], i64 393; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr i8, ptr [[DST]], i64 194; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp uge ptr [[DST_ADD_1]], [[LOWER]]95; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_1]], i64 196; CHECK-NEXT:    [[CMP_ADD_3:%.*]] = icmp uge ptr [[DST_ADD_3]], [[LOWER]]97; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_ADD_1]], [[CMP_ADD_3]]98; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 399; CHECK-NEXT:    [[CMP_ADD_4:%.*]] = icmp uge ptr [[DST_ADD_4]], [[LOWER]]100; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_ADD_4]]101; CHECK-NEXT:    ret i1 [[RES_2]]102;103  %pre = icmp uge ptr %dst, %lower104  call void @llvm.assume(i1 %pre)105  %dst.add.3 = getelementptr i8, ptr %dst, i64 3106  %dst.add.1 = getelementptr i8, ptr %dst, i64 1107  %cmp.add.1 = icmp uge ptr %dst.add.1, %lower108  %dst.add.2 = getelementptr inbounds i8, ptr %dst.add.1, i64 1109  %cmp.add.3 = icmp uge ptr %dst.add.3, %lower110  %res.1 = xor i1 %cmp.add.1, %cmp.add.3111  %dst.add.4 = getelementptr inbounds i8, ptr %dst.add.3, i64 3112  %cmp.add.4 = icmp uge ptr %dst.add.4, %lower113  %res.2 = xor i1 %res.1, %cmp.add.4114  ret i1 %res.2115}116 117define i1 @gep_add_1_uge_no_inbounds(ptr %dst, ptr %lower) {118; CHECK-LABEL: @gep_add_1_uge_no_inbounds(119; CHECK-NEXT:    [[PRE:%.*]] = icmp uge ptr [[DST:%.*]], [[LOWER:%.*]]120; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])121; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr i8, ptr [[DST]], i64 3122; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr i8, ptr [[DST]], i64 1123; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp uge ptr [[DST_ADD_1]], [[LOWER]]124; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr i8, ptr [[DST_ADD_1]], i64 1125; CHECK-NEXT:    [[CMP_ADD_3:%.*]] = icmp uge ptr [[DST_ADD_3]], [[LOWER]]126; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_ADD_1]], [[CMP_ADD_3]]127; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 3128; CHECK-NEXT:    [[CMP_ADD_4:%.*]] = icmp uge ptr [[DST_ADD_4]], [[LOWER]]129; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_ADD_4]]130; CHECK-NEXT:    ret i1 [[RES_2]]131;132  %pre = icmp uge ptr %dst, %lower133  call void @llvm.assume(i1 %pre)134  %dst.add.3 = getelementptr i8, ptr %dst, i64 3135  %dst.add.1 = getelementptr i8, ptr %dst, i64 1136  %cmp.add.1 = icmp uge ptr %dst.add.1, %lower137  %dst.add.2 = getelementptr i8, ptr %dst.add.1, i64 1138  %cmp.add.3 = icmp uge ptr %dst.add.3, %lower139  %res.1 = xor i1 %cmp.add.1, %cmp.add.3140  %dst.add.4 = getelementptr i8, ptr %dst.add.3, i64 3141  %cmp.add.4 = icmp uge ptr %dst.add.4, %lower142  %res.2 = xor i1 %res.1, %cmp.add.4143  ret i1 %res.2144}145 146define i1 @gep_add_1_ult(ptr %dst, ptr %lower, ptr %upper) {147; CHECK-LABEL: @gep_add_1_ult(148; CHECK-NEXT:    [[END:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i64 4149; CHECK-NEXT:    [[PRE:%.*]] = icmp ult ptr [[END]], [[UPPER:%.*]]150; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])151; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 1152; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_1]], i64 2153; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_1]], i64 3154; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true155; CHECK-NEXT:    [[DST_ADD_5:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_1]], i64 4156; CHECK-NEXT:    [[CMP_ADD_5:%.*]] = icmp ult ptr [[DST_ADD_5]], [[UPPER]]157; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_ADD_5]]158; CHECK-NEXT:    ret i1 [[RES_2]]159;160  %end = getelementptr inbounds i8, ptr %dst, i64 4161  %pre = icmp ult ptr %end, %upper162  call void @llvm.assume(i1 %pre)163  %dst.add.1 = getelementptr inbounds i8, ptr %dst, i64 1164  %dst.add.3 = getelementptr inbounds i8, ptr %dst.add.1, i64 2165  %cmp.add.3 = icmp ult ptr %dst.add.3, %upper166  %dst.add.4 = getelementptr inbounds i8, ptr %dst.add.1, i64 3167  %cmp.add.4 = icmp ult ptr %dst.add.4, %upper168  %res.1 = xor i1 %cmp.add.3, %cmp.add.4169  %dst.add.5 = getelementptr inbounds i8, ptr %dst.add.1, i64 4170  %cmp.add.5 = icmp ult ptr %dst.add.5, %upper171  %res.2 = xor i1 %res.1, %cmp.add.5172  ret i1 %res.2173}174 175define i1 @gep_add_ult_var_idx(ptr %dst, ptr %upper, i8 %idx) {176; CHECK-LABEL: @gep_add_ult_var_idx(177; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[IDX:%.*]], 0178; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])179; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16180; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[IDX_EXT]]181; CHECK-NEXT:    [[PRE:%.*]] = icmp ult ptr [[DST_ADD_IDX]], [[UPPER:%.*]]182; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])183; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 1184; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 2185; CHECK-NEXT:    [[CMP_ADD_2:%.*]] = icmp ule ptr [[DST_ADD_2]], [[UPPER]]186; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[CMP_ADD_2]]187; CHECK-NEXT:    ret i1 [[RES_1]]188;189  %not.zero = icmp ne i8 %idx, 0190  call void @llvm.assume(i1 %not.zero)191  %idx.ext = zext i8 %idx to i16192  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext193  %pre = icmp ult ptr %dst.add.idx, %upper194  call void @llvm.assume(i1 %pre)195  %dst.add.1 = getelementptr inbounds i8, ptr %dst.add.idx, i64 1196  %cmp.add.1 = icmp ule ptr %dst.add.1, %upper197  %dst.add.2 = getelementptr inbounds i8, ptr %dst.add.idx, i64 2198  %cmp.add.2 = icmp ule ptr %dst.add.2, %upper199  %res.1 = xor i1 %cmp.add.1, %cmp.add.2200  ret i1 %res.1201}202 203define i1 @gep_add_ult_var_idx_sgt_1(ptr %dst, ptr %upper, i8 %idx) {204; CHECK-LABEL: @gep_add_ult_var_idx_sgt_1(205; CHECK-NEXT:    [[SGT_1:%.*]] = icmp sgt i8 [[IDX:%.*]], 1206; CHECK-NEXT:    call void @llvm.assume(i1 [[SGT_1]])207; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16208; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[IDX_EXT]]209; CHECK-NEXT:    [[PRE:%.*]] = icmp ult ptr [[DST_ADD_IDX]], [[UPPER:%.*]]210; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])211; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 1212; CHECK-NEXT:    [[DST_ADD_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 2213; CHECK-NEXT:    [[CMP_ADD_2:%.*]] = icmp ule ptr [[DST_ADD_2]], [[UPPER]]214; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[CMP_ADD_2]]215; CHECK-NEXT:    ret i1 [[RES_1]]216;217  %sgt.1 = icmp sgt i8 %idx, 1218  call void @llvm.assume(i1 %sgt.1)219  %idx.ext = zext i8 %idx to i16220  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext221  %pre = icmp ult ptr %dst.add.idx, %upper222  call void @llvm.assume(i1 %pre)223  %dst.add.1 = getelementptr inbounds i8, ptr %dst.add.idx, i64 1224  %cmp.add.1 = icmp ule ptr %dst.add.1, %upper225  %dst.add.2 = getelementptr inbounds i8, ptr %dst.add.idx, i64 2226  %cmp.add.2 = icmp ule ptr %dst.add.2, %upper227  %res.1 = xor i1 %cmp.add.1, %cmp.add.2228  ret i1 %res.1229}230 231define i1 @gep_add_1_ult_var_idx_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {232; CHECK-LABEL: @gep_add_1_ult_var_idx_inbounds(233; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0234; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])235; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16236; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]237; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 1238; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp ult ptr [[DST_ADD_1]], [[UPPER:%.*]]239; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD_1]])240; CHECK-NEXT:    [[CMP_IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]]241; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_ULT_LEN]])242; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16243; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]244; CHECK-NEXT:    [[DST_ADD_IDX_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 1245; CHECK-NEXT:    [[DST_ADD_IDX_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 2246; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true247; CHECK-NEXT:    [[DST_ADD_IDX_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 3248; CHECK-NEXT:    [[CMP_IDX_3:%.*]] = icmp ult ptr [[DST_ADD_IDX_3]], [[UPPER]]249; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_IDX_3]]250; CHECK-NEXT:    ret i1 [[RES_2]]251;252  %not.zero = icmp ne i8 %len, 0253  call void @llvm.assume(i1 %not.zero)254  %len.ext = zext i8 %len to i16255  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext256  %dst.add.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 1257  %cmp.add.1 = icmp ult ptr %dst.add.1, %upper258  call void @llvm.assume(i1 %cmp.add.1)259  %cmp.idx.ult.len = icmp ult i8 %idx, %len260  call void @llvm.assume(i1 %cmp.idx.ult.len)261  %idx.ext = zext i8 %idx to i16262  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext263  %dst.add.idx.1 = getelementptr inbounds i8, ptr %dst.add.idx, i64 1264  %cmp.idx.1 = icmp ult ptr %dst.add.idx.1, %upper265  %dst.add.idx.2 = getelementptr inbounds i8, ptr %dst.add.idx, i64 2266  %cmp.idx.2 = icmp ult ptr %dst.add.idx.2, %upper267  %res.1 = xor i1 %cmp.idx.1, %cmp.idx.2268  %dst.add.idx.3 = getelementptr inbounds i8, ptr %dst.add.idx, i64 3269  %cmp.idx.3 = icmp ult ptr %dst.add.idx.3, %upper270  %res.2 = xor i1 %res.1, %cmp.idx.3271  ret i1 %res.2272}273 274define i1 @gep_add_1_ult_var_idx_only_inner_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {275; CHECK-LABEL: @gep_add_1_ult_var_idx_only_inner_inbounds(276; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0277; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])278; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16279; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]280; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 1281; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp ult ptr [[DST_ADD_1]], [[UPPER:%.*]]282; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD_1]])283; CHECK-NEXT:    [[CMP_IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]]284; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_ULT_LEN]])285; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16286; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]287; CHECK-NEXT:    [[DST_ADD_IDX_1:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 1288; CHECK-NEXT:    [[CMP_IDX_1:%.*]] = icmp ult ptr [[DST_ADD_IDX_1]], [[UPPER]]289; CHECK-NEXT:    [[DST_ADD_IDX_2:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 2290; CHECK-NEXT:    [[CMP_IDX_2:%.*]] = icmp ult ptr [[DST_ADD_IDX_2]], [[UPPER]]291; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_IDX_1]], [[CMP_IDX_2]]292; CHECK-NEXT:    [[DST_ADD_IDX_3:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 3293; CHECK-NEXT:    [[CMP_IDX_3:%.*]] = icmp ult ptr [[DST_ADD_IDX_3]], [[UPPER]]294; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_IDX_3]]295; CHECK-NEXT:    ret i1 [[RES_2]]296;297  %not.zero = icmp ne i8 %len, 0298  call void @llvm.assume(i1 %not.zero)299  %len.ext = zext i8 %len to i16300  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext301  %dst.add.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 1302  %cmp.add.1 = icmp ult ptr %dst.add.1, %upper303  call void @llvm.assume(i1 %cmp.add.1)304  %cmp.idx.ult.len = icmp ult i8 %idx, %len305  call void @llvm.assume(i1 %cmp.idx.ult.len)306  %idx.ext = zext i8 %idx to i16307  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext308  %dst.add.idx.1 = getelementptr i8, ptr %dst.add.idx, i64 1309  %cmp.idx.1 = icmp ult ptr %dst.add.idx.1, %upper310  %dst.add.idx.2 = getelementptr i8, ptr %dst.add.idx, i64 2311  %cmp.idx.2 = icmp ult ptr %dst.add.idx.2, %upper312  %res.1 = xor i1 %cmp.idx.1, %cmp.idx.2313  %dst.add.idx.3 = getelementptr i8, ptr %dst.add.idx, i64 3314  %cmp.idx.3 = icmp ult ptr %dst.add.idx.3, %upper315  %res.2 = xor i1 %res.1, %cmp.idx.3316  ret i1 %res.2317}318 319define i1 @gep_add_1_ult_var_idx_no_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {320; CHECK-LABEL: @gep_add_1_ult_var_idx_no_inbounds(321; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0322; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])323; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16324; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]325; CHECK-NEXT:    [[DST_ADD_1:%.*]] = getelementptr i8, ptr [[DST_ADD_LEN]], i64 1326; CHECK-NEXT:    [[CMP_ADD_1:%.*]] = icmp ult ptr [[DST_ADD_1]], [[UPPER:%.*]]327; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD_1]])328; CHECK-NEXT:    [[CMP_IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]]329; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_ULT_LEN]])330; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16331; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr i8, ptr [[DST]], i16 [[IDX_EXT]]332; CHECK-NEXT:    [[DST_ADD_IDX_1:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 1333; CHECK-NEXT:    [[CMP_IDX_1:%.*]] = icmp ult ptr [[DST_ADD_IDX_1]], [[UPPER]]334; CHECK-NEXT:    [[DST_ADD_IDX_2:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 2335; CHECK-NEXT:    [[CMP_IDX_2:%.*]] = icmp ult ptr [[DST_ADD_IDX_2]], [[UPPER]]336; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_IDX_1]], [[CMP_IDX_2]]337; CHECK-NEXT:    [[DST_ADD_IDX_3:%.*]] = getelementptr i8, ptr [[DST_ADD_IDX]], i64 3338; CHECK-NEXT:    [[CMP_IDX_3:%.*]] = icmp ult ptr [[DST_ADD_IDX_3]], [[UPPER]]339; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_IDX_3]]340; CHECK-NEXT:    ret i1 [[RES_2]]341;342  %not.zero = icmp ne i8 %len, 0343  call void @llvm.assume(i1 %not.zero)344  %len.ext = zext i8 %len to i16345  %dst.add.len = getelementptr i8, ptr %dst, i16 %len.ext346  %dst.add.1 = getelementptr i8, ptr %dst.add.len, i64 1347  %cmp.add.1 = icmp ult ptr %dst.add.1, %upper348  call void @llvm.assume(i1 %cmp.add.1)349  %cmp.idx.ult.len = icmp ult i8 %idx, %len350  call void @llvm.assume(i1 %cmp.idx.ult.len)351  %idx.ext = zext i8 %idx to i16352  %dst.add.idx = getelementptr i8, ptr %dst, i16 %idx.ext353  %dst.add.idx.1 = getelementptr i8, ptr %dst.add.idx, i64 1354  %cmp.idx.1 = icmp ult ptr %dst.add.idx.1, %upper355  %dst.add.idx.2 = getelementptr i8, ptr %dst.add.idx, i64 2356  %cmp.idx.2 = icmp ult ptr %dst.add.idx.2, %upper357  %res.1 = xor i1 %cmp.idx.1, %cmp.idx.2358  %dst.add.idx.3 = getelementptr i8, ptr %dst.add.idx, i64 3359  %cmp.idx.3 = icmp ult ptr %dst.add.idx.3, %upper360  %res.2 = xor i1 %res.1, %cmp.idx.3361  ret i1 %res.2362}363 364define i1 @test_chained_no_inbounds(ptr %A, ptr %B) {365; CHECK-LABEL: @test_chained_no_inbounds(366; CHECK-NEXT:  entry:367; CHECK-NEXT:    [[B_1:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 1368; CHECK-NEXT:    [[B_2:%.*]] = getelementptr i8, ptr [[B_1]], i64 1369; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt ptr [[A:%.*]], null370; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt ptr [[B_1]], [[B_2]]371; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_1]], [[C_2]]372; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]373; CHECK:       then:374; CHECK-NEXT:    ret i1 true375; CHECK:       else:376; CHECK-NEXT:    ret i1 false377;378entry:379  %B.1 = getelementptr i8, ptr %B, i64 1380  %B.2 = getelementptr i8, ptr %B.1, i64 1381  %c.1 = icmp ugt ptr %A, null382  %c.2 = icmp ugt ptr %B.1, %B.2383  %or = or i1 %c.1, %c.2384  br i1 %or, label %then, label %else385 386then:387  ret i1 true388 389else:390  ret i1 false391}392