; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -function-specialization -S < %s | FileCheck %s %mystruct = type { i32, [2 x i64] } define internal %mystruct* @myfunc(%mystruct* %arg) { ; CHECK-LABEL: @myfunc( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[FOR_COND:%.*]] ; CHECK: for.cond: ; CHECK-NEXT: br i1 true, label [[FOR_COND2:%.*]], label [[FOR_BODY:%.*]] ; CHECK: for.body: ; CHECK-NEXT: call void @callee(%mystruct* nonnull null) ; CHECK-NEXT: br label [[FOR_COND]] ; CHECK: for.cond2: ; CHECK-NEXT: br i1 false, label [[FOR_END:%.*]], label [[FOR_BODY2:%.*]] ; CHECK: for.body2: ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[MYSTRUCT:%.*]], %mystruct* null, i64 0, i32 1, i64 3 ; CHECK-NEXT: br label [[FOR_COND2]] ; CHECK: for.end: ; CHECK-NEXT: ret %mystruct* [[ARG:%.*]] ; entry: br label %for.cond for.cond: ; preds = %for.body, %entry %phi = phi %mystruct* [ undef, %for.body ], [ null, %entry ] %cond = icmp eq %mystruct* %phi, null br i1 %cond, label %for.cond2, label %for.body for.body: ; preds = %for.cond call void @callee(%mystruct* nonnull %phi) br label %for.cond for.cond2: ; preds = %for.body2, %for.cond %phi2 = phi %mystruct* [ undef, %for.body2 ], [ null, %for.cond ] br i1 false, label %for.end, label %for.body2 for.body2: ; preds = %for.cond2 %arrayidx = getelementptr inbounds %mystruct, %mystruct* %phi2, i64 0, i32 1, i64 3 br label %for.cond2 for.end: ; preds = %for.cond2 ret %mystruct* %arg } define %mystruct* @caller() { ; CHECK-LABEL: @caller( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CALL:%.*]] = call %mystruct* @myfunc(%mystruct* undef) ; CHECK-NEXT: ret %mystruct* [[CALL]] ; entry: %call = call %mystruct* @myfunc(%mystruct* undef) ret %mystruct* %call } declare void @callee(%mystruct*)