brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.8 KiB · b4f8abb Raw
138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes='default<O1>,function(loop-versioning-licm,loop-mssa(licm))' -debug-only=loop-versioning-licm 2>&1 | FileCheck %s3; REQUIRES: asserts4;5; Test to confirm loop is a candidate for LoopVersioningLICM.6; It also confirms invariant moved out of loop.7;8; CHECK: Loop: Loop at depth 2 containing: %for.body3<header><latch><exiting>9; CHECK-NEXT:   Loop Versioning found to be beneficial10 11define i32 @foo(ptr nocapture %var1, ptr nocapture readnone %var2, ptr nocapture %var3, i32 %itr) #0 {12; CHECK-LABEL: @foo(13; CHECK-NEXT:  entry:14; CHECK-NEXT:    [[CMP14:%.*]] = icmp eq i32 [[ITR:%.*]], 015; CHECK-NEXT:    br i1 [[CMP14]], label [[FOR_END13:%.*]], label [[FOR_COND1_PREHEADER_PREHEADER:%.*]]16; CHECK:       for.cond1.preheader.preheader:17; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[VAR1:%.*]], i64 418; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[ITR]], -119; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER:%.*]]20; CHECK:       for.cond1.preheader:21; CHECK-NEXT:    [[INDVAR:%.*]] = phi i64 [ 0, [[FOR_COND1_PREHEADER_PREHEADER]] ], [ [[INDVAR_NEXT:%.*]], [[FOR_INC11:%.*]] ]22; CHECK-NEXT:    [[J_016:%.*]] = phi i32 [ [[J_1_LCSSA:%.*]], [[FOR_INC11]] ], [ 0, [[FOR_COND1_PREHEADER_PREHEADER]] ]23; CHECK-NEXT:    [[I_015:%.*]] = phi i32 [ [[INC12:%.*]], [[FOR_INC11]] ], [ 0, [[FOR_COND1_PREHEADER_PREHEADER]] ]24; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i64 [[INDVAR]], 225; CHECK-NEXT:    [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[VAR3:%.*]], i64 [[TMP1]]26; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[TMP1]], 427; CHECK-NEXT:    [[SCEVGEP4:%.*]] = getelementptr i8, ptr [[VAR3]], i64 [[TMP2]]28; CHECK-NEXT:    [[CMP212:%.*]] = icmp ult i32 [[J_016]], [[ITR]]29; CHECK-NEXT:    br i1 [[CMP212]], label [[FOR_BODY3_LVER_CHECK:%.*]], label [[FOR_INC11]]30; CHECK:       for.body3.lver.check:31; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[I_015]], [[ITR]]32; CHECK-NEXT:    [[IDXPROM6:%.*]] = zext i32 [[I_015]] to i6433; CHECK-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw i32, ptr [[VAR3]], i64 [[IDXPROM6]]34; CHECK-NEXT:    [[TMP3:%.*]] = zext i32 [[J_016]] to i6435; CHECK-NEXT:    [[TMP4:%.*]] = shl nuw nsw i64 [[TMP3]], 236; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[VAR1]], i64 [[TMP4]]37; CHECK-NEXT:    [[TMP5:%.*]] = sub i32 [[TMP0]], [[J_016]]38; CHECK-NEXT:    [[TMP6:%.*]] = zext i32 [[TMP5]] to i6439; CHECK-NEXT:    [[TMP7:%.*]] = shl nuw nsw i64 [[TMP6]], 240; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[TMP4]], [[TMP7]]41; CHECK-NEXT:    [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[SCEVGEP1]], i64 [[TMP8]]42; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP4]]43; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[SCEVGEP3]], [[SCEVGEP2]]44; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]45; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[FOR_BODY3_PH_LVER_ORIG:%.*]], label [[FOR_BODY3_PH:%.*]]46; CHECK:       for.body3.ph.lver.orig:47; CHECK-NEXT:    br label [[FOR_BODY3_LVER_ORIG:%.*]]48; CHECK:       for.body3.lver.orig:49; CHECK-NEXT:    [[J_113_LVER_ORIG:%.*]] = phi i32 [ [[J_016]], [[FOR_BODY3_PH_LVER_ORIG]] ], [ [[INC_LVER_ORIG:%.*]], [[FOR_BODY3_LVER_ORIG]] ]50; CHECK-NEXT:    [[IDXPROM_LVER_ORIG:%.*]] = zext i32 [[J_113_LVER_ORIG]] to i6451; CHECK-NEXT:    [[ARRAYIDX_LVER_ORIG:%.*]] = getelementptr inbounds nuw i32, ptr [[VAR1]], i64 [[IDXPROM_LVER_ORIG]]52; CHECK-NEXT:    store i32 [[ADD]], ptr [[ARRAYIDX_LVER_ORIG]], align 453; CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX7]], align 454; CHECK-NEXT:    [[ADD8_LVER_ORIG:%.*]] = add nsw i32 [[TMP9]], [[ADD]]55; CHECK-NEXT:    store i32 [[ADD8_LVER_ORIG]], ptr [[ARRAYIDX7]], align 456; CHECK-NEXT:    [[INC_LVER_ORIG]] = add nuw i32 [[J_113_LVER_ORIG]], 157; CHECK-NEXT:    [[CMP2_LVER_ORIG:%.*]] = icmp ult i32 [[INC_LVER_ORIG]], [[ITR]]58; CHECK-NEXT:    br i1 [[CMP2_LVER_ORIG]], label [[FOR_BODY3_LVER_ORIG]], label [[FOR_INC11_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP0:![0-9]+]]59; CHECK:       for.body3.ph:60; CHECK-NEXT:    [[ARRAYIDX7_PROMOTED:%.*]] = load i32, ptr [[ARRAYIDX7]], align 4, !alias.scope [[META2:![0-9]+]]61; CHECK-NEXT:    br label [[FOR_BODY3:%.*]]62; CHECK:       for.body3:63; CHECK-NEXT:    [[ADD86:%.*]] = phi i32 [ [[ARRAYIDX7_PROMOTED]], [[FOR_BODY3_PH]] ], [ [[ADD8:%.*]], [[FOR_BODY3]] ]64; CHECK-NEXT:    [[J_113:%.*]] = phi i32 [ [[J_016]], [[FOR_BODY3_PH]] ], [ [[INC:%.*]], [[FOR_BODY3]] ]65; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[J_113]] to i6466; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[VAR1]], i64 [[IDXPROM]]67; CHECK-NEXT:    store i32 [[ADD]], ptr [[ARRAYIDX]], align 4, !alias.scope [[META5:![0-9]+]], !noalias [[META2]]68; CHECK-NEXT:    [[ADD8]] = add nsw i32 [[ADD86]], [[ADD]]69; CHECK-NEXT:    [[INC]] = add nuw i32 [[J_113]], 170; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[INC]], [[ITR]]71; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_BODY3]], label [[FOR_INC11_LOOPEXIT_LOOPEXIT5:%.*]], !llvm.loop [[LOOP7:![0-9]+]]72; CHECK:       for.inc11.loopexit.loopexit:73; CHECK-NEXT:    br label [[FOR_INC11_LOOPEXIT:%.*]]74; CHECK:       for.inc11.loopexit.loopexit5:75; CHECK-NEXT:    [[ADD8_LCSSA:%.*]] = phi i32 [ [[ADD8]], [[FOR_BODY3]] ]76; CHECK-NEXT:    store i32 [[ADD8_LCSSA]], ptr [[ARRAYIDX7]], align 4, !alias.scope [[META2]]77; CHECK-NEXT:    br label [[FOR_INC11_LOOPEXIT]]78; CHECK:       for.inc11.loopexit:79; CHECK-NEXT:    br label [[FOR_INC11]]80; CHECK:       for.inc11:81; CHECK-NEXT:    [[J_1_LCSSA]] = phi i32 [ [[J_016]], [[FOR_COND1_PREHEADER]] ], [ [[ITR]], [[FOR_INC11_LOOPEXIT]] ]82; CHECK-NEXT:    [[INC12]] = add nuw i32 [[I_015]], 183; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[INC12]], [[ITR]]84; CHECK-NEXT:    [[INDVAR_NEXT]] = add i64 [[INDVAR]], 185; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_COND1_PREHEADER]], label [[FOR_END13_LOOPEXIT:%.*]]86; CHECK:       for.end13.loopexit:87; CHECK-NEXT:    br label [[FOR_END13]]88; CHECK:       for.end13:89; CHECK-NEXT:    ret i32 090;91entry:92  %cmp14 = icmp eq i32 %itr, 093  br i1 %cmp14, label %for.end13, label %for.cond1.preheader.preheader94 95for.cond1.preheader.preheader:                    ; preds = %entry96  br label %for.cond1.preheader97 98for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc1199  %j.016 = phi i32 [ %j.1.lcssa, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]100  %i.015 = phi i32 [ %inc12, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]101  %cmp212 = icmp ult i32 %j.016, %itr102  br i1 %cmp212, label %for.body3.lr.ph, label %for.inc11103 104for.body3.lr.ph:                                  ; preds = %for.cond1.preheader105  %add = add i32 %i.015, %itr106  %idxprom6 = zext i32 %i.015 to i64107  %arrayidx7 = getelementptr inbounds i32, ptr %var3, i64 %idxprom6108  br label %for.body3109 110for.body3:                                        ; preds = %for.body3.lr.ph, %for.body3111  %j.113 = phi i32 [ %j.016, %for.body3.lr.ph ], [ %inc, %for.body3 ]112  %idxprom = zext i32 %j.113 to i64113  %arrayidx = getelementptr inbounds i32, ptr %var1, i64 %idxprom114  store i32 %add, ptr %arrayidx, align 4115  %0 = load i32, ptr %arrayidx7, align 4116  %add8 = add nsw i32 %0, %add117  store i32 %add8, ptr %arrayidx7, align 4118  %inc = add nuw i32 %j.113, 1119  %cmp2 = icmp ult i32 %inc, %itr120  br i1 %cmp2, label %for.body3, label %for.inc11.loopexit121 122for.inc11.loopexit:                               ; preds = %for.body3123  br label %for.inc11124 125for.inc11:                                        ; preds = %for.inc11.loopexit, %for.cond1.preheader126  %j.1.lcssa = phi i32 [ %j.016, %for.cond1.preheader ], [ %itr, %for.inc11.loopexit ]127  %inc12 = add nuw i32 %i.015, 1128  %cmp = icmp ult i32 %inc12, %itr129  br i1 %cmp, label %for.cond1.preheader, label %for.end13.loopexit130 131for.end13.loopexit:                               ; preds = %for.inc11132  br label %for.end13133 134for.end13:                                        ; preds = %for.end13.loopexit, %entry135  ret i32 0136}137 138