; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; Test function specialization wouldn't crash due to constant expression. ; Note that this test case shows that function specialization pass would ; transform the function even if no specialization happened. ; RUN: opt -function-specialization -force-function-specialization -S < %s | FileCheck %s %struct = type { i8, i16, i32, i64, i64} @Global = internal constant %struct {i8 0, i16 1, i32 2, i64 3, i64 4} define internal i64 @func2(i64 *%x) { entry: %val = ptrtoint i64* %x to i64 ret i64 %val } define internal i64 @func(i64 *%x, i64 (i64*)* %binop) { ; CHECK-LABEL: @func( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = call i64 [[BINOP:%.*]](i64* [[X:%.*]]) ; CHECK-NEXT: ret i64 [[TMP0]] ; entry: %tmp0 = call i64 %binop(i64* %x) ret i64 %tmp0 } define internal i64 @zoo(i1 %flag) { ; CHECK-LABEL: @zoo( ; CHECK-NEXT: entry: ; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[PLUS:%.*]], label [[MINUS:%.*]] ; CHECK: plus: ; CHECK-NEXT: [[TMP0:%.*]] = call i64 @func2.2(i64* getelementptr inbounds ([[STRUCT:%.*]], %struct* @Global, i32 0, i32 3)) ; CHECK-NEXT: br label [[MERGE:%.*]] ; CHECK: minus: ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @func2.1(i64* getelementptr inbounds ([[STRUCT]], %struct* @Global, i32 0, i32 4)) ; CHECK-NEXT: br label [[MERGE]] ; CHECK: merge: ; CHECK-NEXT: [[TMP2:%.*]] = phi i64 [ [[TMP0]], [[PLUS]] ], [ [[TMP1]], [[MINUS]] ] ; CHECK-NEXT: ret i64 [[TMP2]] ; entry: br i1 %flag, label %plus, label %minus plus: %arg = getelementptr %struct, %struct* @Global, i32 0, i32 3 %tmp0 = call i64 @func2(i64* %arg) br label %merge minus: %arg2 = getelementptr %struct, %struct* @Global, i32 0, i32 4 %tmp1 = call i64 @func2(i64* %arg2) br label %merge merge: %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus] ret i64 %tmp2 } define i64 @main() { ; CHECK-LABEL: @main( ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @zoo(i1 false) ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @zoo(i1 true) ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP1]], [[TMP2]] ; CHECK-NEXT: ret i64 [[TMP3]] ; %1 = call i64 @zoo(i1 0) %2 = call i64 @zoo(i1 1) %3 = add i64 %1, %2 ret i64 %3 }