; RUN: opt %loadNPMPolly -passes="polly-custom" -polly-invariant-load-hoisting=true -polly-print-detect -disable-output %s | FileCheck %s --check-prefix=DETECT ; RUN: opt %loadNPMPolly -passes="polly-custom" -polly-invariant-load-hoisting=true -S %s | FileCheck %s --check-prefix=CODEGEN ; ; https://github.com/llvm/llvm-project/issues/192208 ; If not already cached, getSCEV(%phi) would try to re-derive the ; SCEVAddRecExpr which will not work during the codegen phase where the SSA form ; has not been restored yet. ; ; DETECT: Valid Region for Scop: bb3 => bb5 ; DETECT: Valid Region for Scop: bb10.peel => bb3 ; ; CODEGEN: polly.start: ; CODEGEN: polly.start6: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" ; Function Attrs: nofree norecurse nosync nounwind memory(argmem: readwrite) define noundef i32 @wombat(ptr writeonly captures(none) initializes((0, 1)) %arg, ptr readonly captures(none) %arg1, i1 %arg2) local_unnamed_addr #0 { bb: br label %bb3 bb3.loopexit: ; preds = %bb10, %bb10.peel %add11.lcssa = phi i32 [ %add11.peel, %bb10.peel ], [ %add11, %bb10 ] br label %bb3 bb3: ; preds = %bb3.loopexit, %bb %phi = phi i32 [ 0, %bb ], [ %add11.lcssa, %bb3.loopexit ] %load = load i8, ptr %arg1, align 4 %icmp = icmp eq i8 %load, 0 br i1 %icmp, label %bb4, label %bb5 bb4: ; preds = %bb3 store i32 0, ptr %arg, align 8 br label %bb5 bb5: ; preds = %bb4, %bb3 store i8 0, ptr %arg, align 1 br i1 %arg2, label %bb9, label %bb10.peel bb10.peel: ; preds = %bb5 %zext = zext i8 %load to i32 %add = add nuw nsw i32 %phi, %zext %add11.peel = add nuw nsw i32 %add, 1 %icmp12.peel = icmp samesign ugt i32 %add, 1 br i1 %icmp12.peel, label %bb10, label %bb3.loopexit bb9: ; preds = %bb5 ret i32 0 bb10: ; preds = %bb10, %bb10.peel %phi8 = phi i32 [ %add11, %bb10 ], [ %add11.peel, %bb10.peel ] %add11 = add i32 %phi8, 1 %icmp12 = icmp ugt i32 %phi8, 1 br i1 %icmp12, label %bb10, label %bb3.loopexit, !llvm.loop !0 } attributes #0 = { nofree norecurse nosync nounwind memory(argmem: readwrite) } !0 = distinct !{!0, !1} !1 = !{!"llvm.loop.peeled.count", i32 1}