1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[LV] First order recurrence phis should not be treated as uniform

This is fix for PR38786.
First order recurrence phis were incorrectly treated as uniform,
which caused them to be vectorized as uniform instructions.

Patch by Ayal Zaks and Orivej Desh!

Reviewed by: Anna

Differential Revision: https://reviews.llvm.org/D51639

llvm-svn: 341416
This commit is contained in:
Anna Thomas 2018-09-04 22:12:23 +00:00
parent 5d0534e4b6
commit d0c6bf40cb
2 changed files with 27 additions and 0 deletions

View File

@ -4529,6 +4529,11 @@ void LoopVectorizationCostModel::collectLoopUniforms(unsigned VF) {
// isOutOfScope operands cannot be uniform instructions.
if (isOutOfScope(OV))
continue;
// First order recurrence Phi's should typically be considered
// non-uniform.
auto *OP = dyn_cast<PHINode>(OV);
if (OP && Legal->isFirstOrderRecurrence(OP))
continue;
// If all the users of the operand are uniform, then add the
// operand into the uniform worklist.
auto *OI = cast<Instruction>(OV);

View File

@ -75,3 +75,25 @@ for.end: ; preds = %for.body
ret i64 %retval
}
; CHECK-LABEL: PR38786
; Check that first order recurrence phis (%phi32 and %phi64) are not uniform.
; CHECK-NOT: LV: Found uniform instruction: %phi
define void @PR38786(double* %y, double* %x, i64 %n) {
entry:
br label %for.body
for.body:
%phi32 = phi i32 [ 0, %entry ], [ %i32next, %for.body ]
%phi64 = phi i64 [ 0, %entry ], [ %i64next, %for.body ]
%i32next = add i32 %phi32, 1
%i64next = zext i32 %i32next to i64
%xip = getelementptr inbounds double, double* %x, i64 %i64next
%yip = getelementptr inbounds double, double* %y, i64 %phi64
%xi = load double, double* %xip, align 8
store double %xi, double* %yip, align 8
%cmp = icmp slt i64 %i64next, %n
br i1 %cmp, label %for.body, label %for.end
for.end:
ret void
}