Represent PHIs by their incoming values instead of an opaque value of themselves. This allows ForwardOpTree to "look through" the PHIs and forward the incoming values since forwardings PHIs is currently not supported. This is particularly useful to cope with PHIs inserted by GVN LoadPRE. The incoming values all resolve to a load from a single array element which then can be forwarded. It should in theory also reduce spurious conflicts in value mapping (DeLICM), but I have not yet found a profitable case yet, so it is not included here. To avoid transitive closure and potentially necessary overapproximations of those, PHIs that may reference themselves are excluded from normalization and keep their opaque self-representation. Differential Revision: https://reviews.llvm.org/D39333 llvm-svn: 317008
50 lines
1.1 KiB
LLVM
50 lines
1.1 KiB
LLVM
; RUN: opt %loadPolly -polly-optree-normalize-phi=true -polly-optree -analyze < %s | FileCheck %s -match-full-lines
|
|
;
|
|
; Contains a self-referencing PHINode that would require a
|
|
; transitive closure to handle.
|
|
;
|
|
; for (int j = 0; j < n; j += 1) {
|
|
; double phi = 0.0;
|
|
; for (int i = 0; i < m; i += 1)
|
|
; phi = phi;
|
|
; A[j] = phi;
|
|
; }
|
|
;
|
|
define void @func(i32 %n, i32 %m, double* noalias nonnull %A) {
|
|
entry:
|
|
br label %for
|
|
|
|
for:
|
|
%j = phi i32 [0, %entry], [%j.inc, %inc]
|
|
%j.cmp = icmp slt i32 %j, %n
|
|
br i1 %j.cmp, label %for.preheader, label %exit
|
|
|
|
for.preheader:
|
|
br label %for.inner
|
|
|
|
for.inner:
|
|
%i = phi i32 [0, %for.preheader], [%i.inc, %for.inner]
|
|
%phi = phi double [0.0, %for.preheader], [%phi, %for.inner]
|
|
%i.inc = add nuw nsw i32 %i, 1
|
|
%i.cmp = icmp slt i32 %i.inc, %m
|
|
br i1 %i.cmp, label %for.inner, label %for.exit
|
|
|
|
for.exit:
|
|
%A_idx = getelementptr inbounds double, double* %A, i32 %j
|
|
store double %phi, double* %A_idx
|
|
br label %inc
|
|
|
|
inc:
|
|
%j.inc = add nuw nsw i32 %j, 1
|
|
br label %for
|
|
|
|
exit:
|
|
br label %return
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
|
|
; CHECK: ForwardOpTree executed, but did not modify anything
|