33
44target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
55
6- define i8 @PR34687 (i1 %c , i32 %x , i32 %n ) {
6+ define i8 @PR34687 (i1 %c , i32 %x , i32 %n , i32 %divisor ) {
77; CHECK-LABEL: @PR34687(
88; CHECK-NEXT: entry:
99; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N:%.*]], 4
@@ -13,20 +13,30 @@ define i8 @PR34687(i1 %c, i32 %x, i32 %n) {
1313; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]
1414; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i64 0
1515; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT1]], <4 x i32> poison, <4 x i32> zeroinitializer
16+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x i1> poison, i1 [[C:%.*]], i64 0
17+ ; CHECK-NEXT: [[BROADCAST_SPLAT3:%.*]] = shufflevector <4 x i1> [[BROADCAST_SPLATINSERT2]], <4 x i1> poison, <4 x i32> zeroinitializer
18+ ; CHECK-NEXT: [[TMP0:%.*]] = select <4 x i1> [[BROADCAST_SPLAT3]], <4 x i32> [[BROADCAST_SPLAT2]], <4 x i32> splat (i32 1)
19+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT3:%.*]] = insertelement <4 x i32> poison, i32 [[X1:%.*]], i64 0
20+ ; CHECK-NEXT: [[BROADCAST_SPLAT4:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT3]], <4 x i32> poison, <4 x i32> zeroinitializer
1621; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
1722; CHECK: vector.body:
1823; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
24+ ; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
1925; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ]
26+ ; CHECK-NEXT: [[TMP6:%.*]] = sdiv <4 x i32> [[VEC_IND]], [[TMP0]]
27+ ; CHECK-NEXT: [[PREDPHI1:%.*]] = select <4 x i1> [[BROADCAST_SPLAT3]], <4 x i32> [[TMP6]], <4 x i32> zeroinitializer
2028; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i32> [[VEC_PHI]], splat (i32 255)
21- ; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[TMP1]], [[BROADCAST_SPLAT2 ]]
29+ ; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[TMP1]], [[BROADCAST_SPLAT4 ]]
2230; CHECK-NEXT: [[TMP3:%.*]] = trunc <4 x i32> [[TMP2]] to <4 x i8>
2331; CHECK-NEXT: [[TMP4]] = zext <4 x i8> [[TMP3]] to <4 x i32>
2432; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
33+ ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
2534; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
2635; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
2736; CHECK: middle.block:
2837; CHECK-NEXT: [[TMP7:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP3]])
2938; CHECK-NEXT: [[TMP8:%.*]] = zext i8 [[TMP7]] to i32
39+ ; CHECK-NEXT: [[PREDPHI:%.*]] = extractelement <4 x i32> [[PREDPHI1]], i32 3
3040; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]
3141; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]
3242; CHECK: scalar.ph:
@@ -36,17 +46,19 @@ define i8 @PR34687(i1 %c, i32 %x, i32 %n) {
3646; CHECK: for.body:
3747; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[I_NEXT:%.*]], [[IF_END:%.*]] ]
3848; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[R_NEXT:%.*]], [[IF_END]] ]
39- ; CHECK-NEXT: br i1 [[C:%.* ]], label [[IF_THEN:%.*]], label [[IF_END]]
49+ ; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END]]
4050; CHECK: if.then:
41- ; CHECK-NEXT: [[T0:%.*]] = sdiv i32 6, 2
51+ ; CHECK-NEXT: [[T0:%.*]] = sdiv i32 [[I]], [[X]]
4252; CHECK-NEXT: br label [[IF_END]]
4353; CHECK: if.end:
54+ ; CHECK-NEXT: [[DIV_PHI:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[T0]], [[IF_THEN]] ]
4455; CHECK-NEXT: [[T1:%.*]] = and i32 [[R]], 255
4556; CHECK-NEXT: [[I_NEXT]] = add nsw i32 [[I]], 1
46- ; CHECK-NEXT: [[R_NEXT]] = add nuw nsw i32 [[T1]], [[X ]]
57+ ; CHECK-NEXT: [[R_NEXT]] = add nuw nsw i32 [[T1]], [[X1 ]]
4758; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N]]
4859; CHECK-NEXT: br i1 [[COND]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
4960; CHECK: for.end:
61+ ; CHECK-NEXT: [[DIV_USE:%.*]] = phi i32 [ [[DIV_PHI]], [[IF_END]] ], [ [[PREDPHI]], [[MIDDLE_BLOCK]] ]
5062; CHECK-NEXT: [[T2:%.*]] = phi i32 [ [[R_NEXT]], [[IF_END]] ], [ [[TMP8]], [[MIDDLE_BLOCK]] ]
5163; CHECK-NEXT: [[T3:%.*]] = trunc i32 [[T2]] to i8
5264; CHECK-NEXT: ret i8 [[T3]]
@@ -60,17 +72,19 @@ for.body:
6072 br i1 %c , label %if.then , label %if.end
6173
6274if.then:
63- %t0 = sdiv i32 6 , 2
75+ %t0 = sdiv i32 %i , %divisor
6476 br label %if.end
6577
6678if.end:
79+ %div_phi = phi i32 [ 0 , %for.body ], [ %t0 , %if.then ]
6780 %t1 = and i32 %r , 255
6881 %i.next = add nsw i32 %i , 1
6982 %r.next = add nuw nsw i32 %t1 , %x
7083 %cond = icmp eq i32 %i.next , %n
7184 br i1 %cond , label %for.end , label %for.body
7285
7386for.end:
87+ %div_use = phi i32 [ %div_phi , %if.end ]
7488 %t2 = phi i32 [ %r.next , %if.end ]
7589 %t3 = trunc i32 %t2 to i8
7690 ret i8 %t3
0 commit comments