1; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines 2; 3; Move operand tree without duplicating values used multiple times. 4; 5define void @func(i32 %n, ptr noalias nonnull %A) { 6entry: 7 br label %for 8 9for: 10 %j = phi i32 [0, %entry], [%j.inc, %inc] 11 %j.cmp = icmp slt i32 %j, %n 12 br i1 %j.cmp, label %bodyA, label %exit 13 14 bodyA: 15 %val1 = fadd double 12.5, 12.5 16 %val2 = fadd double %val1, %val1 17 %val3 = fadd double %val2, %val2 18 %val4 = fadd double %val3, %val3 19 %val5 = fadd double %val4, %val4 20 br label %bodyB 21 22 bodyB: 23 store double %val5, ptr %A 24 br label %inc 25 26inc: 27 %j.inc = add nuw nsw i32 %j, 1 28 br label %for 29 30exit: 31 br label %return 32 33return: 34 ret void 35} 36 37 38; CHECK: Statistics { 39; CHECK: Instructions copied: 5 40; CHECK: Operand trees forwarded: 1 41; CHECK: } 42 43; CHECK: After statements { 44; CHECK-NEXT: Stmt_bodyA 45; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] 46; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_val5[] }; 47; CHECK-NEXT: Instructions { 48; CHECK-NEXT: %val1 = fadd double 1.250000e+01, 1.250000e+01 49; CHECK-NEXT: %val2 = fadd double %val1, %val1 50; CHECK-NEXT: %val3 = fadd double %val2, %val2 51; CHECK-NEXT: %val4 = fadd double %val3, %val3 52; CHECK-NEXT: %val5 = fadd double %val4, %val4 53; CHECK-NEXT: } 54; CHECK-NEXT: Stmt_bodyB 55; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] 56; CHECK-NEXT: [n] -> { Stmt_bodyB[i0] -> MemRef_A[0] }; 57; CHECK-NEXT: Instructions { 58; CHECK-NEXT: %val1 = fadd double 1.250000e+01, 1.250000e+01 59; CHECK-NEXT: %val2 = fadd double %val1, %val1 60; CHECK-NEXT: %val3 = fadd double %val2, %val2 61; CHECK-NEXT: %val4 = fadd double %val3, %val3 62; CHECK-NEXT: %val5 = fadd double %val4, %val4 63; CHECK-NEXT: store double %val5, ptr %A, align 8 64; CHECK-NEXT: } 65; CHECK-NEXT: } 66