diff options
Diffstat (limited to 'test/Transforms/Inline')
-rw-r--r-- | test/Transforms/Inline/alloca-dbgdeclare.ll | 141 | ||||
-rw-r--r-- | test/Transforms/Inline/debug-info-duplicate-calls.ll | 121 | ||||
-rw-r--r-- | test/Transforms/Inline/debug-invoke.ll | 14 | ||||
-rw-r--r-- | test/Transforms/Inline/ignore-debug-info.ll | 12 | ||||
-rw-r--r-- | test/Transforms/Inline/inline-fast-math-flags.ll | 34 | ||||
-rw-r--r-- | test/Transforms/Inline/inline-fp.ll | 136 | ||||
-rw-r--r-- | test/Transforms/Inline/inline-indirect.ll | 19 | ||||
-rw-r--r-- | test/Transforms/Inline/inline-vla.ll | 2 | ||||
-rw-r--r-- | test/Transforms/Inline/inline_dbg_declare.ll | 97 | ||||
-rw-r--r-- | test/Transforms/Inline/noalias-calls.ll | 12 | ||||
-rw-r--r-- | test/Transforms/Inline/noalias-cs.ll | 68 | ||||
-rw-r--r-- | test/Transforms/Inline/noalias.ll | 18 | ||||
-rw-r--r-- | test/Transforms/Inline/noalias2.ll | 42 | ||||
-rw-r--r-- | test/Transforms/Inline/optimization-remarks.ll | 2 | ||||
-rw-r--r-- | test/Transforms/Inline/pr21206.ll | 8 |
15 files changed, 637 insertions, 89 deletions
diff --git a/test/Transforms/Inline/alloca-dbgdeclare.ll b/test/Transforms/Inline/alloca-dbgdeclare.ll new file mode 100644 index 0000000..6809e41 --- /dev/null +++ b/test/Transforms/Inline/alloca-dbgdeclare.ll @@ -0,0 +1,141 @@ +; RUN: opt -inline -S < %s | FileCheck %s +; struct A { +; int arg0; +; double arg1[2]; +; } a, b; +; +; void fn3(A p1) { +; if (p1.arg0) +; a = p1; +; } +; +; void fn4() { fn3(b); } +; +; void fn5() { +; while (1) +; fn4(); +; } +; ModuleID = 'test.cpp' +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-apple-darwin" + +%struct.A = type { i32, [2 x double] } + +@a = global %struct.A zeroinitializer, align 8 +@b = global %struct.A zeroinitializer, align 8 + +; Function Attrs: nounwind +declare void @_Z3fn31A(%struct.A* nocapture readonly %p1) #0 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +; Function Attrs: nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #2 + +; Function Attrs: nounwind +define void @_Z3fn4v() #0 { +entry: +; Test that the dbg.declare is moved together with the alloca. +; CHECK: define void @_Z3fn5v() +; CHECK-NEXT: entry: +; CHECK-NEXT: %agg.tmp.sroa.3.i = alloca [20 x i8], align 4 +; CHECK-NEXT: call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3.i, + %agg.tmp.sroa.3 = alloca [20 x i8], align 4 + tail call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3, metadata !46, metadata !48), !dbg !49 + %agg.tmp.sroa.0.0.copyload = load i32* getelementptr inbounds (%struct.A* @b, i64 0, i32 0), align 8, !dbg !50 + tail call void @llvm.dbg.value(metadata i32 %agg.tmp.sroa.0.0.copyload, i64 0, metadata !46, metadata !51), !dbg !49 + %agg.tmp.sroa.3.0..sroa_idx = getelementptr inbounds [20 x i8]* %agg.tmp.sroa.3, i64 0, i64 0, !dbg !50 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %agg.tmp.sroa.3.0..sroa_idx, i8* getelementptr (i8* bitcast (%struct.A* @b to i8*), i64 4), i64 20, i32 4, i1 false), !dbg !50 + tail call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !46, metadata !31) #2, !dbg !49 + %tobool.i = icmp eq i32 %agg.tmp.sroa.0.0.copyload, 0, !dbg !52 + br i1 %tobool.i, label %_Z3fn31A.exit, label %if.then.i, !dbg !53 + +if.then.i: ; preds = %entry + store i32 %agg.tmp.sroa.0.0.copyload, i32* getelementptr inbounds (%struct.A* @a, i64 0, i32 0), align 8, !dbg !54 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* getelementptr (i8* bitcast (%struct.A* @a to i8*), i64 4), i8* %agg.tmp.sroa.3.0..sroa_idx, i64 20, i32 4, i1 false), !dbg !54 + br label %_Z3fn31A.exit, !dbg !54 + +_Z3fn31A.exit: ; preds = %entry, %if.then.i + ret void, !dbg !50 +} + +; Function Attrs: noreturn nounwind +define void @_Z3fn5v() #3 { +entry: + br label %while.body, !dbg !55 + +while.body: ; preds = %entry, %while.body + call void @_Z3fn4v(), !dbg !56 + br label %while.body, !dbg !55 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind } +attributes #3 = { noreturn nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!28, !29} +!llvm.ident = !{!30} + +!0 = !{!"0x11\004\00clang version 3.7.0 (trunk 227480) (llvm/trunk 227517)\001\00\000\00\001", !1, !2, !3, !14, !25, !2} ; [ DW_TAG_compile_unit ] [/<stdin>] [DW_LANG_C_plus_plus] +!1 = !{!"<stdin>", !""} +!2 = !{} +!3 = !{!4} +!4 = !{!"0x13\00A\001\00192\0064\000\000\000", !5, null, null, !6, null, null, !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 192, align 64, offset 0] [def] [from ] +!5 = !{!"test.cpp", !""} +!6 = !{!7, !9} +!7 = !{!"0xd\00arg0\002\0032\0032\000\000", !5, !"_ZTS1A", !8} ; [ DW_TAG_member ] [arg0] [line 2, size 32, align 32, offset 0] [from int] +!8 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = !{!"0xd\00arg1\003\00128\0064\0064\000", !5, !"_ZTS1A", !10} ; [ DW_TAG_member ] [arg1] [line 3, size 128, align 64, offset 64] [from ] +!10 = !{!"0x1\00\000\00128\0064\000\000\000", null, null, !11, !12, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 128, align 64, offset 0] [from double] +!11 = !{!"0x24\00double\000\0064\0064\000\000\004", null, null} ; [ DW_TAG_base_type ] [double] [line 0, size 64, align 64, offset 0, enc DW_ATE_float] +!12 = !{!13} +!13 = !{!"0x21\000\002"} ; [ DW_TAG_subrange_type ] [0, 1] +!14 = !{!15, !21, !24} +!15 = !{!"0x2e\00fn3\00fn3\00_Z3fn31A\006\000\001\000\000\00256\001\006", !5, !16, !17, null, void (%struct.A*)* @_Z3fn31A, null, null, !19} ; [ DW_TAG_subprogram ] [line 6] [def] [fn3] +!16 = !{!"0x29", !5} ; [ DW_TAG_file_type ] [/test.cpp] +!17 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !18, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!18 = !{null, !"_ZTS1A"} +!19 = !{!20} +!20 = !{!"0x101\00p1\0016777222\000", !15, !16, !"_ZTS1A"} ; [ DW_TAG_arg_variable ] [p1] [line 6] +!21 = !{!"0x2e\00fn4\00fn4\00_Z3fn4v\0011\000\001\000\000\00256\001\0011", !5, !16, !22, null, void ()* @_Z3fn4v, null, null, !2} ; [ DW_TAG_subprogram ] [line 11] [def] [fn4] +!22 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !23, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!23 = !{null} +!24 = !{!"0x2e\00fn5\00fn5\00_Z3fn5v\0013\000\001\000\000\00256\001\0013", !5, !16, !22, null, void ()* @_Z3fn5v, null, null, !2} ; [ DW_TAG_subprogram ] [line 13] [def] [fn5] +!25 = !{!26, !27} +!26 = !{!"0x34\00a\00a\00\004\000\001", null, !16, !"_ZTS1A", %struct.A* @a, null} ; [ DW_TAG_variable ] [a] [line 4] [def] +!27 = !{!"0x34\00b\00b\00\004\000\001", null, !16, !"_ZTS1A", %struct.A* @b, null} ; [ DW_TAG_variable ] [b] [line 4] [def] +!28 = !{i32 2, !"Dwarf Version", i32 4} +!29 = !{i32 2, !"Debug Info Version", i32 2} +!30 = !{!"clang version 3.7.0 (trunk 227480) (llvm/trunk 227517)"} +!31 = !{!"0x102\006"} ; [ DW_TAG_expression ] [DW_OP_deref] +!32 = !MDLocation(line: 6, scope: !15) +!33 = !MDLocation(line: 7, scope: !34) +!34 = !{!"0xb\007\000\000", !5, !15} ; [ DW_TAG_lexical_block ] [/test.cpp] +!35 = !{!36, !37, i64 0} +!36 = !{!"_ZTS1A", !37, i64 0, !38, i64 8} +!37 = !{!"int", !38, i64 0} +!38 = !{!"omnipotent char", !39, i64 0} +!39 = !{!"Simple C/C++ TBAA"} +!40 = !MDLocation(line: 7, scope: !15) +!41 = !MDLocation(line: 8, scope: !34) +!42 = !{i64 0, i64 4, !43, i64 8, i64 16, !44} +!43 = !{!37, !37, i64 0} +!44 = !{!38, !38, i64 0} +!45 = !MDLocation(line: 9, scope: !15) +!46 = !{!"0x101\00p1\0016777222\000", !15, !16, !"_ZTS1A", !47} ; [ DW_TAG_arg_variable ] [p1] [line 6] +!47 = distinct !MDLocation(line: 11, scope: !21) +!48 = !{!"0x102\00147\004\0020"} ; [ DW_TAG_expression ] [DW_OP_piece offset=4, size=20] +!49 = !MDLocation(line: 6, scope: !15, inlinedAt: !47) +!50 = !MDLocation(line: 11, scope: !21) +!51 = !{!"0x102\00147\000\004"} ; [ DW_TAG_expression ] [DW_OP_piece offset=0, size=4] +!52 = !MDLocation(line: 7, scope: !34, inlinedAt: !47) +!53 = !MDLocation(line: 7, scope: !15, inlinedAt: !47) +!54 = !MDLocation(line: 8, scope: !34, inlinedAt: !47) +!55 = !MDLocation(line: 14, scope: !24) +!56 = !MDLocation(line: 15, scope: !24) diff --git a/test/Transforms/Inline/debug-info-duplicate-calls.ll b/test/Transforms/Inline/debug-info-duplicate-calls.ll new file mode 100644 index 0000000..2363693 --- /dev/null +++ b/test/Transforms/Inline/debug-info-duplicate-calls.ll @@ -0,0 +1,121 @@ +; RUN: opt < %s -always-inline -S | FileCheck %s + +; Original input generated from clang -emit-llvm -S -c -mllvm -disable-llvm-optzns +; +; #define CALLS1 f2(); f2(); +; #define CALLS2 f4(); f4(); +; void f1(); +; inline __attribute__((always_inline)) void f2() { +; f1(); +; } +; inline __attribute__((always_inline)) void f3() { +; CALLS1 +; } +; inline __attribute__((always_inline)) void f4() { +; f3(); +; } +; void f() { +; CALLS2 +; } + +; There should be unique locations for all 4 of these instructions, correctly +; describing the inlining that has occurred, even in the face of duplicate call +; site locations. + +; The nomenclature used for the tags here is <function name>[cs<number>] where +; 'cs' is an abbreviation for 'call site' and the number indicates which call +; site from within the named function this is. (so, given the above inlining, we +; should have 4 calls to 'f1', two from the first call to f4 and two from the +; second call to f4) + +; CHECK: call void @_Z2f1v(), !dbg [[fcs1_f4_f3cs1_f2:![0-9]+]] +; CHECK: call void @_Z2f1v(), !dbg [[fcs1_f4_f3cs2_f2:![0-9]+]] +; CHECK: call void @_Z2f1v(), !dbg [[fcs2_f4_f3cs1_f2:![0-9]+]] +; CHECK: call void @_Z2f1v(), !dbg [[fcs2_f4_f3cs2_f2:![0-9]+]] + +; CHECK-DAG: [[F:![0-9]+]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [f] +; CHECK-DAG: [[F2:![0-9]+]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [f2] +; CHECK-DAG: [[F3:![0-9]+]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [f3] +; CHECK-DAG: [[F4:![0-9]+]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [f4] + +; CHECK: [[fcs1_f4_f3cs1_f2]] = {{.*}}, scope: [[F2]], inlinedAt: [[fcs1_f4_f3cs1:![0-9]+]]) +; CHECK: [[fcs1_f4_f3cs1]] = {{.*}}, scope: [[F3]], inlinedAt: [[fcs1_f4:![0-9]+]]) +; CHECK: [[fcs1_f4]] = {{.*}}, scope: [[F4]], inlinedAt: [[fcs1:![0-9]+]]) +; CHECK: [[fcs1]] = {{.*}}, scope: [[F]]) +; CHECK: [[fcs1_f4_f3cs2_f2]] = {{.*}}, scope: [[F2]], inlinedAt: [[fcs1_f4_f3cs2:![0-9]+]]) +; CHECK: [[fcs1_f4_f3cs2]] = {{.*}}, scope: [[F3]], inlinedAt: [[fcs1_f4]]) + +; CHECK: [[fcs2_f4_f3cs1_f2]] = {{.*}}, scope: [[F2]], inlinedAt: [[fcs2_f4_f3cs1:![0-9]+]]) +; CHECK: [[fcs2_f4_f3cs1]] = {{.*}}, scope: [[F3]], inlinedAt: [[fcs2_f4:![0-9]+]]) +; CHECK: [[fcs2_f4]] = {{.*}}, scope: [[F4]], inlinedAt: [[fcs2:![0-9]+]]) +; CHECK: [[fcs2]] = {{.*}}, scope: [[F]]) +; CHECK: [[fcs2_f4_f3cs2_f2]] = {{.*}}, scope: [[F2]], inlinedAt: [[fcs2_f4_f3cs2:![0-9]+]]) +; CHECK: [[fcs2_f4_f3cs2]] = {{.*}}, scope: [[F3]], inlinedAt: [[fcs2_f4]]) + +$_Z2f4v = comdat any + +$_Z2f3v = comdat any + +$_Z2f2v = comdat any + +; Function Attrs: uwtable +define void @_Z1fv() #0 { +entry: + call void @_Z2f4v(), !dbg !13 + call void @_Z2f4v(), !dbg !13 + ret void, !dbg !14 +} + +; Function Attrs: alwaysinline inlinehint uwtable +define linkonce_odr void @_Z2f4v() #1 comdat { +entry: + call void @_Z2f3v(), !dbg !15 + ret void, !dbg !16 +} + +; Function Attrs: alwaysinline inlinehint uwtable +define linkonce_odr void @_Z2f3v() #1 comdat { +entry: + call void @_Z2f2v(), !dbg !17 + call void @_Z2f2v(), !dbg !17 + ret void, !dbg !18 +} + +; Function Attrs: alwaysinline inlinehint uwtable +define linkonce_odr void @_Z2f2v() #1 comdat { +entry: + call void @_Z2f1v(), !dbg !19 + ret void, !dbg !20 +} + +declare void @_Z2f1v() #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { alwaysinline inlinehint uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!10, !11} +!llvm.ident = !{!12} + +!0 = !{!"0x11\004\00clang version 3.7.0 (trunk 226474) (llvm/trunk 226478)\000\00\000\00\002", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/debug-info-duplicate-calls.cpp] [DW_LANG_C_plus_plus] +!1 = !{!"debug-info-duplicate-calls.cpp", !"/tmp/dbginfo"} +!2 = !{} +!3 = !{!4, !7, !8, !9} +!4 = !{!"0x2e\00f\00f\00\0013\000\001\000\000\00256\000\0013", !1, !5, !6, null, void ()* @_Z1fv, null, null, !2} ; [ DW_TAG_subprogram ] [line 13] [def] [f] +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/debug-info-duplicate-calls.cpp] +!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !2, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = !{!"0x2e\00f4\00f4\00\0010\000\001\000\000\00256\000\0010", !1, !5, !6, null, void ()* @_Z2f4v, null, null, !2} ; [ DW_TAG_subprogram ] [line 10] [def] [f4] +!8 = !{!"0x2e\00f3\00f3\00\007\000\001\000\000\00256\000\007", !1, !5, !6, null, void ()* @_Z2f3v, null, null, !2} ; [ DW_TAG_subprogram ] [line 7] [def] [f3] +!9 = !{!"0x2e\00f2\00f2\00\004\000\001\000\000\00256\000\004", !1, !5, !6, null, void ()* @_Z2f2v, null, null, !2} ; [ DW_TAG_subprogram ] [line 4] [def] [f2] +!10 = !{i32 2, !"Dwarf Version", i32 4} +!11 = !{i32 2, !"Debug Info Version", i32 2} +!12 = !{!"clang version 3.7.0 (trunk 226474) (llvm/trunk 226478)"} +!13 = !MDLocation(line: 14, column: 3, scope: !4) +!14 = !MDLocation(line: 15, column: 1, scope: !4) +!15 = !MDLocation(line: 11, column: 3, scope: !7) +!16 = !MDLocation(line: 12, column: 1, scope: !7) +!17 = !MDLocation(line: 8, column: 3, scope: !8) +!18 = !MDLocation(line: 9, column: 1, scope: !8) +!19 = !MDLocation(line: 5, column: 3, scope: !9) +!20 = !MDLocation(line: 6, column: 1, scope: !9) diff --git a/test/Transforms/Inline/debug-invoke.ll b/test/Transforms/Inline/debug-invoke.ll index 0de2d22..74ba9dc 100644 --- a/test/Transforms/Inline/debug-invoke.ll +++ b/test/Transforms/Inline/debug-invoke.ll @@ -4,9 +4,9 @@ ; CHECK: invoke void @test() ; CHECK-NEXT: to label {{.*}} unwind label {{.*}}, !dbg [[INL_LOC:!.*]] -; CHECK: [[EMPTY:.*]] = metadata !{} -; CHECK: [[INL_LOC]] = metadata !{i32 1, i32 0, metadata [[EMPTY]], metadata [[INL_AT:.*]]} -; CHECK: [[INL_AT]] = metadata !{i32 2, i32 0, metadata [[EMPTY]], null} +; CHECK: [[EMPTY:.*]] = !{} +; CHECK: [[INL_LOC]] = !MDLocation(line: 1, scope: [[EMPTY]], inlinedAt: [[INL_AT:.*]]) +; CHECK: [[INL_AT]] = distinct !MDLocation(line: 2, scope: [[EMPTY]]) declare void @test() declare i32 @__gxx_personality_v0(...) @@ -31,7 +31,7 @@ lpad: } !llvm.module.flags = !{!1} -!1 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} -!2 = metadata !{} -!3 = metadata !{i32 1, i32 0, metadata !2, null} -!4 = metadata !{i32 2, i32 0, metadata !2, null} +!1 = !{i32 2, !"Debug Info Version", i32 2} +!2 = !{} +!3 = !MDLocation(line: 1, scope: !2) +!4 = !MDLocation(line: 2, scope: !2) diff --git a/test/Transforms/Inline/ignore-debug-info.ll b/test/Transforms/Inline/ignore-debug-info.ll index 428b5d5..8bd6e7c 100644 --- a/test/Transforms/Inline/ignore-debug-info.ll +++ b/test/Transforms/Inline/ignore-debug-info.ll @@ -47,9 +47,9 @@ attributes #0 = { nounwind readnone } !llvm.module.flags = !{!3, !4} !llvm.ident = !{!5} -!0 = metadata !{metadata !"0x11\004\00\000\00\000\00\000", metadata !1, metadata !2, metadata !2, metadata !{}, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !"", metadata !""} -!2 = metadata !{i32 0} -!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!4 = metadata !{i32 1, metadata !"Debug Info Version", i32 2} -!5 = metadata !{metadata !""} +!0 = !{!"0x11\004\00\000\00\000\00\000", !1, !2, !2, !{}, !2, !2} ; [ DW_TAG_compile_unit ] +!1 = !{!"", !""} +!2 = !{i32 0} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 1, !"Debug Info Version", i32 2} +!5 = !{!""} diff --git a/test/Transforms/Inline/inline-fast-math-flags.ll b/test/Transforms/Inline/inline-fast-math-flags.ll new file mode 100644 index 0000000..c6a1487 --- /dev/null +++ b/test/Transforms/Inline/inline-fast-math-flags.ll @@ -0,0 +1,34 @@ +; RUN: opt < %s -S -inline -inline-threshold=20 | FileCheck %s +; Check that we don't drop FastMathFlag when estimating inlining profitability. +; +; In this test we should inline 'foo' to 'boo', because it'll fold to a +; constant. + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" + +define float @foo(float* %a, float %b) { +entry: + %a0 = load float* %a, align 4 + %mul = fmul fast float %a0, %b + %tobool = fcmp une float %mul, 0.000000e+00 + br i1 %tobool, label %if.then, label %if.end + +if.then: ; preds = %entry + %a1 = load float* %a, align 8 + %arrayidx1 = getelementptr inbounds float* %a, i64 1 + %a2 = load float* %arrayidx1, align 4 + %add = fadd fast float %a1, %a2 + br label %if.end + +if.end: ; preds = %if.then, %entry + %storemerge = phi float [ %add, %if.then ], [ 1.000000e+00, %entry ] + ret float %storemerge +} + +; CHECK-LABEL: @boo +; CHECK-NOT: call float @foo +define float @boo(float* %a) { +entry: + %call = call float @foo(float* %a, float 0.000000e+00) + ret float %call +} diff --git a/test/Transforms/Inline/inline-fp.ll b/test/Transforms/Inline/inline-fp.ll new file mode 100644 index 0000000..4d18ce8 --- /dev/null +++ b/test/Transforms/Inline/inline-fp.ll @@ -0,0 +1,136 @@ +; RUN: opt -S -inline < %s | FileCheck %s +; Make sure that soft float implementations are calculated as being more expensive +; to the inliner. + +define i32 @test_nofp() #0 { +; f_nofp() has the "use-soft-float" attribute, so it should never get inlined. +; CHECK-LABEL: test_nofp +; CHECK: call float @f_nofp +entry: + %responseX = alloca i32, align 4 + %responseY = alloca i32, align 4 + %responseZ = alloca i32, align 4 + %valueX = alloca i8, align 1 + %valueY = alloca i8, align 1 + %valueZ = alloca i8, align 1 + + call void @getX(i32* %responseX, i8* %valueX) + call void @getY(i32* %responseY, i8* %valueY) + call void @getZ(i32* %responseZ, i8* %valueZ) + + %0 = load i32* %responseX + %1 = load i8* %valueX + %call = call float @f_nofp(i32 %0, i8 zeroext %1) + %2 = load i32* %responseZ + %3 = load i8* %valueZ + %call2 = call float @f_nofp(i32 %2, i8 zeroext %3) + %call3 = call float @fabsf(float %call) + %cmp = fcmp ogt float %call3, 0x3FC1EB8520000000 + br i1 %cmp, label %if.end12, label %if.else + +if.else: ; preds = %entry + %4 = load i32* %responseY + %5 = load i8* %valueY + %call1 = call float @f_nofp(i32 %4, i8 zeroext %5) + %call4 = call float @fabsf(float %call1) + %cmp5 = fcmp ogt float %call4, 0x3FC1EB8520000000 + br i1 %cmp5, label %if.end12, label %if.else7 + +if.else7: ; preds = %if.else + %call8 = call float @fabsf(float %call2) + %cmp9 = fcmp ogt float %call8, 0x3FC1EB8520000000 + br i1 %cmp9, label %if.then10, label %if.end12 + +if.then10: ; preds = %if.else7 + br label %if.end12 + +if.end12: ; preds = %if.else, %entry, %if.then10, %if.else7 + %success.0 = phi i32 [ 0, %if.then10 ], [ 1, %if.else7 ], [ 0, %entry ], [ 0, %if.else ] + ret i32 %success.0 +} + +define i32 @test_hasfp() #0 { +; f_hasfp() does not have the "use-soft-float" attribute, so it should get inlined. +; CHECK-LABEL: test_hasfp +; CHECK-NOT: call float @f_hasfp +entry: + %responseX = alloca i32, align 4 + %responseY = alloca i32, align 4 + %responseZ = alloca i32, align 4 + %valueX = alloca i8, align 1 + %valueY = alloca i8, align 1 + %valueZ = alloca i8, align 1 + + call void @getX(i32* %responseX, i8* %valueX) + call void @getY(i32* %responseY, i8* %valueY) + call void @getZ(i32* %responseZ, i8* %valueZ) + + %0 = load i32* %responseX + %1 = load i8* %valueX + %call = call float @f_hasfp(i32 %0, i8 zeroext %1) + %2 = load i32* %responseZ + %3 = load i8* %valueZ + %call2 = call float @f_hasfp(i32 %2, i8 zeroext %3) + %call3 = call float @fabsf(float %call) + %cmp = fcmp ogt float %call3, 0x3FC1EB8520000000 + br i1 %cmp, label %if.end12, label %if.else + +if.else: ; preds = %entry + %4 = load i32* %responseY + %5 = load i8* %valueY + %call1 = call float @f_hasfp(i32 %4, i8 zeroext %5) + %call4 = call float @fabsf(float %call1) + %cmp5 = fcmp ogt float %call4, 0x3FC1EB8520000000 + br i1 %cmp5, label %if.end12, label %if.else7 + +if.else7: ; preds = %if.else + %call8 = call float @fabsf(float %call2) + %cmp9 = fcmp ogt float %call8, 0x3FC1EB8520000000 + br i1 %cmp9, label %if.then10, label %if.end12 + +if.then10: ; preds = %if.else7 + br label %if.end12 + +if.end12: ; preds = %if.else, %entry, %if.then10, %if.else7 + %success.0 = phi i32 [ 0, %if.then10 ], [ 1, %if.else7 ], [ 0, %entry ], [ 0, %if.else ] + ret i32 %success.0 +} + +declare void @getX(i32*, i8*) #0 + +declare void @getY(i32*, i8*) #0 + +declare void @getZ(i32*, i8*) #0 + +define internal float @f_hasfp(i32 %response, i8 zeroext %value1) #0 { +entry: + %conv = zext i8 %value1 to i32 + %sub = add nsw i32 %conv, -1 + %conv1 = sitofp i32 %sub to float + %0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1) + %mul = fmul float %0, 2.620000e+03 + %conv2 = sitofp i32 %response to float + %sub3 = fsub float %conv2, %mul + %div = fdiv float %sub3, %mul + ret float %div +} + +define internal float @f_nofp(i32 %response, i8 zeroext %value1) #1 { +entry: + %conv = zext i8 %value1 to i32 + %sub = add nsw i32 %conv, -1 + %conv1 = sitofp i32 %sub to float + %0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1) + %mul = fmul float %0, 2.620000e+03 + %conv2 = sitofp i32 %response to float + %sub3 = fsub float %conv2, %mul + %div = fdiv float %sub3, %mul + ret float %div +} + +declare float @fabsf(float) optsize minsize + +declare float @llvm.pow.f32(float, float) optsize minsize + +attributes #0 = { minsize optsize } +attributes #1 = { minsize optsize "use-soft-float"="true" } diff --git a/test/Transforms/Inline/inline-indirect.ll b/test/Transforms/Inline/inline-indirect.ll new file mode 100644 index 0000000..f6eb528 --- /dev/null +++ b/test/Transforms/Inline/inline-indirect.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -inline -disable-output 2>/dev/null +; This test used to trigger an assertion in the assumption cache when +; inlining the indirect call +declare void @llvm.assume(i1) + +define void @foo() { + ret void +} + +define void @bar(void ()*) { + call void @llvm.assume(i1 true) + call void %0(); + ret void +} + +define void @baz() { + call void @bar(void ()* @foo) + ret void +} diff --git a/test/Transforms/Inline/inline-vla.ll b/test/Transforms/Inline/inline-vla.ll index dc9deaa..7da448b 100644 --- a/test/Transforms/Inline/inline-vla.ll +++ b/test/Transforms/Inline/inline-vla.ll @@ -35,4 +35,4 @@ attributes #2 = { nounwind } !llvm.ident = !{!0} -!0 = metadata !{metadata !"clang version 3.5.0 (trunk 205695) (llvm/trunk 205706)"} +!0 = !{!"clang version 3.5.0 (trunk 205695) (llvm/trunk 205706)"} diff --git a/test/Transforms/Inline/inline_dbg_declare.ll b/test/Transforms/Inline/inline_dbg_declare.ll new file mode 100644 index 0000000..d296678 --- /dev/null +++ b/test/Transforms/Inline/inline_dbg_declare.ll @@ -0,0 +1,97 @@ +; RUN: opt < %s -S -inline | FileCheck %s
+;
+; The purpose of this test is to check that inline pass preserves debug info
+; for variable using the dbg.declare intrinsic.
+;
+;; This test was generated by running this command:
+;; clang.exe -S -O0 -emit-llvm -g foo.c
+;;
+;; foo.c
+;; ==========================
+;; float foo(float x)
+;; {
+;; return x;
+;; }
+;;
+;; void bar(float *dst)
+;; {
+;; dst[0] = foo(dst[0]);
+;; }
+;; ==========================
+
+target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
+target triple = "i686-pc-windows-msvc"
+
+; Function Attrs: nounwind
+define float @foo(float %x) #0 {
+entry:
+ %x.addr = alloca float, align 4
+ store float %x, float* %x.addr, align 4
+ call void @llvm.dbg.declare(metadata float* %x.addr, metadata !16, metadata !17), !dbg !18
+ %0 = load float* %x.addr, align 4, !dbg !19
+ ret float %0, !dbg !19
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+; CHECK: define void @bar
+
+; Function Attrs: nounwind
+define void @bar(float* %dst) #0 {
+entry:
+
+; CHECK: [[x_addr_i:%[a-zA-Z0-9.]+]] = alloca float, align 4
+
+ %dst.addr = alloca float*, align 4
+ store float* %dst, float** %dst.addr, align 4
+ call void @llvm.dbg.declare(metadata float** %dst.addr, metadata !20, metadata !17), !dbg !21
+ %0 = load float** %dst.addr, align 4, !dbg !22
+ %arrayidx = getelementptr inbounds float* %0, i32 0, !dbg !22
+ %1 = load float* %arrayidx, align 4, !dbg !22
+ %call = call float @foo(float %1), !dbg !22
+
+; CHECK-NOT: call float @foo
+; CHECK: void @llvm.dbg.declare(metadata float* [[x_addr_i]], metadata [[m23:![0-9]+]], metadata !17), !dbg [[m24:![0-9]+]]
+
+ %2 = load float** %dst.addr, align 4, !dbg !22
+ %arrayidx1 = getelementptr inbounds float* %2, i32 0, !dbg !22
+ store float %call, float* %arrayidx1, align 4, !dbg !22
+ ret void, !dbg !23
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { nounwind readnone }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!13, !14}
+!llvm.ident = !{!15}
+
+!0 = !{!"0x11\0012\00clang version 3.6.0 (trunk)\000\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [foo.c] [DW_LANG_C99]
+!1 = !{!"foo.c", !""}
+!2 = !{}
+!3 = !{!4, !9}
+!4 = !{!"0x2e\00foo\00foo\00\001\000\001\000\000\00256\000\002", !1, !5, !6, null, float (float)* @foo, null, null, !2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [foo]
+!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [foo.c]
+!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!7 = !{!8, !8}
+!8 = !{!"0x24\00float\000\0032\0032\000\000\004", null, null} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float]
+!9 = !{!"0x2e\00bar\00bar\00\006\000\001\000\000\00256\000\007", !1, !5, !10, null, void (float*)* @bar, null, null, !2} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 7] [bar]
+!10 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !11, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!11 = !{null, !12}
+!12 = !{!"0xf\00\000\0032\0032\000\000", null, null, !8} ; [ DW_TAG_pointer_type ] [line 0, size 32, align 32, offset 0] [from float]
+!13 = !{i32 2, !"Dwarf Version", i32 4}
+!14 = !{i32 2, !"Debug Info Version", i32 2}
+!15 = !{!"clang version 3.6.0 (trunk)"}
+!16 = !{!"0x101\00x\0016777217\000", !4, !5, !8} ; [ DW_TAG_arg_variable ] [x] [line 1]
+!17 = !{!"0x102"} ; [ DW_TAG_expression ]
+!18 = !MDLocation(line: 1, column: 17, scope: !4)
+!19 = !MDLocation(line: 3, column: 5, scope: !4)
+!20 = !{!"0x101\00dst\0016777222\000", !9, !5, !12} ; [ DW_TAG_arg_variable ] [dst] [line 6]
+!21 = !MDLocation(line: 6, column: 17, scope: !9)
+!22 = !MDLocation(line: 8, column: 14, scope: !9)
+!23 = !MDLocation(line: 9, column: 1, scope: !9)
+
+; CHECK: [[CALL_SITE:![0-9]+]] = distinct !MDLocation(line: 8, column: 14, scope: !9)
+; CHECK: [[m23]] = !{!"0x101\00x\0016777217\000", !4, !5, !8, [[CALL_SITE]]} ; [ DW_TAG_arg_variable ] [x] [line 1]
+; CHECK: [[m24]] = !MDLocation(line: 1, column: 17, scope: !4, inlinedAt: [[CALL_SITE]])
diff --git a/test/Transforms/Inline/noalias-calls.ll b/test/Transforms/Inline/noalias-calls.ll index 13408e4..c09d2a6 100644 --- a/test/Transforms/Inline/noalias-calls.ll +++ b/test/Transforms/Inline/noalias-calls.ll @@ -35,10 +35,10 @@ entry: attributes #0 = { nounwind } attributes #1 = { nounwind uwtable } -; CHECK: !0 = metadata !{metadata !1} -; CHECK: !1 = metadata !{metadata !1, metadata !2, metadata !"hello: %c"} -; CHECK: !2 = metadata !{metadata !2, metadata !"hello"} -; CHECK: !3 = metadata !{metadata !4} -; CHECK: !4 = metadata !{metadata !4, metadata !2, metadata !"hello: %a"} -; CHECK: !5 = metadata !{metadata !4, metadata !1} +; CHECK: !0 = !{!1} +; CHECK: !1 = distinct !{!1, !2, !"hello: %c"} +; CHECK: !2 = distinct !{!2, !"hello"} +; CHECK: !3 = !{!4} +; CHECK: !4 = distinct !{!4, !2, !"hello: %a"} +; CHECK: !5 = !{!4, !1} diff --git a/test/Transforms/Inline/noalias-cs.ll b/test/Transforms/Inline/noalias-cs.ll index acd9021..da5ddd6 100644 --- a/test/Transforms/Inline/noalias-cs.ll +++ b/test/Transforms/Inline/noalias-cs.ll @@ -46,39 +46,39 @@ entry: attributes #0 = { nounwind uwtable } -!0 = metadata !{metadata !1} -!1 = metadata !{metadata !1, metadata !2, metadata !"hello: %a"} -!2 = metadata !{metadata !2, metadata !"hello"} -!3 = metadata !{metadata !4, metadata !6} -!4 = metadata !{metadata !4, metadata !5, metadata !"hello2: %a"} -!5 = metadata !{metadata !5, metadata !"hello2"} -!6 = metadata !{metadata !6, metadata !5, metadata !"hello2: %b"} -!7 = metadata !{metadata !4} -!8 = metadata !{metadata !6} +!0 = !{!1} +!1 = distinct !{!1, !2, !"hello: %a"} +!2 = distinct !{!2, !"hello"} +!3 = !{!4, !6} +!4 = distinct !{!4, !5, !"hello2: %a"} +!5 = distinct !{!5, !"hello2"} +!6 = distinct !{!6, !5, !"hello2: %b"} +!7 = !{!4} +!8 = !{!6} -; CHECK: !0 = metadata !{metadata !1, metadata !3} -; CHECK: !1 = metadata !{metadata !1, metadata !2, metadata !"hello2: %a"} -; CHECK: !2 = metadata !{metadata !2, metadata !"hello2"} -; CHECK: !3 = metadata !{metadata !3, metadata !2, metadata !"hello2: %b"} -; CHECK: !4 = metadata !{metadata !1} -; CHECK: !5 = metadata !{metadata !3} -; CHECK: !6 = metadata !{metadata !7, metadata !9, metadata !10} -; CHECK: !7 = metadata !{metadata !7, metadata !8, metadata !"hello2: %a"} -; CHECK: !8 = metadata !{metadata !8, metadata !"hello2"} -; CHECK: !9 = metadata !{metadata !9, metadata !8, metadata !"hello2: %b"} -; CHECK: !10 = metadata !{metadata !10, metadata !11, metadata !"hello: %a"} -; CHECK: !11 = metadata !{metadata !11, metadata !"hello"} -; CHECK: !12 = metadata !{metadata !7} -; CHECK: !13 = metadata !{metadata !9, metadata !10} -; CHECK: !14 = metadata !{metadata !9} -; CHECK: !15 = metadata !{metadata !7, metadata !10} -; CHECK: !16 = metadata !{metadata !10} -; CHECK: !17 = metadata !{metadata !18, metadata !20} -; CHECK: !18 = metadata !{metadata !18, metadata !19, metadata !"hello2: %a"} -; CHECK: !19 = metadata !{metadata !19, metadata !"hello2"} -; CHECK: !20 = metadata !{metadata !20, metadata !19, metadata !"hello2: %b"} -; CHECK: !21 = metadata !{metadata !18, metadata !10} -; CHECK: !22 = metadata !{metadata !20} -; CHECK: !23 = metadata !{metadata !20, metadata !10} -; CHECK: !24 = metadata !{metadata !18} +; CHECK: !0 = !{!1, !3} +; CHECK: !1 = distinct !{!1, !2, !"hello2: %a"} +; CHECK: !2 = distinct !{!2, !"hello2"} +; CHECK: !3 = distinct !{!3, !2, !"hello2: %b"} +; CHECK: !4 = !{!1} +; CHECK: !5 = !{!3} +; CHECK: !6 = !{!7, !9, !10} +; CHECK: !7 = distinct !{!7, !8, !"hello2: %a"} +; CHECK: !8 = distinct !{!8, !"hello2"} +; CHECK: !9 = distinct !{!9, !8, !"hello2: %b"} +; CHECK: !10 = distinct !{!10, !11, !"hello: %a"} +; CHECK: !11 = distinct !{!11, !"hello"} +; CHECK: !12 = !{!7} +; CHECK: !13 = !{!9, !10} +; CHECK: !14 = !{!9} +; CHECK: !15 = !{!7, !10} +; CHECK: !16 = !{!10} +; CHECK: !17 = !{!18, !20} +; CHECK: !18 = distinct !{!18, !19, !"hello2: %a"} +; CHECK: !19 = distinct !{!19, !"hello2"} +; CHECK: !20 = distinct !{!20, !19, !"hello2: %b"} +; CHECK: !21 = !{!18, !10} +; CHECK: !22 = !{!20} +; CHECK: !23 = !{!20, !10} +; CHECK: !24 = !{!18} diff --git a/test/Transforms/Inline/noalias.ll b/test/Transforms/Inline/noalias.ll index 7a54d5d..674da1e 100644 --- a/test/Transforms/Inline/noalias.ll +++ b/test/Transforms/Inline/noalias.ll @@ -64,13 +64,13 @@ entry: attributes #0 = { nounwind uwtable } -; CHECK: !0 = metadata !{metadata !1} -; CHECK: !1 = metadata !{metadata !1, metadata !2, metadata !"hello: %a"} -; CHECK: !2 = metadata !{metadata !2, metadata !"hello"} -; CHECK: !3 = metadata !{metadata !4, metadata !6} -; CHECK: !4 = metadata !{metadata !4, metadata !5, metadata !"hello2: %a"} -; CHECK: !5 = metadata !{metadata !5, metadata !"hello2"} -; CHECK: !6 = metadata !{metadata !6, metadata !5, metadata !"hello2: %b"} -; CHECK: !7 = metadata !{metadata !4} -; CHECK: !8 = metadata !{metadata !6} +; CHECK: !0 = !{!1} +; CHECK: !1 = distinct !{!1, !2, !"hello: %a"} +; CHECK: !2 = distinct !{!2, !"hello"} +; CHECK: !3 = !{!4, !6} +; CHECK: !4 = distinct !{!4, !5, !"hello2: %a"} +; CHECK: !5 = distinct !{!5, !"hello2"} +; CHECK: !6 = distinct !{!6, !5, !"hello2: %b"} +; CHECK: !7 = !{!4} +; CHECK: !8 = !{!6} diff --git a/test/Transforms/Inline/noalias2.ll b/test/Transforms/Inline/noalias2.ll index a4b38b0..9c8f8e2 100644 --- a/test/Transforms/Inline/noalias2.ll +++ b/test/Transforms/Inline/noalias2.ll @@ -71,27 +71,27 @@ entry: ; CHECK: ret void ; CHECK: } -; CHECK: !0 = metadata !{metadata !1} -; CHECK: !1 = metadata !{metadata !1, metadata !2, metadata !"hello: %c"} -; CHECK: !2 = metadata !{metadata !2, metadata !"hello"} -; CHECK: !3 = metadata !{metadata !4} -; CHECK: !4 = metadata !{metadata !4, metadata !2, metadata !"hello: %a"} -; CHECK: !5 = metadata !{metadata !6, metadata !8} -; CHECK: !6 = metadata !{metadata !6, metadata !7, metadata !"hello: %c"} -; CHECK: !7 = metadata !{metadata !7, metadata !"hello"} -; CHECK: !8 = metadata !{metadata !8, metadata !9, metadata !"foo: %c"} -; CHECK: !9 = metadata !{metadata !9, metadata !"foo"} -; CHECK: !10 = metadata !{metadata !11, metadata !12} -; CHECK: !11 = metadata !{metadata !11, metadata !7, metadata !"hello: %a"} -; CHECK: !12 = metadata !{metadata !12, metadata !9, metadata !"foo: %a"} -; CHECK: !13 = metadata !{metadata !8} -; CHECK: !14 = metadata !{metadata !12} -; CHECK: !15 = metadata !{metadata !16, metadata !18} -; CHECK: !16 = metadata !{metadata !16, metadata !17, metadata !"hello2: %a"} -; CHECK: !17 = metadata !{metadata !17, metadata !"hello2"} -; CHECK: !18 = metadata !{metadata !18, metadata !17, metadata !"hello2: %b"} -; CHECK: !19 = metadata !{metadata !16} -; CHECK: !20 = metadata !{metadata !18} +; CHECK: !0 = !{!1} +; CHECK: !1 = distinct !{!1, !2, !"hello: %c"} +; CHECK: !2 = distinct !{!2, !"hello"} +; CHECK: !3 = !{!4} +; CHECK: !4 = distinct !{!4, !2, !"hello: %a"} +; CHECK: !5 = !{!6, !8} +; CHECK: !6 = distinct !{!6, !7, !"hello: %c"} +; CHECK: !7 = distinct !{!7, !"hello"} +; CHECK: !8 = distinct !{!8, !9, !"foo: %c"} +; CHECK: !9 = distinct !{!9, !"foo"} +; CHECK: !10 = !{!11, !12} +; CHECK: !11 = distinct !{!11, !7, !"hello: %a"} +; CHECK: !12 = distinct !{!12, !9, !"foo: %a"} +; CHECK: !13 = !{!8} +; CHECK: !14 = !{!12} +; CHECK: !15 = !{!16, !18} +; CHECK: !16 = distinct !{!16, !17, !"hello2: %a"} +; CHECK: !17 = distinct !{!17, !"hello2"} +; CHECK: !18 = distinct !{!18, !17, !"hello2: %b"} +; CHECK: !19 = !{!16} +; CHECK: !20 = !{!18} attributes #0 = { nounwind uwtable } diff --git a/test/Transforms/Inline/optimization-remarks.ll b/test/Transforms/Inline/optimization-remarks.ll index 9108f3a..fb1b047 100644 --- a/test/Transforms/Inline/optimization-remarks.ll +++ b/test/Transforms/Inline/optimization-remarks.ll @@ -57,4 +57,4 @@ attributes #2 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !llvm.ident = !{!0} -!0 = metadata !{metadata !"clang version 3.5.0 "} +!0 = !{!"clang version 3.5.0 "} diff --git a/test/Transforms/Inline/pr21206.ll b/test/Transforms/Inline/pr21206.ll index 1a4366e..e460030 100644 --- a/test/Transforms/Inline/pr21206.ll +++ b/test/Transforms/Inline/pr21206.ll @@ -3,15 +3,15 @@ $c = comdat any ; CHECK: $c = comdat any -define linkonce_odr void @foo() comdat $c { +define linkonce_odr void @foo() comdat($c) { ret void } -; CHECK: define linkonce_odr void @foo() comdat $c +; CHECK: define linkonce_odr void @foo() comdat($c) -define linkonce_odr void @bar() comdat $c { +define linkonce_odr void @bar() comdat($c) { ret void } -; CHECK: define linkonce_odr void @bar() comdat $c +; CHECK: define linkonce_odr void @bar() comdat($c) define void()* @zed() { ret void()* @foo |