Compiler projects using llvm
; RUN: opt -S -memoryssa %s | FileCheck %s
; REQUIRES: asserts
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; CHECK-LABEL: @func()
; Function Attrs: noinline
define dso_local void @func() unnamed_addr #0 align 2 {
entry:
  %NoFinalize.addr = alloca i8, align 1
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  %call8 = call zeroext i1 @foo()
  br i1 %call8, label %if.then9, label %while.cond

if.then9:                                         ; preds = %entry
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  br label %while.cond

while.cond:                                       ; preds = %cleanup, %if.then9, %entry
  %call34 = call zeroext i1 @foo()
  call void @blah()
  br i1 %call34, label %while.body, label %while.end

while.body:                                       ; preds = %while.cond
  %call35 = call zeroext i1 @foo()
  br i1 %call35, label %if.end37, label %if.then36

if.then36:                                        ; preds = %while.body
  store i32 2, i32* undef, align 4
  br label %cleanup

if.end37:                                         ; preds = %while.body
  %call38 = call zeroext i1 @foo()
  br i1 %call38, label %if.end46, label %land.lhs.true

land.lhs.true:                                    ; preds = %if.end37
  call void @blah()
  %call41 = call zeroext i1 @foo()
  br i1 %call41, label %if.then42, label %if.end46

if.then42:                                        ; preds = %land.lhs.true
  call void @blah()
  br label %if.end46

if.end46:                                         ; preds = %if.then42, %land.lhs.true, %if.end37
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  br label %cleanup

cleanup:                                          ; preds = %if.end46, %if.then36
  call void @blah()
  br label %while.cond

while.end:                                        ; preds = %while.cond
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  %call93 = call zeroext i1 @foo()
  br i1 %call93, label %if.end120, label %if.then94

if.then94:                                        ; preds = %while.end
  store i32 0, i32* undef, align 4
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  br label %for.cond

for.cond:                                         ; preds = %for.body, %if.then94
  br i1 undef, label %for.body, label %if.end120

for.body:                                         ; preds = %for.cond
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  call void @blah()
  br label %for.cond

if.end120:                                        ; preds = %for.cond, %while.end
  %val = load i8, i8* %NoFinalize.addr, align 1
  ret void
}

; Function Attrs: noinline
declare hidden void @blah() unnamed_addr #0 align 2

; Function Attrs: noinline
declare hidden i1 @foo() local_unnamed_addr #0 align 2

attributes #0 = { noinline }