blob: 0a7c80a0cd9b3a2f873aea57e7428ad64b4b7be2 [file] [log] [blame]
; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
; Do not try to forward %i.trunc, it is not synthesizable in %body.
define void @func(i32 %n, i32* noalias nonnull %A) {
br label %for
%j = phi i32 [0, %entry], [, %inc]
%j.cmp = icmp slt i32 %j, %n
%zero = sext i32 0 to i64
br i1 %j.cmp, label %inner.for, label %exit
; This loop has some unusual properties:
; * It has a known iteration count (8), therefore SCoP-compatible.
; * %i.trunc is synthesizable within the loop ({1,+,1}<%while.body>).
; * %i.trunc is not synthesizable outside of the loop, because its value is
; unknown when exiting.
; (should be 8, but ScalarEvolution currently seems unable to derive that)
; ScalarEvolution currently seems to not able to handle the %zero.
; If it becomes more intelligent, there might be other such loop constructs.
%i = phi i64 [%zero, %for], [, %inner.for] = add nuw nsw i64 %i, 1
%i.trunc = trunc i64 to i32
%i.and = and i32 %i.trunc, 7
%inner.cond = icmp eq i32 %i.and, 0
br i1 %inner.cond, label %body, label %inner.for
store i32 %i.trunc, i32* %A
br label %inc
inc: = add nuw nsw i32 %j, 1
br label %for
br label %return
ret void
; CHECK: ForwardOpTree executed, but did not modify anything