1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -S -passes=loop-unroll -unroll-allow-partial < %s | FileCheck %s 3 4target triple = "x86_64-unknown-linux-gnu" 5 6define i32 @test(ptr %ary) "target-cpu"="znver3" { 7; CHECK-LABEL: define i32 @test( 8; CHECK-SAME: ptr [[ARY:%.*]]) #[[ATTR0:[0-9]+]] { 9; CHECK-NEXT: entry: 10; CHECK-NEXT: br label [[FOR_BODY:%.*]] 11; CHECK: for.body: 12; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT_127:%.*]], [[FOR_BODY]] ] 13; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_NEXT_127:%.*]], [[FOR_BODY]] ] 14; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV]] 15; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 16; CHECK-NEXT: [[SUM_NEXT:%.*]] = add nsw i32 [[VAL]], [[SUM]] 17; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1 18; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT]] 19; CHECK-NEXT: [[VAL_1:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4 20; CHECK-NEXT: [[SUM_NEXT_1:%.*]] = add nsw i32 [[VAL_1]], [[SUM_NEXT]] 21; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 2 22; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_1]] 23; CHECK-NEXT: [[VAL_2:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4 24; CHECK-NEXT: [[SUM_NEXT_2:%.*]] = add nsw i32 [[VAL_2]], [[SUM_NEXT_1]] 25; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 3 26; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_2]] 27; CHECK-NEXT: [[VAL_3:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4 28; CHECK-NEXT: [[SUM_NEXT_3:%.*]] = add nsw i32 [[VAL_3]], [[SUM_NEXT_2]] 29; CHECK-NEXT: [[INDVARS_IV_NEXT_3:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 4 30; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_3]] 31; CHECK-NEXT: [[VAL_4:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4 32; CHECK-NEXT: [[SUM_NEXT_4:%.*]] = add nsw i32 [[VAL_4]], [[SUM_NEXT_3]] 33; CHECK-NEXT: [[INDVARS_IV_NEXT_4:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 5 34; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_4]] 35; CHECK-NEXT: [[VAL_5:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4 36; CHECK-NEXT: [[SUM_NEXT_5:%.*]] = add nsw i32 [[VAL_5]], [[SUM_NEXT_4]] 37; CHECK-NEXT: [[INDVARS_IV_NEXT_5:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 6 38; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_5]] 39; CHECK-NEXT: [[VAL_6:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4 40; CHECK-NEXT: [[SUM_NEXT_6:%.*]] = add nsw i32 [[VAL_6]], [[SUM_NEXT_5]] 41; CHECK-NEXT: [[INDVARS_IV_NEXT_6:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 7 42; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_6]] 43; CHECK-NEXT: [[VAL_7:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4 44; CHECK-NEXT: [[SUM_NEXT_7:%.*]] = add nsw i32 [[VAL_7]], [[SUM_NEXT_6]] 45; CHECK-NEXT: [[INDVARS_IV_NEXT_7:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 8 46; CHECK-NEXT: [[ARRAYIDX_8:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_7]] 47; CHECK-NEXT: [[VAL_8:%.*]] = load i32, ptr [[ARRAYIDX_8]], align 4 48; CHECK-NEXT: [[SUM_NEXT_8:%.*]] = add nsw i32 [[VAL_8]], [[SUM_NEXT_7]] 49; CHECK-NEXT: [[INDVARS_IV_NEXT_8:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 9 50; CHECK-NEXT: [[ARRAYIDX_9:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_8]] 51; CHECK-NEXT: [[VAL_9:%.*]] = load i32, ptr [[ARRAYIDX_9]], align 4 52; CHECK-NEXT: [[SUM_NEXT_9:%.*]] = add nsw i32 [[VAL_9]], [[SUM_NEXT_8]] 53; CHECK-NEXT: [[INDVARS_IV_NEXT_9:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 10 54; CHECK-NEXT: [[ARRAYIDX_10:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_9]] 55; CHECK-NEXT: [[VAL_10:%.*]] = load i32, ptr [[ARRAYIDX_10]], align 4 56; CHECK-NEXT: [[SUM_NEXT_10:%.*]] = add nsw i32 [[VAL_10]], [[SUM_NEXT_9]] 57; CHECK-NEXT: [[INDVARS_IV_NEXT_10:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 11 58; CHECK-NEXT: [[ARRAYIDX_11:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_10]] 59; CHECK-NEXT: [[VAL_11:%.*]] = load i32, ptr [[ARRAYIDX_11]], align 4 60; CHECK-NEXT: [[SUM_NEXT_11:%.*]] = add nsw i32 [[VAL_11]], [[SUM_NEXT_10]] 61; CHECK-NEXT: [[INDVARS_IV_NEXT_11:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 12 62; CHECK-NEXT: [[ARRAYIDX_12:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_11]] 63; CHECK-NEXT: [[VAL_12:%.*]] = load i32, ptr [[ARRAYIDX_12]], align 4 64; CHECK-NEXT: [[SUM_NEXT_12:%.*]] = add nsw i32 [[VAL_12]], [[SUM_NEXT_11]] 65; CHECK-NEXT: [[INDVARS_IV_NEXT_12:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 13 66; CHECK-NEXT: [[ARRAYIDX_13:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_12]] 67; CHECK-NEXT: [[VAL_13:%.*]] = load i32, ptr [[ARRAYIDX_13]], align 4 68; CHECK-NEXT: [[SUM_NEXT_13:%.*]] = add nsw i32 [[VAL_13]], [[SUM_NEXT_12]] 69; CHECK-NEXT: [[INDVARS_IV_NEXT_13:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 14 70; CHECK-NEXT: [[ARRAYIDX_14:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_13]] 71; CHECK-NEXT: [[VAL_14:%.*]] = load i32, ptr [[ARRAYIDX_14]], align 4 72; CHECK-NEXT: [[SUM_NEXT_14:%.*]] = add nsw i32 [[VAL_14]], [[SUM_NEXT_13]] 73; CHECK-NEXT: [[INDVARS_IV_NEXT_14:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 15 74; CHECK-NEXT: [[ARRAYIDX_15:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_NEXT_14]] 75; CHECK-NEXT: [[VAL_15:%.*]] = load i32, ptr [[ARRAYIDX_15]], align 4 76; CHECK-NEXT: [[SUM_NEXT_127]] = add nsw i32 [[VAL_15]], [[SUM_NEXT_14]] 77; CHECK-NEXT: [[INDVARS_IV_NEXT_127]] = add nuw nsw i64 [[INDVARS_IV]], 16 78; CHECK-NEXT: [[EXITCOND_NOT_127:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_127]], 8192 79; CHECK-NEXT: br i1 [[EXITCOND_NOT_127]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]] 80; CHECK: for.cond.cleanup: 81; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT_127]], [[FOR_BODY]] ] 82; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 83; 84entry: 85 br label %for.body 86 87for.body: 88 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 89 %sum = phi i32 [ 0, %entry ], [ %sum.next, %for.body ] 90 %arrayidx = getelementptr inbounds i32, ptr %ary, i64 %indvars.iv 91 %val = load i32, ptr %arrayidx, align 4 92 %sum.next = add nsw i32 %val, %sum 93 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 94 %exitcond.not = icmp eq i64 %indvars.iv.next, 8192 95 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 96 97for.cond.cleanup: 98 ret i32 %sum.next 99} 100 101define i32 @test2(ptr %ary, i64 %n) "target-cpu"="znver3" { 102; CHECK-LABEL: define i32 @test2( 103; CHECK-SAME: ptr [[ARY:%.*]], i64 [[N:%.*]]) #[[ATTR0]] { 104; CHECK-NEXT: entry: 105; CHECK-NEXT: br label [[FOR_BODY:%.*]] 106; CHECK: for.body: 107; CHECK-NEXT: [[INDVARS_IV_EPIL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[FOR_BODY]] ] 108; CHECK-NEXT: [[SUM_EPIL:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_NEXT_EPIL:%.*]], [[FOR_BODY]] ] 109; CHECK-NEXT: [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[ARY]], i64 [[INDVARS_IV_EPIL]] 110; CHECK-NEXT: [[VAL_EPIL:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 4 111; CHECK-NEXT: [[DUMMY21:%.*]] = mul i32 [[VAL_EPIL]], [[VAL_EPIL]] 112; CHECK-NEXT: [[DUMMY27:%.*]] = mul i32 [[DUMMY21]], [[DUMMY21]] 113; CHECK-NEXT: [[DUMMY28:%.*]] = mul i32 [[DUMMY27]], [[DUMMY27]] 114; CHECK-NEXT: [[DUMMY4:%.*]] = mul i32 [[DUMMY28]], [[DUMMY28]] 115; CHECK-NEXT: [[DUMMY5:%.*]] = mul i32 [[DUMMY4]], [[DUMMY4]] 116; CHECK-NEXT: [[DUMMY6:%.*]] = mul i32 [[DUMMY5]], [[DUMMY5]] 117; CHECK-NEXT: [[DUMMY7:%.*]] = mul i32 [[DUMMY6]], [[DUMMY6]] 118; CHECK-NEXT: [[DUMMY8:%.*]] = mul i32 [[DUMMY7]], [[DUMMY7]] 119; CHECK-NEXT: [[DUMMY9:%.*]] = mul i32 [[DUMMY8]], [[DUMMY8]] 120; CHECK-NEXT: [[DUMMY10:%.*]] = mul i32 [[DUMMY9]], [[DUMMY9]] 121; CHECK-NEXT: [[DUMMY29:%.*]] = mul i32 [[DUMMY10]], [[DUMMY10]] 122; CHECK-NEXT: [[DUMMY30:%.*]] = mul i32 [[DUMMY29]], [[DUMMY29]] 123; CHECK-NEXT: [[DUMMY39:%.*]] = mul i32 [[DUMMY30]], [[DUMMY30]] 124; CHECK-NEXT: [[DUMMY40:%.*]] = mul i32 [[DUMMY39]], [[DUMMY39]] 125; CHECK-NEXT: [[DUMMY15:%.*]] = mul i32 [[DUMMY40]], [[DUMMY40]] 126; CHECK-NEXT: [[DUMMY16:%.*]] = mul i32 [[DUMMY15]], [[DUMMY15]] 127; CHECK-NEXT: [[DUMMY17:%.*]] = mul i32 [[DUMMY16]], [[DUMMY16]] 128; CHECK-NEXT: [[DUMMY18:%.*]] = mul i32 [[DUMMY17]], [[DUMMY17]] 129; CHECK-NEXT: [[DUMMY19:%.*]] = mul i32 [[DUMMY18]], [[DUMMY18]] 130; CHECK-NEXT: [[DUMMY20:%.*]] = mul i32 [[DUMMY19]], [[DUMMY19]] 131; CHECK-NEXT: [[VAL:%.*]] = mul i32 [[DUMMY20]], [[DUMMY20]] 132; CHECK-NEXT: [[DUMMY1:%.*]] = mul i32 [[VAL]], [[VAL]] 133; CHECK-NEXT: [[DUMMY2:%.*]] = mul i32 [[DUMMY1]], [[DUMMY1]] 134; CHECK-NEXT: [[DUMMY3:%.*]] = mul i32 [[DUMMY2]], [[DUMMY2]] 135; CHECK-NEXT: [[DUMMY41:%.*]] = mul i32 [[DUMMY3]], [[DUMMY3]] 136; CHECK-NEXT: [[DUMMY26:%.*]] = mul i32 [[DUMMY41]], [[DUMMY41]] 137; CHECK-NEXT: [[DUMMY11:%.*]] = mul i32 [[DUMMY26]], [[DUMMY26]] 138; CHECK-NEXT: [[DUMMY12:%.*]] = mul i32 [[DUMMY11]], [[DUMMY11]] 139; CHECK-NEXT: [[DUMMY13:%.*]] = mul i32 [[DUMMY12]], [[DUMMY12]] 140; CHECK-NEXT: [[DUMMY14:%.*]] = mul i32 [[DUMMY13]], [[DUMMY13]] 141; CHECK-NEXT: [[DUMMY31:%.*]] = mul i32 [[DUMMY14]], [[DUMMY14]] 142; CHECK-NEXT: [[DUMMY32:%.*]] = mul i32 [[DUMMY31]], [[DUMMY31]] 143; CHECK-NEXT: [[DUMMY22:%.*]] = mul i32 [[DUMMY32]], [[DUMMY32]] 144; CHECK-NEXT: [[DUMMY23:%.*]] = mul i32 [[DUMMY22]], [[DUMMY22]] 145; CHECK-NEXT: [[DUMMY24:%.*]] = mul i32 [[DUMMY23]], [[DUMMY23]] 146; CHECK-NEXT: [[DUMMY25:%.*]] = mul i32 [[DUMMY24]], [[DUMMY24]] 147; CHECK-NEXT: [[DUMMY37:%.*]] = mul i32 [[DUMMY25]], [[DUMMY25]] 148; CHECK-NEXT: [[DUMMY38:%.*]] = mul i32 [[DUMMY37]], [[DUMMY37]] 149; CHECK-NEXT: [[DUMMY33:%.*]] = mul i32 [[DUMMY38]], [[DUMMY38]] 150; CHECK-NEXT: [[DUMMY34:%.*]] = mul i32 [[DUMMY33]], [[DUMMY33]] 151; CHECK-NEXT: [[DUMMY35:%.*]] = mul i32 [[DUMMY34]], [[DUMMY34]] 152; CHECK-NEXT: [[DUMMY36:%.*]] = mul i32 [[DUMMY35]], [[DUMMY35]] 153; CHECK-NEXT: [[DUMMY43:%.*]] = mul i32 [[DUMMY36]], [[DUMMY36]] 154; CHECK-NEXT: [[DUMMY44:%.*]] = mul i32 [[DUMMY43]], [[DUMMY43]] 155; CHECK-NEXT: [[DUMMY45:%.*]] = mul i32 [[DUMMY44]], [[DUMMY44]] 156; CHECK-NEXT: [[DUMMY46:%.*]] = mul i32 [[DUMMY45]], [[DUMMY45]] 157; CHECK-NEXT: [[DUMMY47:%.*]] = mul i32 [[DUMMY46]], [[DUMMY46]] 158; CHECK-NEXT: [[DUMMY48:%.*]] = mul i32 [[DUMMY47]], [[DUMMY47]] 159; CHECK-NEXT: [[DUMMY49:%.*]] = mul i32 [[DUMMY48]], [[DUMMY48]] 160; CHECK-NEXT: [[DUMMY50_EPIL:%.*]] = mul i32 [[DUMMY49]], [[DUMMY49]] 161; CHECK-NEXT: [[SUM_NEXT_EPIL]] = add nsw i32 [[DUMMY50_EPIL]], [[SUM_EPIL]] 162; CHECK-NEXT: [[INDVARS_IV_NEXT_EPIL]] = add nuw nsw i64 [[INDVARS_IV_EPIL]], 1 163; CHECK-NEXT: [[EXITCOND_NOT_EPIL:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_EPIL]], [[N]] 164; CHECK-NEXT: br i1 [[EXITCOND_NOT_EPIL]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]] 165; CHECK: for.cond.cleanup: 166; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT_EPIL]], [[FOR_BODY]] ] 167; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 168; 169entry: 170 br label %for.body 171 172for.body: 173 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 174 %sum = phi i32 [ 0, %entry ], [ %sum.next, %for.body ] 175 %arrayidx = getelementptr inbounds i32, ptr %ary, i64 %indvars.iv 176 %val = load i32, ptr %arrayidx, align 4 177 %dummy1 = mul i32 %val, %val 178 %dummy2 = mul i32 %dummy1, %dummy1 179 %dummy3 = mul i32 %dummy2, %dummy2 180 %dummy4 = mul i32 %dummy3, %dummy3 181 %dummy5 = mul i32 %dummy4, %dummy4 182 %dummy6 = mul i32 %dummy5, %dummy5 183 %dummy7 = mul i32 %dummy6, %dummy6 184 %dummy8 = mul i32 %dummy7, %dummy7 185 %dummy9 = mul i32 %dummy8, %dummy8 186 %dummy10 = mul i32 %dummy9, %dummy9 187 %dummy11 = mul i32 %dummy10, %dummy10 188 %dummy12 = mul i32 %dummy11, %dummy11 189 %dummy13 = mul i32 %dummy12, %dummy12 190 %dummy14 = mul i32 %dummy13, %dummy13 191 %dummy15 = mul i32 %dummy14, %dummy14 192 %dummy16 = mul i32 %dummy15, %dummy15 193 %dummy17 = mul i32 %dummy16, %dummy16 194 %dummy18 = mul i32 %dummy17, %dummy17 195 %dummy19 = mul i32 %dummy18, %dummy18 196 %dummy20 = mul i32 %dummy19, %dummy19 197 %dummy21 = mul i32 %dummy20, %dummy20 198 %dummy22 = mul i32 %dummy21, %dummy21 199 %dummy23 = mul i32 %dummy22, %dummy22 200 %dummy24 = mul i32 %dummy23, %dummy23 201 %dummy25 = mul i32 %dummy24, %dummy24 202 %dummy26 = mul i32 %dummy25, %dummy25 203 %dummy27 = mul i32 %dummy26, %dummy26 204 %dummy28 = mul i32 %dummy27, %dummy27 205 %dummy29 = mul i32 %dummy28, %dummy28 206 %dummy30 = mul i32 %dummy29, %dummy29 207 %dummy31 = mul i32 %dummy30, %dummy30 208 %dummy32 = mul i32 %dummy31, %dummy31 209 %dummy33 = mul i32 %dummy32, %dummy32 210 %dummy34 = mul i32 %dummy33, %dummy33 211 %dummy35 = mul i32 %dummy34, %dummy34 212 %dummy36 = mul i32 %dummy35, %dummy35 213 %dummy37 = mul i32 %dummy36, %dummy36 214 %dummy38 = mul i32 %dummy37, %dummy37 215 %dummy39 = mul i32 %dummy38, %dummy38 216 %dummy40 = mul i32 %dummy39, %dummy39 217 %dummy41 = mul i32 %dummy40, %dummy40 218 %dummy42 = mul i32 %dummy41, %dummy41 219 %dummy43 = mul i32 %dummy42, %dummy42 220 %dummy44 = mul i32 %dummy43, %dummy43 221 %dummy45 = mul i32 %dummy44, %dummy44 222 %dummy46 = mul i32 %dummy45, %dummy45 223 %dummy47 = mul i32 %dummy46, %dummy46 224 %dummy48 = mul i32 %dummy47, %dummy47 225 %dummy49 = mul i32 %dummy48, %dummy48 226 %dummy50 = mul i32 %dummy49, %dummy49 227 %sum.next = add nsw i32 %dummy50, %sum 228 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 229 %exitcond.not = icmp eq i64 %indvars.iv.next, %n 230 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 231 232for.cond.cleanup: 233 ret i32 %sum.next 234} 235 236