|
| 1 | +/* { dg-lto-do link } */ |
| 2 | +/* { dg-lto-options { { -flto -O2 -fdump-tree-optimized -save-temps } } } */ |
| 3 | + |
| 4 | +/* Test that intrinsics optimized away don't cause crashes during LTO. |
| 5 | + This test registers multiple intrinsics but only uses some of them, |
| 6 | + allowing the optimizer to remove the unused ones. */ |
| 7 | + |
| 8 | +int func_apex_used1 (int, int); |
| 9 | +#pragma intrinsic (func_apex_used1, "insn_apex_used1", 1, "XC") |
| 10 | + |
| 11 | +int func_apex_unused (int, int); |
| 12 | +#pragma intrinsic (func_apex_unused, "insn_apex_unused", 2, "XS") |
| 13 | + |
| 14 | +int func_apex_used2 (int, int); |
| 15 | +#pragma intrinsic (func_apex_used2, "insn_apex_used2", 3, "XC") |
| 16 | + |
| 17 | +extern int bar (int); |
| 18 | + |
| 19 | +static int |
| 20 | +func_apex_unused_helper (int a, int b) |
| 21 | +{ |
| 22 | + return func_apex_unused (a, b); |
| 23 | +} |
| 24 | + |
| 25 | +int |
| 26 | +main (void) |
| 27 | +{ |
| 28 | + /* Only use func_apex_used1 and func_apex_used2. |
| 29 | + func_apex_unused should be optimized away. */ |
| 30 | + int x = func_apex_used1 (5, 10); |
| 31 | + int y = func_apex_used2 (x, 15); |
| 32 | + return bar (y); |
| 33 | +} |
| 34 | + |
| 35 | +/* Verify that only the used intrinsics appear in the optimized output. */ |
| 36 | +/* { dg-final { scan-ltrans-tree-dump "func_apex_used1" "optimized" } } */ |
| 37 | +/* { dg-final { scan-ltrans-tree-dump "func_apex_used2" "optimized" } } */ |
| 38 | +/* { dg-final { scan-ltrans-tree-dump "func_apex_from_other" "optimized" } } */ |
| 39 | + |
| 40 | +/* Verify that the unused intrinsic is NOT in the optimized output. */ |
| 41 | +/* { dg-final { scan-ltrans-tree-dump-not "func_apex_unused" "optimized" } } */ |
| 42 | +/* { dg-final { scan-ltrans-tree-dump-not "func_apex_also_unused" "optimized" } } */ |
| 43 | + |
| 44 | +/* Verify that only used intrinsics have .extInstruction directives. */ |
| 45 | +/* { dg-final { scan-ltrans-assembler "\\.extInstruction insn_apex_used1,1,XC" } } */ |
| 46 | +/* { dg-final { scan-ltrans-assembler "\\.extInstruction insn_apex_used2,3,XC" } } */ |
| 47 | +/* { dg-final { scan-ltrans-assembler "\\.extInstruction insn_apex_from_other,4,XS" } } */ |
| 48 | + |
| 49 | +/* Verify the actual instruction usage in assembly. */ |
| 50 | +/* { dg-final { scan-ltrans-assembler-times "insn_apex_used1\\s+a\[0-9\]+,a\[0-9\]+,10" 1 } } */ |
| 51 | +/* { dg-final { scan-ltrans-assembler-times "insn_apex_used2\\s+a\[0-9\]+,a\[0-9\]+,15" 1 } } */ |
| 52 | +/* { dg-final { scan-ltrans-assembler-times "insn_apex_from_other\\s+a\[0-9\]+,a\[0-9\]+,20" 1 } } */ |
0 commit comments