brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.3 KiB · fdeb497 Raw
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