Tim Northover | a441585 | 2013-08-06 09:12:35 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=x86 -o - < %s | FileCheck %s |
| 2 | |
| 3 | ; This used to be classified as a tail call because of a mismatch in the |
| 4 | ; arguments seen by Analysis.cpp and ISelLowering. As seen by ISelLowering, they |
| 5 | ; both return {i32, i32, i32} (since i64 is illegal) which is fine for a tail |
| 6 | ; call. |
| 7 | |
| 8 | ; As seen by Analysis.cpp: i64 -> i32 is a valid trunc, second i32 passes |
| 9 | ; straight through and the third is undef, also OK for a tail call. |
| 10 | |
| 11 | ; Analysis.cpp was wrong. |
| 12 | |
| 13 | ; FIXME: in principle we *could* support some tail calls involving truncations |
| 14 | ; of illegal types: a single "trunc i64 %whatever to i32" is probably valid |
| 15 | ; because of how the extra registers are laid out. |
| 16 | |
| 17 | declare {i64, i32} @test() |
| 18 | |
| 19 | define {i32, i32, i32} @test_pair_notail(i64 %in) { |
| 20 | ; CHECK-LABEL: test_pair_notail |
| 21 | ; CHECK-NOT: jmp |
| 22 | |
| 23 | %whole = tail call {i64, i32} @test() |
| 24 | %first = extractvalue {i64, i32} %whole, 0 |
| 25 | %first.trunc = trunc i64 %first to i32 |
| 26 | |
| 27 | %second = extractvalue {i64, i32} %whole, 1 |
| 28 | |
| 29 | %tmp = insertvalue {i32, i32, i32} undef, i32 %first.trunc, 0 |
| 30 | %res = insertvalue {i32, i32, i32} %tmp, i32 %second, 1 |
| 31 | ret {i32, i32, i32} %res |
| 32 | } |