[PATCH] D123408: [InstCombine] Limit folding of cast into PHI

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 8 10:30:31 PDT 2022


lebedev.ri added a comment.

In D123408#3439571 <https://reviews.llvm.org/D123408#3439571>, @syzaara wrote:

> In D123408#3439555 <https://reviews.llvm.org/D123408#3439555>, @lebedev.ri wrote:
>
>> This seems like a vectorizer bug.
>
> The reason it doesn't get vectorized is because loop vectorizer sees a truncating and instruction in the def-use chain of the reduction phi. The IR that vectorizer sees looks like this:
>
>   define internal fastcc void @do_one() unnamed_addr #1 {
>   entry:
>     tail call void (i8*, ...) @obfuscate(i8* noundef bitcast ([8192 x i16]* @x to i8*)) #3
>     br label %for.body
>   
>   for.body:                                         ; preds = %entry, %for.body
>     %a.010 = phi i32 [ 0, %entry ], [ %phi.cast, %for.body ]
>     %i.09 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
>     %arrayidx = getelementptr inbounds [8192 x i16], [8192 x i16]* @x, i64 0, i64 %i.09
>     %0 = load i16, i16* %arrayidx, align 2, !tbaa !6
>     %conv = zext i16 %0 to i32
>     %add = add nuw nsw i32 %a.010, %conv
>     %inc = add nuw nsw i64 %i.09, 1
>     %phi.cast = and i32 %add, 65535
>     %exitcond.not = icmp eq i64 %inc, 8192
>     br i1 %exitcond.not, label %for.end, label %for.body, !llvm.loop !10
>   
>   for.end:                                          ; preds = %for.body
>     %phi.cast.lcssa = phi i32 [ %phi.cast, %for.body ]
>     tail call void (i8*, ...) @obfuscate(i8* noundef bitcast ([8192 x i16]* @x to i8*), i32 noundef signext %phi.cast.lcssa) #3
>     ret void
>   }
>
> The %phi.cast = and i32 %add, 65535 instruction is not an ADD so the %a.010 phi doesn't qualify as an add reduction.
>
>   LV: Not vectorizing: Found an unidentified PHI %a.010 = phi i32 [ 0, %entry ], [ %phi.cast, %for.body ]

Yep, i agree. The vectorizer just needs to be able to understand that such an `and` effectively truncates the bit width.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D123408/new/

https://reviews.llvm.org/D123408



More information about the llvm-commits mailing list