xref: /llvm-project/llvm/test/Transforms/IROutliner/illegal-indirect-calls.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
157a46914SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost --no-ir-sim-indirect-calls < %s | FileCheck %s
357a46914SAndrew Litteken
4f5f377d1SAndrew Litteken; This test checks that we do not outline indirect calls when it is specified
5f5f377d1SAndrew Litteken; that we should not.
657a46914SAndrew Litteken
7*f4b925eeSMatt Arsenaultdeclare void @f1(ptr, ptr);
8*f4b925eeSMatt Arsenaultdeclare void @f2(ptr, ptr);
957a46914SAndrew Litteken
10*f4b925eeSMatt Arsenaultdefine void @function1(ptr %func) {
1157a46914SAndrew Litteken; CHECK-LABEL: @function1(
1257a46914SAndrew Litteken; CHECK-NEXT:  entry:
1357a46914SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
1457a46914SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1557a46914SAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
16*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
1757a46914SAndrew Litteken; CHECK-NEXT:    call void [[FUNC:%.*]]()
18*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
1957a46914SAndrew Litteken; CHECK-NEXT:    ret void
2057a46914SAndrew Litteken;
2157a46914SAndrew Littekenentry:
2257a46914SAndrew Litteken  %a = alloca i32, align 4
2357a46914SAndrew Litteken  %b = alloca i32, align 4
2457a46914SAndrew Litteken  %c = alloca i32, align 4
25*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
26*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
27*f4b925eeSMatt Arsenault  store i32 4, ptr %c, align 4
2857a46914SAndrew Litteken  call void %func()
29*f4b925eeSMatt Arsenault  %al = load i32, ptr %a
30*f4b925eeSMatt Arsenault  %bl = load i32, ptr %b
31*f4b925eeSMatt Arsenault  %cl = load i32, ptr %c
3257a46914SAndrew Litteken  ret void
3357a46914SAndrew Litteken}
3457a46914SAndrew Litteken
35*f4b925eeSMatt Arsenaultdefine void @function2(ptr %func) {
3657a46914SAndrew Litteken; CHECK-LABEL: @function2(
3757a46914SAndrew Litteken; CHECK-NEXT:  entry:
3857a46914SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
3957a46914SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
4057a46914SAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
41*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
4257a46914SAndrew Litteken; CHECK-NEXT:    call void [[FUNC:%.*]]()
43*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
4457a46914SAndrew Litteken; CHECK-NEXT:    ret void
4557a46914SAndrew Litteken;
4657a46914SAndrew Littekenentry:
4757a46914SAndrew Litteken  %a = alloca i32, align 4
4857a46914SAndrew Litteken  %b = alloca i32, align 4
4957a46914SAndrew Litteken  %c = alloca i32, align 4
50*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
51*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
52*f4b925eeSMatt Arsenault  store i32 4, ptr %c, align 4
5357a46914SAndrew Litteken  call void %func()
54*f4b925eeSMatt Arsenault  %al = load i32, ptr %a
55*f4b925eeSMatt Arsenault  %bl = load i32, ptr %b
56*f4b925eeSMatt Arsenault  %cl = load i32, ptr %c
5757a46914SAndrew Litteken  ret void
5857a46914SAndrew Litteken}
59