[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / call-returned.ll
blobbf442b0e96790d7ce1a95f9ce67295d7606fa068
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -instcombine < %s | FileCheck %s
4 declare i32 @passthru_i32(i32 returned)
5 declare i8* @passthru_p8(i8* returned)
6 declare i8* @passthru_p8_from_p32(i32* returned)
7 declare <8 x i8> @passthru_8i8v_from_2i32v(<2 x i32> returned)
9 define i32 @returned_const_int_arg() {
10 ; CHECK-LABEL: @returned_const_int_arg(
11 ; CHECK-NEXT:    [[X:%.*]] = call i32 @passthru_i32(i32 42)
12 ; CHECK-NEXT:    ret i32 42
14   %x = call i32 @passthru_i32(i32 42)
15   ret i32 %x
18 define i8* @returned_const_ptr_arg() {
19 ; CHECK-LABEL: @returned_const_ptr_arg(
20 ; CHECK-NEXT:    [[X:%.*]] = call i8* @passthru_p8(i8* null)
21 ; CHECK-NEXT:    ret i8* null
23   %x = call i8* @passthru_p8(i8* null)
24   ret i8* %x
27 define i8* @returned_const_ptr_arg_casted() {
28 ; CHECK-LABEL: @returned_const_ptr_arg_casted(
29 ; CHECK-NEXT:    [[X:%.*]] = call i8* @passthru_p8_from_p32(i32* null)
30 ; CHECK-NEXT:    ret i8* null
32   %x = call i8* @passthru_p8_from_p32(i32* null)
33   ret i8* %x
36 define i8* @returned_ptr_arg_casted(i32* %a) {
37 ; CHECK-LABEL: @returned_ptr_arg_casted(
38 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A:%.*]] to i8*
39 ; CHECK-NEXT:    [[X:%.*]] = call i8* @passthru_p8_from_p32(i32* [[A]])
40 ; CHECK-NEXT:    ret i8* [[TMP1]]
42   %x = call i8* @passthru_p8_from_p32(i32* %a)
43   ret i8* %x
46 @GV = constant <2 x i32> zeroinitializer
47 define <8 x i8> @returned_const_vec_arg_casted() {
48 ; CHECK-LABEL: @returned_const_vec_arg_casted(
49 ; CHECK-NEXT:    [[X:%.*]] = call <8 x i8> @passthru_8i8v_from_2i32v(<2 x i32> zeroinitializer)
50 ; CHECK-NEXT:    ret <8 x i8> zeroinitializer
52   %v = load <2 x i32>, <2 x i32>* @GV
53   %x = call <8 x i8> @passthru_8i8v_from_2i32v(<2 x i32> %v)
54   ret <8 x i8> %x
57 define <8 x i8> @returned_vec_arg_casted(<2 x i32> %a) {
58 ; CHECK-LABEL: @returned_vec_arg_casted(
59 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i32> [[A:%.*]] to <8 x i8>
60 ; CHECK-NEXT:    [[X:%.*]] = call <8 x i8> @passthru_8i8v_from_2i32v(<2 x i32> [[A]])
61 ; CHECK-NEXT:    ret <8 x i8> [[TMP1]]
63   %x = call <8 x i8> @passthru_8i8v_from_2i32v(<2 x i32> %a)
64   ret <8 x i8> %x
67 define i32 @returned_var_arg(i32 %arg) {
68 ; CHECK-LABEL: @returned_var_arg(
69 ; CHECK-NEXT:    [[X:%.*]] = call i32 @passthru_i32(i32 [[ARG:%.*]])
70 ; CHECK-NEXT:    ret i32 [[ARG]]
72   %x = call i32 @passthru_i32(i32 %arg)
73   ret i32 %x
76 define i32 @returned_const_int_arg_musttail(i32 %arg) {
77 ; CHECK-LABEL: @returned_const_int_arg_musttail(
78 ; CHECK-NEXT:    [[X:%.*]] = musttail call i32 @passthru_i32(i32 42)
79 ; CHECK-NEXT:    ret i32 [[X]]
81   %x = musttail call i32 @passthru_i32(i32 42)
82   ret i32 %x
85 define i32 @returned_var_arg_musttail(i32 %arg) {
86 ; CHECK-LABEL: @returned_var_arg_musttail(
87 ; CHECK-NEXT:    [[X:%.*]] = musttail call i32 @passthru_i32(i32 [[ARG:%.*]])
88 ; CHECK-NEXT:    ret i32 [[X]]
90   %x = musttail call i32 @passthru_i32(i32 %arg)
91   ret i32 %x