[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / musttail-thunk.ll
blob2e8e3a7b9c2586553747f0dd68310bed2e03bd2e
1 ; RUN: opt -instcombine -S < %s | FileCheck %s
2 ; RUN: opt -debugify-each -instcombine -S < %s | FileCheck %s
4 ; These are both direct calls, but make sure instcombine leaves the casts
5 ; alone.
7 define i32 @call_thunk(i32 %x, i32 %y) {
8   %r = call i32 bitcast (void (i32, ...)* @inc_first_arg_thunk to i32 (i32, i32)*)(i32 %x, i32 %y)
9   ret i32 %r
12 ; CHECK-LABEL: define i32 @call_thunk(i32 %x, i32 %y)
13 ; CHECK:   %r = call i32 bitcast (void (i32, ...)* @inc_first_arg_thunk to i32 (i32, i32)*)(i32 %x, i32 %y)
14 ; CHECK:   ret i32 %r
16 define internal void @inc_first_arg_thunk(i32 %arg1, ...) #0 {
17 entry:
18   %inc = add i32 %arg1, 1
19   musttail call void (i32, ...) bitcast (i32 (i32, i32)* @plus to void (i32, ...)*)(i32 %inc, ...)
20   ret void
23 ; CHECK-LABEL: define internal void @inc_first_arg_thunk(i32 %arg1, ...) #0
24 ; CHECK:   %inc = add i32 %arg1, 1
25 ; CHECK:   musttail call void (i32, ...) bitcast (i32 (i32, i32)* @plus to void (i32, ...)*)(i32 %inc, ...)
26 ; CHECK:   ret void
28 define internal i32 @plus(i32 %x, i32 %y) {
29   %r = add i32 %x, %y
30   ret i32 %r
33 attributes #0 = { "thunk" }