This pass 'forwards' operand trees into statements that use them in order to avoid scalar dependencies. This minimal implementation handles only the case of speculatable instructions. We will successively add support for: - Hoisted loads - Read-only values - Synthesizable values - Loads - PHIs - Forwarding only parts of the tree Differential Revision: https://reviews.llvm.org/D35754 llvm-svn: 308825
49 lines
885 B
LLVM
49 lines
885 B
LLVM
; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
|
|
;
|
|
; Not the entire operand tree can be forwarded,
|
|
; some scalar dependencies would remain.
|
|
;
|
|
; for (int j = 0; j < n; j += 1) {
|
|
; bodyA:
|
|
; double val = f() + 21.0;
|
|
;
|
|
; bodyB:
|
|
; A[0] = val;
|
|
; }
|
|
;
|
|
declare double @f(...) #1
|
|
|
|
define void @func(i32 %n, 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 %bodyA, label %exit
|
|
|
|
bodyA:
|
|
%v = call double (...) @f()
|
|
%val = fadd double %v, 21.0
|
|
br label %bodyB
|
|
|
|
bodyB:
|
|
store double %val, double* %A
|
|
br label %inc
|
|
|
|
inc:
|
|
%j.inc = add nuw nsw i32 %j, 1
|
|
br label %for
|
|
|
|
exit:
|
|
br label %return
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
attributes #1 = { nounwind readnone }
|
|
|
|
|
|
; CHECK: ForwardOpTree executed, but did not modify anything
|