1; RUN: opt -S -passes=rewrite-statepoints-for-gc < %s | FileCheck %s 2 3; Regression test to incorrectly testing fixed state causing infinite loop. 4; CHECK: test 5target triple = "x86_64-unknown-linux-gnu" 6 7declare void @bar(ptr addrspace(1) nocapture readonly) 8declare noalias ptr addrspace(1) @foo() 9 10define ptr addrspace(1) @test(i1 %c, i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5, i1 %c.exit) gc "statepoint-example" { 11entry: 12 br i1 %c, label %ph.L, label %ph.R 13ph.L: 14 %ph.L.p.b = call noalias nonnull ptr addrspace(1) @foo() 15 %ph.L.p = getelementptr i8, ptr addrspace(1) %ph.L.p.b, i64 8 16 br label %ph.M 17ph.R: 18 %ph.R.p = call noalias nonnull ptr addrspace(1) @foo() 19 br label %ph.M 20ph.M: 21 %ph.M.p = phi ptr addrspace(1) [ %ph.L.p, %ph.L ], [ %ph.R.p, %ph.R ] 22 br label %header 23 24header: 25 %header.p = phi ptr addrspace(1) [ %ph.M.p, %ph.M ], [ %backedge.p, %backedge] 26 br i1 %c1, label %loop.M, label %loop.R 27 28loop.R: 29 br i1 %c2, label %loop.R.M, label %loop.R.R 30 31loop.R.R: 32 %loop.R.R.p = call noalias nonnull ptr addrspace(1) @foo() 33 br label %loop.R.M 34 35loop.R.M: 36 %loop.R.M.p = phi ptr addrspace(1) [ %header.p, %loop.R ], [ %loop.R.R.p, %loop.R.R ] 37 br label %loop.M 38 39loop.M: 40 %loop.M.p = phi ptr addrspace(1) [ %loop.R.M.p, %loop.R.M ], [ %header.p, %header ] 41 br i1 %c4, label %backedge, label %pre.backedge.R 42 43pre.backedge.R: 44 br i1 %c5, label %pre.backedge.R.L, label %pre.backedge.R.R 45pre.backedge.R.L: 46 %pre.backedge.R.L.p.b = call noalias nonnull ptr addrspace(1) @foo() 47 %pre.backedge.R.L.p = getelementptr i8, ptr addrspace(1) %pre.backedge.R.L.p.b, i64 8 48 br label %pre.backedge.R.M 49pre.backedge.R.R: 50 %pre.backedge.R.R.p = call noalias nonnull ptr addrspace(1) @foo() 51 br label %pre.backedge.R.M 52pre.backedge.R.M: 53 %pre.backedge.R.M.p = phi ptr addrspace(1) [ %pre.backedge.R.L.p, %pre.backedge.R.L ], [ %pre.backedge.R.R.p, %pre.backedge.R.R ] 54 br label %backedge 55 56backedge: 57 %backedge.p = phi ptr addrspace(1) [ %pre.backedge.R.M.p, %pre.backedge.R.M ], [ %loop.M.p, %loop.M ] 58 br i1 %c.exit, label %header, label %exit 59 60exit: ; preds = %3, %1 61 call void @bar(ptr addrspace(1) align 8 %header.p) [ "deopt"() ] 62 ret ptr addrspace(1) %header.p 63} 64