360 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 52; RUN: opt -passes=loop-vectorize -force-vector-width=4 -S %s | FileCheck %s3 4define void @const_fold_ptradd(ptr %dst, i64 %d) {5; CHECK-LABEL: define void @const_fold_ptradd(6; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {7; CHECK-NEXT: [[ENTRY:.*:]]8; CHECK-NEXT: br label %[[VECTOR_PH:.*]]9; CHECK: [[VECTOR_PH]]:10; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]11; CHECK: [[VECTOR_BODY]]:12; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]13; CHECK-NEXT: store i16 0, ptr [[DST]], align 214; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 415; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10016; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]17; CHECK: [[MIDDLE_BLOCK]]:18; CHECK-NEXT: br label %[[EXIT:.*]]19; CHECK: [[EXIT]]:20; CHECK-NEXT: ret void21;22entry:23 br label %loop.header24 25loop.header: ; preds = %loop.latch, %entry26 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]27 br i1 true, label %loop.latch, label %else28 29else:30 br label %loop.latch31 32loop.latch:33 %const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]34 %gep = getelementptr i16, ptr %dst, i64 %const.035 store i16 0, ptr %gep, align 236 %iv.next = add i64 %iv, 137 %cmp = icmp ult i64 %iv.next, 10038 br i1 %cmp, label %loop.header, label %exit39 40exit:41 ret void42}43 44define void @const_fold_inbounds_ptradd(ptr %dst, i64 %d) {45; CHECK-LABEL: define void @const_fold_inbounds_ptradd(46; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {47; CHECK-NEXT: [[ENTRY:.*:]]48; CHECK-NEXT: br label %[[VECTOR_PH:.*]]49; CHECK: [[VECTOR_PH]]:50; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]51; CHECK: [[VECTOR_BODY]]:52; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]53; CHECK-NEXT: store i16 0, ptr [[DST]], align 254; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 455; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10056; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]57; CHECK: [[MIDDLE_BLOCK]]:58; CHECK-NEXT: br label %[[EXIT:.*]]59; CHECK: [[EXIT]]:60; CHECK-NEXT: ret void61;62entry:63 br label %loop.header64 65loop.header: ; preds = %loop.latch, %entry66 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]67 br i1 true, label %loop.latch, label %else68 69else:70 br label %loop.latch71 72loop.latch:73 %const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]74 %gep = getelementptr inbounds i16, ptr %dst, i64 %const.075 store i16 0, ptr %gep, align 276 %iv.next = add i64 %iv, 177 %cmp = icmp ult i64 %iv.next, 10078 br i1 %cmp, label %loop.header, label %exit79 80exit:81 ret void82}83 84define void @const_fold_select(ptr %dst, i64 %d) {85; CHECK-LABEL: define void @const_fold_select(86; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {87; CHECK-NEXT: [[ENTRY:.*:]]88; CHECK-NEXT: br label %[[VECTOR_PH:.*]]89; CHECK: [[VECTOR_PH]]:90; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[D]], 191; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]92; CHECK: [[VECTOR_BODY]]:93; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]94; CHECK-NEXT: store i64 [[TMP3]], ptr [[DST]], align 895; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 496; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10097; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]98; CHECK: [[MIDDLE_BLOCK]]:99; CHECK-NEXT: br label %[[EXIT:.*]]100; CHECK: [[EXIT]]:101; CHECK-NEXT: ret void102;103entry:104 br label %loop.header105 106loop.header: ; preds = %loop.latch, %entry107 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]108 br i1 true, label %loop.latch, label %else109 110else:111 br label %loop.latch112 113loop.latch:114 %const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]115 %or = or i64 %d, %const.1116 store i64 %or, ptr %dst, align 8117 %iv.next = add i64 %iv, 1118 %cmp = icmp ult i64 %iv.next, 100119 br i1 %cmp, label %loop.header, label %exit120 121exit:122 ret void123}124 125define void @const_fold_add_sub_mul_ashr_lshr(ptr %dst, i64 %d) {126; CHECK-LABEL: define void @const_fold_add_sub_mul_ashr_lshr(127; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {128; CHECK-NEXT: [[ENTRY:.*:]]129; CHECK-NEXT: br label %[[VECTOR_PH:.*]]130; CHECK: [[VECTOR_PH]]:131; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]132; CHECK: [[VECTOR_BODY]]:133; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]134; CHECK-NEXT: store i64 1, ptr [[DST]], align 8135; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4136; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100137; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]138; CHECK: [[MIDDLE_BLOCK]]:139; CHECK-NEXT: br label %[[EXIT:.*]]140; CHECK: [[EXIT]]:141; CHECK-NEXT: ret void142;143entry:144 br label %loop.header145 146loop.header: ; preds = %loop.latch, %entry147 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]148 br i1 true, label %loop.latch, label %else149 150else:151 br label %loop.latch152 153loop.latch:154 %const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]155 %add = add i64 2, %const.1156 %sub = sub i64 %add, %const.1157 %ashr = ashr i64 %sub, %const.1158 %mul = mul i64 %ashr, 3159 %lshr = lshr i64 %mul, %const.1160 store i64 %lshr, ptr %dst, align 8161 %iv.next = add i64 %iv, 1162 %cmp = icmp ult i64 %iv.next, 100163 br i1 %cmp, label %loop.header, label %exit164 165exit:166 ret void167}168 169define void @const_fold_and_or_xor(ptr %dst, i64 %d) {170; CHECK-LABEL: define void @const_fold_and_or_xor(171; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {172; CHECK-NEXT: [[ENTRY:.*:]]173; CHECK-NEXT: br label %[[VECTOR_PH:.*]]174; CHECK: [[VECTOR_PH]]:175; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]176; CHECK: [[VECTOR_BODY]]:177; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]178; CHECK-NEXT: store i64 1, ptr [[DST]], align 8179; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4180; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100181; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]182; CHECK: [[MIDDLE_BLOCK]]:183; CHECK-NEXT: br label %[[EXIT:.*]]184; CHECK: [[EXIT]]:185; CHECK-NEXT: ret void186;187entry:188 br label %loop.header189 190loop.header: ; preds = %loop.latch, %entry191 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]192 br i1 true, label %loop.latch, label %else193 194else:195 br label %loop.latch196 197loop.latch:198 %const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]199 %or = or i64 2, %const.1200 %and = and i64 %or, %const.1201 %xor = and i64 %and, %const.1202 store i64 %xor, ptr %dst, align 8203 %iv.next = add i64 %iv, 1204 %cmp = icmp ult i64 %iv.next, 100205 br i1 %cmp, label %loop.header, label %exit206 207exit:208 ret void209}210 211define void @const_fold_cmp_zext(ptr %dst, i64 %d) {212; CHECK-LABEL: define void @const_fold_cmp_zext(213; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {214; CHECK-NEXT: [[ENTRY:.*:]]215; CHECK-NEXT: br label %[[VECTOR_PH:.*]]216; CHECK: [[VECTOR_PH]]:217; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]218; CHECK: [[VECTOR_BODY]]:219; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]220; CHECK-NEXT: store i8 1, ptr [[DST]], align 1221; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4222; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100223; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]224; CHECK: [[MIDDLE_BLOCK]]:225; CHECK-NEXT: br label %[[EXIT:.*]]226; CHECK: [[EXIT]]:227; CHECK-NEXT: ret void228;229entry:230 br label %loop.header231 232loop.header: ; preds = %loop.latch, %entry233 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]234 br i1 true, label %loop.latch, label %else235 236else:237 br label %loop.latch238 239loop.latch:240 %const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]241 %val = icmp ugt i64 2, %const.1242 %zext = zext i1 %val to i8243 store i8 %zext, ptr %dst, align 1244 %iv.next = add i64 %iv, 1245 %cmp = icmp ult i64 %iv.next, 100246 br i1 %cmp, label %loop.header, label %exit247 248exit:249 ret void250}251 252define void @const_fold_trunc(ptr %dst, i64 %d) {253; CHECK-LABEL: define void @const_fold_trunc(254; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {255; CHECK-NEXT: [[ENTRY:.*:]]256; CHECK-NEXT: br label %[[VECTOR_PH:.*]]257; CHECK: [[VECTOR_PH]]:258; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]259; CHECK: [[VECTOR_BODY]]:260; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]261; CHECK-NEXT: store i16 0, ptr [[DST]], align 2262; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4263; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100264; CHECK-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]265; CHECK: [[MIDDLE_BLOCK]]:266; CHECK-NEXT: br label %[[EXIT:.*]]267; CHECK: [[EXIT]]:268; CHECK-NEXT: ret void269;270entry:271 br label %loop.header272 273loop.header: ; preds = %loop.latch, %entry274 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]275 br i1 true, label %loop.latch, label %else276 277else:278 br label %loop.latch279 280loop.latch:281 %const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]282 %trunc = trunc i64 %const.0 to i16283 store i16 %trunc, ptr %dst, align 2284 %iv.next = add i64 %iv, 1285 %cmp = icmp ult i64 %iv.next, 100286 br i1 %cmp, label %loop.header, label %exit287 288exit:289 ret void290}291 292define void @const_fold_binaryintrinsic(ptr %dst, i64 %d) {293; CHECK-LABEL: define void @const_fold_binaryintrinsic(294; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {295; CHECK-NEXT: [[ENTRY:.*:]]296; CHECK-NEXT: br label %[[VECTOR_PH:.*]]297; CHECK: [[VECTOR_PH]]:298; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]299; CHECK: [[VECTOR_BODY]]:300; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]301; CHECK-NEXT: store i64 3, ptr [[DST]], align 2302; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4303; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100304; CHECK-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]305; CHECK: [[MIDDLE_BLOCK]]:306; CHECK-NEXT: br label %[[EXIT:.*]]307; CHECK: [[EXIT]]:308; CHECK-NEXT: ret void309;310entry:311 br label %loop312 313loop:314 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]315 %const.0 = xor i64 %d, %d316 %trunc = call i64 @llvm.umax.i64(i64 %const.0, i64 3)317 store i64 %trunc, ptr %dst, align 2318 %iv.next = add i64 %iv, 1319 %cmp = icmp ult i64 %iv.next, 100320 br i1 %cmp, label %loop, label %exit321 322exit:323 ret void324}325 326define void @const_fold_widegep(ptr noalias %A, ptr noalias %B, i64 %d) {327; CHECK-LABEL: define void @const_fold_widegep(328; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], i64 [[D:%.*]]) {329; CHECK-NEXT: [[ENTRY:.*:]]330; CHECK-NEXT: br label %[[VECTOR_PH:.*]]331; CHECK: [[VECTOR_PH]]:332; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]333; CHECK: [[VECTOR_BODY]]:334; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]335; CHECK-NEXT: store ptr [[A]], ptr [[B]], align 8336; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4337; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100338; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]339; CHECK: [[MIDDLE_BLOCK]]:340; CHECK-NEXT: br label %[[EXIT:.*]]341; CHECK: [[EXIT]]:342; CHECK-NEXT: ret void343;344entry:345 br label %loop346 347loop:348 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]349 %const.0 = xor i64 %d, %d350 %gep.A = getelementptr i64, ptr %A, i64 %const.0351 %gep.B = getelementptr i64, ptr %B, i64 %const.0352 store ptr %gep.A, ptr %gep.B353 %iv.next = add nuw nsw i64 %iv, 1354 %exit.cond = icmp ult i64 %iv.next, 100355 br i1 %exit.cond, label %loop, label %exit356 357exit:358 ret void359}360