brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.2 KiB · 9de9afd Raw
549 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)5 6define i1 @gep_sub_1_sge_inbounds(ptr %dst, ptr %lower) {7; CHECK-LABEL: @gep_sub_1_sge_inbounds(8; CHECK-NEXT:    [[PRE:%.*]] = icmp sge 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_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -112; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sge ptr [[DST_SUB_1]], [[LOWER]]13; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -314; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sge ptr [[DST_SUB_3]], [[LOWER]]15; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_3]]16; CHECK-NEXT:    [[DST_SUB_4:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -417; CHECK-NEXT:    [[CMP_SUB_4:%.*]] = icmp sge ptr [[DST_SUB_4]], [[LOWER]]18; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_4]]19; CHECK-NEXT:    ret i1 [[RES_2]]20;21  %pre = icmp sge ptr %dst, %lower22  call void @llvm.assume(i1 %pre)23  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 324  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.3, i64 -125  %cmp.sub.1 = icmp sge ptr %dst.sub.1, %lower26  %dst.sub.3 = getelementptr inbounds i8, ptr %dst.add.3, i64 -327  %cmp.sub.3 = icmp sge ptr %dst.sub.3, %lower28  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.329  %dst.sub.4 = getelementptr inbounds i8, ptr %dst.add.3, i64 -430  %cmp.sub.4 = icmp sge ptr %dst.sub.4, %lower31  %res.2 = xor i1 %res.1, %cmp.sub.432  ret i1 %res.233}34 35define i1 @gep_sub_1_sge_only_inner_inbounds(ptr %dst, ptr %lower) {36; CHECK-LABEL: @gep_sub_1_sge_only_inner_inbounds(37; CHECK-NEXT:    [[PRE:%.*]] = icmp sge ptr [[DST:%.*]], [[LOWER:%.*]]38; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])39; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 340; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -141; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sge ptr [[DST_SUB_1]], [[LOWER]]42; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -343; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sge ptr [[DST_SUB_3]], [[LOWER]]44; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_3]]45; CHECK-NEXT:    [[DST_SUB_4:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -446; CHECK-NEXT:    [[CMP_SUB_4:%.*]] = icmp sge ptr [[DST_SUB_4]], [[LOWER]]47; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_4]]48; CHECK-NEXT:    ret i1 [[RES_2]]49;50  %pre = icmp sge ptr %dst, %lower51  call void @llvm.assume(i1 %pre)52  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 353  %dst.sub.1 = getelementptr i8, ptr %dst.add.3, i64 -154  %cmp.sub.1 = icmp sge ptr %dst.sub.1, %lower55  %dst.sub.3 = getelementptr i8, ptr %dst.add.3, i64 -356  %cmp.sub.3 = icmp sge ptr %dst.sub.3, %lower57  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.358  %dst.sub.4 = getelementptr i8, ptr %dst.add.3, i64 -459  %cmp.sub.4 = icmp sge ptr %dst.sub.4, %lower60  %res.2 = xor i1 %res.1, %cmp.sub.461  ret i1 %res.262}63 64define i1 @gep_sub_1_sge_only_outer_inbounds(ptr %dst, ptr %lower) {65; CHECK-LABEL: @gep_sub_1_sge_only_outer_inbounds(66; CHECK-NEXT:    [[PRE:%.*]] = icmp sge ptr [[DST:%.*]], [[LOWER:%.*]]67; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])68; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr i8, ptr [[DST]], i64 369; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -170; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sge ptr [[DST_SUB_1]], [[LOWER]]71; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -372; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sge ptr [[DST_SUB_3]], [[LOWER]]73; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_3]]74; CHECK-NEXT:    [[DST_SUB_4:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -475; CHECK-NEXT:    [[CMP_SUB_4:%.*]] = icmp sge ptr [[DST_SUB_4]], [[LOWER]]76; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_4]]77; CHECK-NEXT:    ret i1 [[RES_2]]78;79  %pre = icmp sge ptr %dst, %lower80  call void @llvm.assume(i1 %pre)81  %dst.add.3 = getelementptr i8, ptr %dst, i64 382  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.3, i64 -183  %cmp.sub.1 = icmp sge ptr %dst.sub.1, %lower84  %dst.sub.3 = getelementptr inbounds i8, ptr %dst.add.3, i64 -385  %cmp.sub.3 = icmp sge ptr %dst.sub.3, %lower86  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.387  %dst.sub.4 = getelementptr inbounds i8, ptr %dst.add.3, i64 -488  %cmp.sub.4 = icmp sge ptr %dst.sub.4, %lower89  %res.2 = xor i1 %res.1, %cmp.sub.490  ret i1 %res.291}92 93define i1 @gep_sub_1_sge_no_inbounds(ptr %dst, ptr %lower) {94; CHECK-LABEL: @gep_sub_1_sge_no_inbounds(95; CHECK-NEXT:    [[PRE:%.*]] = icmp sge ptr [[DST:%.*]], [[LOWER:%.*]]96; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])97; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr i8, ptr [[DST]], i64 398; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -199; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sge ptr [[DST_SUB_1]], [[LOWER]]100; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -3101; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sge ptr [[DST_SUB_3]], [[LOWER]]102; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_3]]103; CHECK-NEXT:    [[DST_SUB_4:%.*]] = getelementptr i8, ptr [[DST_ADD_3]], i64 -4104; CHECK-NEXT:    [[CMP_SUB_4:%.*]] = icmp sge ptr [[DST_SUB_4]], [[LOWER]]105; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_4]]106; CHECK-NEXT:    ret i1 [[RES_2]]107;108  %pre = icmp sge ptr %dst, %lower109  call void @llvm.assume(i1 %pre)110  %dst.add.3 = getelementptr i8, ptr %dst, i64 3111  %dst.sub.1 = getelementptr i8, ptr %dst.add.3, i64 -1112  %cmp.sub.1 = icmp sge ptr %dst.sub.1, %lower113  %dst.sub.3 = getelementptr i8, ptr %dst.add.3, i64 -3114  %cmp.sub.3 = icmp sge ptr %dst.sub.3, %lower115  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.3116  %dst.sub.4 = getelementptr i8, ptr %dst.add.3, i64 -4117  %cmp.sub.4 = icmp sge ptr %dst.sub.4, %lower118  %res.2 = xor i1 %res.1, %cmp.sub.4119  ret i1 %res.2120}121 122define i1 @gep_sub_1_slt(ptr %dst, ptr %upper) {123; CHECK-LABEL: @gep_sub_1_slt(124; CHECK-NEXT:    [[DST_ADD_4:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i64 4125; CHECK-NEXT:    [[PRE:%.*]] = icmp slt ptr [[DST_ADD_4]], [[UPPER:%.*]]126; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])127; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 3128; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -1129; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER]]130; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_3]], i64 -3131; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp slt ptr [[DST_SUB_3]], [[UPPER]]132; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_3]]133; CHECK-NEXT:    ret i1 [[RES_1]]134;135  %dst.add.4 = getelementptr inbounds i8, ptr %dst, i64 4136  %pre = icmp slt ptr %dst.add.4, %upper137  call void @llvm.assume(i1 %pre)138  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 3139  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.3, i64 -1140  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper141  %dst.sub.3 = getelementptr inbounds i8, ptr %dst.add.3, i64 -3142  %cmp.sub.3 = icmp slt ptr %dst.sub.3, %upper143  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.3144  ret i1 %res.1145}146 147define i1 @gep_sub_slt_var_idx(ptr %dst, ptr %upper, i8 %idx) {148; CHECK-LABEL: @gep_sub_slt_var_idx(149; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[IDX:%.*]], 0150; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])151; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16152; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[IDX_EXT]]153; CHECK-NEXT:    [[PRE:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER:%.*]]154; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])155; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 -1156; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER]]157; CHECK-NEXT:    [[DST_SUB_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 -2158; CHECK-NEXT:    [[CMP_SUB_2:%.*]] = icmp slt ptr [[DST_SUB_2]], [[UPPER]]159; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_2]]160; CHECK-NEXT:    [[DST_SUB_1_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_SUB_1]], i64 -1161; CHECK-NEXT:    [[CMP_SUB_1_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1_SUB_1]], [[UPPER]]162; CHECK-NEXT:    [[CMP_SUB_1_SUB_1_EQ:%.*]] = icmp eq ptr [[DST_SUB_1_SUB_1]], [[DST_SUB_2]]163; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_1_SUB_1]]164; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[CMP_SUB_1_SUB_1_EQ]]165; CHECK-NEXT:    ret i1 [[RES_3]]166;167  %not.zero = icmp ne i8 %idx, 0168  call void @llvm.assume(i1 %not.zero)169  %idx.ext = zext i8 %idx to i16170  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext171  %pre = icmp slt ptr %dst.add.idx, %upper172  call void @llvm.assume(i1 %pre)173  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.idx, i64 -1174  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper175  %dst.sub.2 = getelementptr inbounds i8, ptr %dst.add.idx, i64 -2176  %cmp.sub.2 = icmp slt ptr %dst.sub.2, %upper177  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.2178  %dst.sub.1.sub.1 = getelementptr inbounds i8, ptr %dst.sub.1, i64 -1179  %cmp.sub.1.sub.1 = icmp slt ptr %dst.sub.1.sub.1, %upper180  %cmp.sub.1.sub.1.eq = icmp eq ptr %dst.sub.1.sub.1, %dst.sub.2181  %res.2 = xor i1 %res.1, %cmp.sub.1.sub.1182  %res.3 = xor i1 %res.2, %cmp.sub.1.sub.1.eq183  ret i1 %res.3184}185 186define i1 @gep_sub_slt_var_idx_sgt_1(ptr %dst, ptr %upper, i8 %idx) {187; CHECK-LABEL: @gep_sub_slt_var_idx_sgt_1(188; CHECK-NEXT:    [[SGT_1:%.*]] = icmp sgt i8 [[IDX:%.*]], 1189; CHECK-NEXT:    call void @llvm.assume(i1 [[SGT_1]])190; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16191; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[IDX_EXT]]192; CHECK-NEXT:    [[PRE:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER:%.*]]193; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])194; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 -1195; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER]]196; CHECK-NEXT:    [[DST_SUB_2:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 -2197; CHECK-NEXT:    [[CMP_SUB_2:%.*]] = icmp slt ptr [[DST_SUB_2]], [[UPPER]]198; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_2]]199; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_IDX]], i64 -3200; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp slt ptr [[DST_SUB_3]], [[UPPER]]201; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_3]]202; CHECK-NEXT:    ret i1 [[RES_2]]203;204  %sgt.1 = icmp sgt i8 %idx, 1205  call void @llvm.assume(i1 %sgt.1)206  %idx.ext = zext i8 %idx to i16207  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext208  %pre = icmp slt ptr %dst.add.idx, %upper209  call void @llvm.assume(i1 %pre)210  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.idx, i64 -1211  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper212  %dst.sub.2 = getelementptr inbounds i8, ptr %dst.add.idx, i64 -2213  %cmp.sub.2 = icmp slt ptr %dst.sub.2, %upper214  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.2215  %dst.sub.3 = getelementptr inbounds i8, ptr %dst.add.idx, i64 -3216  %cmp.sub.3 = icmp slt ptr %dst.sub.3, %upper217  %res.2 = xor i1 %res.1, %cmp.sub.3218  ret i1 %res.2219}220 221define i1 @gep_sub_1_slt_var_idx_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {222; CHECK-LABEL: @gep_sub_1_slt_var_idx_inbounds(223; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0224; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])225; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16226; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]227; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 -1228; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]229; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])230; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]231; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])232; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16233; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]234; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]235; CHECK-NEXT:    ret i1 [[CMP_IDX]]236;237  %not.zero = icmp ne i8 %len, 0238  call void @llvm.assume(i1 %not.zero)239  %len.ext = zext i8 %len to i16240  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext241  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 -1242  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper243  call void @llvm.assume(i1 %cmp.sub.1)244  %cmp.idx.slt.len = icmp slt i8 %idx, %len245  call void @llvm.assume(i1 %cmp.idx.slt.len)246  %idx.ext = zext i8 %idx to i16247  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext248  %cmp.idx = icmp slt ptr %dst.add.idx, %upper249  ret i1 %cmp.idx250}251 252define i1 @gep_sub_1_slt_var_idx_only_inner_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {253; CHECK-LABEL: @gep_sub_1_slt_var_idx_only_inner_inbounds(254; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0255; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])256; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16257; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]258; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr i8, ptr [[DST_ADD_LEN]], i64 -1259; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]260; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])261; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]262; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])263; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16264; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]265; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]266; CHECK-NEXT:    ret i1 [[CMP_IDX]]267;268  %not.zero = icmp ne i8 %len, 0269  call void @llvm.assume(i1 %not.zero)270  %len.ext = zext i8 %len to i16271  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext272  %dst.sub.1 = getelementptr i8, ptr %dst.add.len, i64 -1273  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper274  call void @llvm.assume(i1 %cmp.sub.1)275  %cmp.idx.slt.len = icmp slt i8 %idx, %len276  call void @llvm.assume(i1 %cmp.idx.slt.len)277  %idx.ext = zext i8 %idx to i16278  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext279  %cmp.idx = icmp slt ptr %dst.add.idx, %upper280  ret i1 %cmp.idx281}282 283define i1 @gep_sub_1_slt_var_idx_no_inbounds(ptr %dst, ptr %upper, i8 %len, i8 %idx) {284; CHECK-LABEL: @gep_sub_1_slt_var_idx_no_inbounds(285; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0286; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])287; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16288; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]289; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr i8, ptr [[DST_ADD_LEN]], i64 -1290; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]291; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])292; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]293; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])294; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16295; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr i8, ptr [[DST]], i16 [[IDX_EXT]]296; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]297; CHECK-NEXT:    ret i1 [[CMP_IDX]]298;299  %not.zero = icmp ne i8 %len, 0300  call void @llvm.assume(i1 %not.zero)301  %len.ext = zext i8 %len to i16302  %dst.add.len = getelementptr i8, ptr %dst, i16 %len.ext303  %dst.sub.1 = getelementptr i8, ptr %dst.add.len, i64 -1304  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper305  call void @llvm.assume(i1 %cmp.sub.1)306  %cmp.idx.slt.len = icmp slt i8 %idx, %len307  call void @llvm.assume(i1 %cmp.idx.slt.len)308  %idx.ext = zext i8 %idx to i16309  %dst.add.idx = getelementptr i8, ptr %dst, i16 %idx.ext310  %cmp.idx = icmp slt ptr %dst.add.idx, %upper311  ret i1 %cmp.idx312}313 314define i1 @gep_sub_2_slt_var_idx(ptr %dst, ptr %upper, i8 %len, i8 %idx) {315; CHECK-LABEL: @gep_sub_2_slt_var_idx(316; CHECK-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i8 [[LEN:%.*]], 0317; CHECK-NEXT:    call void @llvm.assume(i1 [[NOT_ZERO]])318; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16319; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]320; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 -2321; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]322; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])323; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]324; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])325; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16326; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]327; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]328; CHECK-NEXT:    ret i1 [[CMP_IDX]]329;330  %not.zero = icmp ne i8 %len, 0331  call void @llvm.assume(i1 %not.zero)332  %len.ext = zext i8 %len to i16333  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext334  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 -2335  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper336  call void @llvm.assume(i1 %cmp.sub.1)337  %cmp.idx.slt.len = icmp slt i8 %idx, %len338  call void @llvm.assume(i1 %cmp.idx.slt.len)339  %idx.ext = zext i8 %idx to i16340  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext341  %cmp.idx = icmp slt ptr %dst.add.idx, %upper342  ret i1 %cmp.idx343}344 345define i1 @gep_sub_2_slt_var_idx_inbounds_len_sge_2(ptr %dst, ptr %upper, i8 %len, i8 %idx) {346; CHECK-LABEL: @gep_sub_2_slt_var_idx_inbounds_len_sge_2(347; CHECK-NEXT:    [[SGE_2:%.*]] = icmp sge i8 [[LEN:%.*]], 2348; CHECK-NEXT:    call void @llvm.assume(i1 [[SGE_2]])349; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16350; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]351; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 -1352; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]353; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])354; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]355; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])356; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16357; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]358; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]359; CHECK-NEXT:    ret i1 [[CMP_IDX]]360;361  %sge.2 = icmp sge i8 %len, 2362  call void @llvm.assume(i1 %sge.2)363  %len.ext = zext i8 %len to i16364  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext365  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 -1366  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper367  call void @llvm.assume(i1 %cmp.sub.1)368  %cmp.idx.slt.len = icmp slt i8 %idx, %len369  call void @llvm.assume(i1 %cmp.idx.slt.len)370  %idx.ext = zext i8 %idx to i16371  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext372  %cmp.idx = icmp slt ptr %dst.add.idx, %upper373  ret i1 %cmp.idx374}375 376define i1 @gep_sub_slt_var_idx_len_sgt_1(ptr %dst, ptr %upper, i8 %len, i8 %idx) {377; CHECK-LABEL: @gep_sub_slt_var_idx_len_sgt_1(378; CHECK-NEXT:    [[SGT_1:%.*]] = icmp sgt i8 [[LEN:%.*]], 1379; CHECK-NEXT:    call void @llvm.assume(i1 [[SGT_1]])380; CHECK-NEXT:    [[LEN_EXT:%.*]] = zext i8 [[LEN]] to i16381; CHECK-NEXT:    [[DST_ADD_LEN:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i16 [[LEN_EXT]]382; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[DST_ADD_LEN]], i64 -2383; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp slt ptr [[DST_SUB_1]], [[UPPER:%.*]]384; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_SUB_1]])385; CHECK-NEXT:    [[CMP_IDX_SLT_LEN:%.*]] = icmp slt i8 [[IDX:%.*]], [[LEN]]386; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_IDX_SLT_LEN]])387; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX]] to i16388; CHECK-NEXT:    [[DST_ADD_IDX:%.*]] = getelementptr inbounds i8, ptr [[DST]], i16 [[IDX_EXT]]389; CHECK-NEXT:    [[CMP_IDX:%.*]] = icmp slt ptr [[DST_ADD_IDX]], [[UPPER]]390; CHECK-NEXT:    ret i1 [[CMP_IDX]]391;392  %sgt.1 = icmp sgt i8 %len, 1393  call void @llvm.assume(i1 %sgt.1)394  %len.ext = zext i8 %len to i16395  %dst.add.len = getelementptr inbounds i8, ptr %dst, i16 %len.ext396  %dst.sub.1 = getelementptr inbounds i8, ptr %dst.add.len, i64 -2397  %cmp.sub.1 = icmp slt ptr %dst.sub.1, %upper398  call void @llvm.assume(i1 %cmp.sub.1)399  %cmp.idx.slt.len = icmp slt i8 %idx, %len400  call void @llvm.assume(i1 %cmp.idx.slt.len)401  %idx.ext = zext i8 %idx to i16402  %dst.add.idx = getelementptr inbounds i8, ptr %dst, i16 %idx.ext403  %cmp.idx = icmp slt ptr %dst.add.idx, %upper404  ret i1 %cmp.idx405}406 407define i1 @gep_sub_1_slt_var_idx_lower_bound(ptr %lower, ptr %src, i8 %len) {408; CHECK-LABEL: @gep_sub_1_slt_var_idx_lower_bound(409; CHECK-NEXT:  entry:410; CHECK-NEXT:    [[SRC_SGE_LOWER:%.*]] = icmp sge ptr [[SRC:%.*]], [[LOWER:%.*]]411; CHECK-NEXT:    call void @llvm.assume(i1 [[SRC_SGE_LOWER]])412; CHECK-NEXT:    [[LEN_POS:%.*]] = icmp sge i8 [[LEN:%.*]], 0413; CHECK-NEXT:    call void @llvm.assume(i1 [[LEN_POS]])414; CHECK-NEXT:    [[GEP_LEN:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[LEN]]415; CHECK-NEXT:    [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[GEP_LEN]], i8 -1416; CHECK-NEXT:    [[RES:%.*]] = icmp slt ptr [[GEP_SUB_1]], [[LOWER]]417; CHECK-NEXT:    ret i1 [[RES]]418;419entry:420  %src.sge.lower = icmp sge ptr %src, %lower421  call void @llvm.assume(i1 %src.sge.lower)422 423  %len.pos = icmp sge i8 %len, 0424  call void @llvm.assume(i1 %len.pos)425 426  %gep.len = getelementptr inbounds i8, ptr %src, i8 %len427  %gep.sub.1 = getelementptr inbounds i8, ptr %gep.len, i8 -1428  %res = icmp slt ptr %gep.sub.1, %lower429  ret i1 %res430}431 432define i1 @gep_sub_1_slt_var_idx_lower_bound_len_ne_0(ptr %lower, ptr %src, i8 %len) {433; CHECK-LABEL: @gep_sub_1_slt_var_idx_lower_bound_len_ne_0(434; CHECK-NEXT:  entry:435; CHECK-NEXT:    [[LEN_NE_0:%.*]] = icmp ne i8 [[LEN:%.*]], 0436; CHECK-NEXT:    call void @llvm.assume(i1 [[LEN_NE_0]])437; CHECK-NEXT:    [[SRC_SGE_LOWER:%.*]] = icmp sge ptr [[SRC:%.*]], [[LOWER:%.*]]438; CHECK-NEXT:    call void @llvm.assume(i1 [[SRC_SGE_LOWER]])439; CHECK-NEXT:    [[LEN_POS:%.*]] = icmp sge i8 [[LEN]], 0440; CHECK-NEXT:    call void @llvm.assume(i1 [[LEN_POS]])441; CHECK-NEXT:    [[GEP_LEN:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[LEN]]442; CHECK-NEXT:    [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[GEP_LEN]], i8 -1443; CHECK-NEXT:    [[RES:%.*]] = icmp slt ptr [[GEP_SUB_1]], [[LOWER]]444; CHECK-NEXT:    ret i1 [[RES]]445;446entry:447  %len.ne.0 = icmp ne i8 %len, 0448  call void @llvm.assume(i1 %len.ne.0)449 450  %src.sge.lower = icmp sge ptr %src, %lower451  call void @llvm.assume(i1 %src.sge.lower)452 453  %len.pos = icmp sge i8 %len, 0454  call void @llvm.assume(i1 %len.pos)455 456  %gep.len = getelementptr inbounds i8, ptr %src, i8 %len457  %gep.sub.1 = getelementptr inbounds i8, ptr %gep.len, i8 -1458  %res = icmp slt ptr %gep.sub.1, %lower459  ret i1 %res460}461 462define i1 @gep_sub_2_slt_var_idx_lower_bound_len_ne_0(ptr %lower, ptr %src, i8 %len) {463; CHECK-LABEL: @gep_sub_2_slt_var_idx_lower_bound_len_ne_0(464; CHECK-NEXT:  entry:465; CHECK-NEXT:    [[LEN_NE_0:%.*]] = icmp ne i8 [[LEN:%.*]], 0466; CHECK-NEXT:    call void @llvm.assume(i1 [[LEN_NE_0]])467; CHECK-NEXT:    [[SRC_SGE_LOWER:%.*]] = icmp sge ptr [[SRC:%.*]], [[LOWER:%.*]]468; CHECK-NEXT:    call void @llvm.assume(i1 [[SRC_SGE_LOWER]])469; CHECK-NEXT:    [[LEN_POS:%.*]] = icmp sge i8 [[LEN]], 0470; CHECK-NEXT:    call void @llvm.assume(i1 [[LEN_POS]])471; CHECK-NEXT:    [[GEP_LEN:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[LEN]]472; CHECK-NEXT:    [[GEP_SUB_2:%.*]] = getelementptr inbounds i8, ptr [[GEP_LEN]], i8 -2473; CHECK-NEXT:    [[RES:%.*]] = icmp slt ptr [[GEP_SUB_2]], [[LOWER]]474; CHECK-NEXT:    ret i1 [[RES]]475;476entry:477  %len.ne.0 = icmp ne i8 %len, 0478  call void @llvm.assume(i1 %len.ne.0)479 480  %src.sge.lower = icmp sge ptr %src, %lower481  call void @llvm.assume(i1 %src.sge.lower)482 483  %len.pos = icmp sge i8 %len, 0484  call void @llvm.assume(i1 %len.pos)485 486  %gep.len = getelementptr inbounds i8, ptr %src, i8 %len487  %gep.sub.2 = getelementptr inbounds i8, ptr %gep.len, i8 -2488  %res = icmp slt ptr %gep.sub.2, %lower489  ret i1 %res490}491 492define i1 @gep_i16_sub_1_sge_inbounds(ptr %dst, ptr %lower) {493; CHECK-LABEL: @gep_i16_sub_1_sge_inbounds(494; CHECK-NEXT:    [[PRE:%.*]] = icmp sge ptr [[DST:%.*]], [[LOWER:%.*]]495; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])496; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 3497; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i64 -1498; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sle ptr [[DST_SUB_1]], [[LOWER]]499; CHECK-NEXT:    [[DST_SUB_2:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i64 -2500; CHECK-NEXT:    [[CMP_SUB_2:%.*]] = icmp sle ptr [[DST_SUB_2]], [[DST]]501; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_2]]502; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i64 -3503; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sle ptr [[DST_SUB_3]], [[LOWER]]504; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_3]]505; CHECK-NEXT:    ret i1 [[RES_2]]506;507  %pre = icmp sge ptr %dst, %lower508  call void @llvm.assume(i1 %pre)509  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 3510  %dst.sub.1 = getelementptr inbounds i16, ptr %dst.add.3, i64 -1511  %cmp.sub.1 = icmp sle ptr %dst.sub.1, %lower512  %dst.sub.2 = getelementptr inbounds i16, ptr %dst.add.3, i64 -2513  %cmp.sub.2 = icmp sle ptr %dst.sub.2, %dst514  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.2515  %dst.sub.3 = getelementptr inbounds i16, ptr %dst.add.3, i64 -3516  %cmp.sub.3 = icmp sle ptr %dst.sub.3, %lower517  %res.2 = xor i1 %res.1, %cmp.sub.3518  ret i1 %res.2519}520 521define i1 @gep_i16_sub_1_sge_inbounds_var_idx(ptr %dst, i64 %off) {522; CHECK-LABEL: @gep_i16_sub_1_sge_inbounds_var_idx(523; CHECK-NEXT:    [[OFF_SGE:%.*]] = icmp sge i64 [[OFF:%.*]], 1524; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_SGE]])525; CHECK-NEXT:    [[DST_ADD_3:%.*]] = getelementptr inbounds i8, ptr [[DST:%.*]], i64 [[OFF]]526; CHECK-NEXT:    [[DST_SUB_1:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i32 -1527; CHECK-NEXT:    [[CMP_SUB_1:%.*]] = icmp sle ptr [[DST_SUB_1]], [[DST]]528; CHECK-NEXT:    [[DST_SUB_2:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i64 -2529; CHECK-NEXT:    [[CMP_SUB_2:%.*]] = icmp sle ptr [[DST_SUB_2]], [[DST]]530; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[CMP_SUB_1]], [[CMP_SUB_2]]531; CHECK-NEXT:    [[DST_SUB_3:%.*]] = getelementptr inbounds i16, ptr [[DST_ADD_3]], i64 -3532; CHECK-NEXT:    [[CMP_SUB_3:%.*]] = icmp sle ptr [[DST_SUB_3]], [[DST]]533; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[CMP_SUB_3]]534; CHECK-NEXT:    ret i1 [[RES_2]]535;536  %off.sge = icmp sge i64 %off, 1537  call void @llvm.assume(i1 %off.sge)538  %dst.add.3 = getelementptr inbounds i8, ptr %dst, i64 %off539  %dst.sub.1 = getelementptr inbounds i16, ptr %dst.add.3, i32 -1540  %cmp.sub.1 = icmp sle ptr %dst.sub.1, %dst541  %dst.sub.2 = getelementptr inbounds i16, ptr %dst.add.3, i64 -2542  %cmp.sub.2 = icmp sle ptr %dst.sub.2, %dst543  %res.1 = xor i1 %cmp.sub.1, %cmp.sub.2544  %dst.sub.3 = getelementptr inbounds i16, ptr %dst.add.3, i64 -3545  %cmp.sub.3 = icmp sle ptr %dst.sub.3, %dst546  %res.2 = xor i1 %res.1, %cmp.sub.3547  ret i1 %res.2548}549