12a1ac2e3SSjoerd Meijer; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22a1ac2e3SSjoerd Meijer
30fd03febSChuanqi Xu; Test function specialization wouldn't crash due to constant expression.
40fd03febSChuanqi Xu; Note that this test case shows that function specialization pass would
50fd03febSChuanqi Xu; transform the function even if no specialization happened.
60fd03febSChuanqi Xu
72a1ac2e3SSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization -S < %s | FileCheck %s
80fd03febSChuanqi Xu
90fd03febSChuanqi Xu%struct = type { i8, i16, i32, i64, i64}
100fd03febSChuanqi Xu@Global = internal constant %struct {i8 0, i16 1, i32 2, i64 3, i64 4}
112a1ac2e3SSjoerd Meijer
12eba76056SSjoerd Meijerdefine internal i64 @func2(i64 *%x) {
13eba76056SSjoerd Meijerentry:
14eba76056SSjoerd Meijer  %val = ptrtoint i64* %x to i64
15eba76056SSjoerd Meijer  ret i64 %val
16eba76056SSjoerd Meijer}
17eba76056SSjoerd Meijer
18eba76056SSjoerd Meijerdefine internal i64 @func(i64 *%x, i64 (i64*)* %binop) {
19eba76056SSjoerd Meijer; CHECK-LABEL: @func(
20eba76056SSjoerd Meijer; CHECK-NEXT:  entry:
21eba76056SSjoerd Meijer; CHECK-NEXT:    [[TMP0:%.*]] = call i64 [[BINOP:%.*]](i64* [[X:%.*]])
22eba76056SSjoerd Meijer; CHECK-NEXT:    ret i64 [[TMP0]]
23eba76056SSjoerd Meijer;
24eba76056SSjoerd Meijerentry:
25eba76056SSjoerd Meijer  %tmp0 = call i64 %binop(i64* %x)
26eba76056SSjoerd Meijer  ret i64 %tmp0
27eba76056SSjoerd Meijer}
28eba76056SSjoerd Meijer
290fd03febSChuanqi Xudefine internal i64 @zoo(i1 %flag) {
302a1ac2e3SSjoerd Meijer; CHECK-LABEL: @zoo(
312a1ac2e3SSjoerd Meijer; CHECK-NEXT:  entry:
322a1ac2e3SSjoerd Meijer; CHECK-NEXT:    br i1 [[FLAG:%.*]], label [[PLUS:%.*]], label [[MINUS:%.*]]
332a1ac2e3SSjoerd Meijer; CHECK:       plus:
34*8b360c69SBin Cheng; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @func2.2(i64* getelementptr inbounds ([[STRUCT:%.*]], %struct* @Global, i32 0, i32 3))
352a1ac2e3SSjoerd Meijer; CHECK-NEXT:    br label [[MERGE:%.*]]
362a1ac2e3SSjoerd Meijer; CHECK:       minus:
37*8b360c69SBin Cheng; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @func2.1(i64* getelementptr inbounds ([[STRUCT]], %struct* @Global, i32 0, i32 4))
382a1ac2e3SSjoerd Meijer; CHECK-NEXT:    br label [[MERGE]]
392a1ac2e3SSjoerd Meijer; CHECK:       merge:
402a1ac2e3SSjoerd Meijer; CHECK-NEXT:    [[TMP2:%.*]] = phi i64 [ [[TMP0]], [[PLUS]] ], [ [[TMP1]], [[MINUS]] ]
412a1ac2e3SSjoerd Meijer; CHECK-NEXT:    ret i64 [[TMP2]]
422a1ac2e3SSjoerd Meijer;
430fd03febSChuanqi Xuentry:
440fd03febSChuanqi Xu  br i1 %flag, label %plus, label %minus
450fd03febSChuanqi Xu
460fd03febSChuanqi Xuplus:
470fd03febSChuanqi Xu  %arg = getelementptr %struct, %struct* @Global, i32 0, i32 3
480fd03febSChuanqi Xu  %tmp0 = call i64 @func2(i64* %arg)
490fd03febSChuanqi Xu  br label %merge
500fd03febSChuanqi Xu
510fd03febSChuanqi Xuminus:
520fd03febSChuanqi Xu  %arg2 = getelementptr %struct, %struct* @Global, i32 0, i32 4
530fd03febSChuanqi Xu  %tmp1 = call i64 @func2(i64* %arg2)
540fd03febSChuanqi Xu  br label %merge
550fd03febSChuanqi Xu
560fd03febSChuanqi Xumerge:
570fd03febSChuanqi Xu  %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus]
580fd03febSChuanqi Xu  ret i64 %tmp2
590fd03febSChuanqi Xu}
600fd03febSChuanqi Xu
610fd03febSChuanqi Xu
620fd03febSChuanqi Xudefine i64 @main() {
632a1ac2e3SSjoerd Meijer; CHECK-LABEL: @main(
642a1ac2e3SSjoerd Meijer; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @zoo(i1 false)
652a1ac2e3SSjoerd Meijer; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @zoo(i1 true)
662a1ac2e3SSjoerd Meijer; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[TMP1]], [[TMP2]]
672a1ac2e3SSjoerd Meijer; CHECK-NEXT:    ret i64 [[TMP3]]
682a1ac2e3SSjoerd Meijer;
690fd03febSChuanqi Xu  %1 = call i64 @zoo(i1 0)
700fd03febSChuanqi Xu  %2 = call i64 @zoo(i1 1)
710fd03febSChuanqi Xu  %3 = add i64 %1, %2
720fd03febSChuanqi Xu  ret i64 %3
730fd03febSChuanqi Xu}
74