| ; RUN: opt %loadNPMPolly -passes="polly-custom<detect>" -polly-invariant-load-hoisting=true -polly-print-detect -disable-output %s | FileCheck %s --check-prefix=DETECT |
| ; RUN: opt %loadNPMPolly -passes="polly-custom<detect;codegen>" -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} |