| ; RUN: opt %loadPolly -polly-codegen -polly-invariant-load-hoisting=true -polly-process-unprofitable -S < %s | FileCheck %s |
| ; |
| ; void fence(void); |
| ; |
| ; void f(int *A, int *B) { |
| ; int i = 0; |
| ; int x = 0; |
| ; |
| ; do { |
| ; x = *B; |
| ; S: A[i] += x; |
| ; } while (i++ < 100); |
| ; |
| ; fence(); |
| ; |
| ; do { |
| ; P: A[i]++; |
| ; } while (i++ < x / 2); |
| ; } |
| ; |
| ; CHECK: polly.stmt.stmt.P: |
| ; CHECK: sext i32 %tmp.merge to i64 |
| ; |
| target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| |
| define void @f(i32* %A, i32* %B) { |
| entry: |
| br label %stmt.S |
| |
| stmt.S: ; preds = %do.cond, %entry |
| %indvars.iv2 = phi i64 [ %indvars.iv.next3, %do.cond ], [ 0, %entry ] |
| %tmp = load i32, i32* %B, align 4 |
| %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv2 |
| %tmp4 = load i32, i32* %arrayidx, align 4 |
| %add = add nsw i32 %tmp4, %tmp |
| store i32 %add, i32* %arrayidx, align 4 |
| br label %do.cond |
| |
| do.cond: ; preds = %do.body |
| %indvars.iv.next3 = add nuw nsw i64 %indvars.iv2, 1 |
| %exitcond = icmp ne i64 %indvars.iv.next3, 101 |
| br i1 %exitcond, label %stmt.S, label %do.end |
| |
| do.end: ; preds = %do.cond |
| %tmp5 = trunc i64 101 to i32 |
| call void @fence() #2 |
| %tmp6 = sext i32 %tmp5 to i64 |
| br label %stmt.P |
| |
| stmt.P: ; preds = %do.cond.5, %do.end |
| %indvars.iv = phi i64 [ %indvars.iv.next, %do.cond.5 ], [ %tmp6, %do.end ] |
| %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv |
| %tmp7 = load i32, i32* %arrayidx3, align 4 |
| %inc4 = add nsw i32 %tmp7, 1 |
| store i32 %inc4, i32* %arrayidx3, align 4 |
| br label %do.cond.5 |
| |
| do.cond.5: ; preds = %do.body.1 |
| %div = sdiv i32 %tmp, 2 |
| %tmp8 = sext i32 %div to i64 |
| %cmp7 = icmp slt i64 %indvars.iv, %tmp8 |
| %indvars.iv.next = add i64 %indvars.iv, 1 |
| br i1 %cmp7, label %stmt.P, label %do.end.8 |
| |
| do.end.8: ; preds = %do.cond.5 |
| ret void |
| } |
| |
| declare void @fence() |