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