Files
clang-p2996/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
Bin Cheng 8b360c69e9 [FuncSpec]Fix assertion failure when value is not added to solver
This patch improves the fix in D110529 to prevent from crashing on value
with byval attribute that is not added in SCCP solver.

Authored-by: sinan.lin@linux.alibaba.com
Reviewed By: ChuanqiXu

Differential Revision: https://reviews.llvm.org/D126355
2022-06-10 18:45:53 +08:00

74 lines
2.2 KiB
LLVM

; 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
}