; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=opcodes --test FileCheck --test-arg --check-prefix=ALL --test-arg %s --test-arg --input-file %s -o %t ; RUN: FileCheck -check-prefixes=RESULT,ALL %s < %t target datalayout = "A5" declare token @llvm.return.token() declare void @llvm.uses.token(token) ; ALL-LABEL: @call_token( ; RESULT-NEXT: %token = call token @llvm.return.token() ; RESULT-NEXT: call void @llvm.uses.token(token %token) ; RESULT-NEXT: ret void define void @call_token() { %token = call token @llvm.return.token() call void @llvm.uses.token(token %token) ret void } ; ALL-LABEL: @call_void_0_size_arg( ; RESULT-NEXT: store volatile {} %arg, ptr addrspace(5) null, align 1 ; RESULT-NEXT: ret void define void @call_void_0_size_arg({} %arg) { call void @void_0_size_arg({} %arg) ret void } ; ALL-LABEL: @call_return_0_size( ; RESULT-NEXT: %op = load volatile {}, ptr %ptr, align 1 ; RESULT-NEXT: ret {} %op define {} @call_return_0_size(ptr %ptr) { %op = call {} @return_0_size(ptr %ptr) ret {} %op } ; ALL-LABEL: define void @call_void_no_args( ; RESULT-NEXT: store volatile i32 0, ptr addrspace(5) null, align 4 ; RESULT-NEXT: ret void define void @call_void_no_args() { call void @void_no_args() ret void } ; ALL-LABEL: @call_store_like_i16( ; RESULT-NEXT: store volatile i16 %val, ptr addrspace(1) %ptr, align 2 ; RESULT-NEXT: ret void define void @call_store_like_i16(i16 %val, ptr addrspace(1) %ptr) { call void @store_like_i16(i16 %val, ptr addrspace(1) %ptr) ret void } ; ALL-LABEL: @keep_call_store_like_i16( ; ALL-NEXT: call void @store_like_i16(i16 %val, ptr addrspace(1) %ptr) ; ALL-NEXT: ret void define void @keep_call_store_like_i16(i16 %val, ptr addrspace(1) %ptr) { call void @store_like_i16(i16 %val, ptr addrspace(1) %ptr) ret void } ; ALL-LABEL: @call_store_like_i16_swap( ; RESULT-NEXT: store volatile i16 %val, ptr addrspace(1) %ptr ; RESULT-NEXT: ret void define void @call_store_like_i16_swap(ptr addrspace(1) %ptr, i16 %val) { call void @store_like_i16_swap(ptr addrspace(1) %ptr, i16 %val) ret void } ; ALL-LABEL: @call_store_like_i16_extra_arg( ; RESULT-NEXT: call void @store_like_i16_extra_arg(i16 %val, ptr addrspace(1) %ptr, i32 %extra) ; RESULT-NEXT: ret void define void @call_store_like_i16_extra_arg(i16 %val, ptr addrspace(1) %ptr, i32 %extra) { call void @store_like_i16_extra_arg(i16 %val, ptr addrspace(1) %ptr, i32 %extra) ret void } ; ALL-LABEL: @call_store_like_i16_extra_ptr_arg( ; RESULT-NEXT: call void @store_like_i16_extra_ptr_arg(i16 %val, ptr addrspace(1) %ptr, ptr addrspace(1) %extra) ; RESULT-NEXT: ret void define void @call_store_like_i16_extra_ptr_arg(i16 %val, ptr addrspace(1) %ptr, ptr addrspace(1) %extra) { call void @store_like_i16_extra_ptr_arg(i16 %val, ptr addrspace(1) %ptr, ptr addrspace(1) %extra) ret void } ; ALL-LABEL: @call_store_like_ptr_store( ; RESULT-NEXT: store volatile ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val, align 8 ; RESULT-NEXT: ret void define void @call_store_like_ptr_store(ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr) { call void @store_like_ptr_store(ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr) ret void } ; ALL-LABEL: @call_store_like_ptr_store_swap( ; RESULT-NEXT: store volatile ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr, align 8 ; RESULT-NEXT: ret void define void @call_store_like_ptr_store_swap(ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val) { call void @store_like_ptr_store_swap(ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val) ret void } ; ALL-LABEL: @call_store_like_ptr_store_different_element_type( ; RESULT-NEXT: store volatile ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val, align 8 ; RESULT-NEXT: ret void define void @call_store_like_ptr_store_different_element_type(ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr) { call void @store_like_ptr_store_different_element_type(ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr) ret void } ; ALL-LABEL: @call_store_like_ptr_store_different_element_type_swap( ; RESULT-NEXT: store volatile ptr addrspace(3) %ptr.val, ptr addrspace(1) %ptr, align 8 ; RESULT-NEXT: ret void define void @call_store_like_ptr_store_different_element_type_swap(ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val) { call void @store_like_ptr_store_different_element_type_swap(ptr addrspace(1) %ptr, ptr addrspace(3) %ptr.val) ret void } ; ALL-LABEL: @call_load_like_i32( ; RESULT-NEXT: %op = load volatile i32, ptr addrspace(1) %ptr, align 4 ; RESULT-NEXT: ret i32 %op define i32 @call_load_like_i32(ptr addrspace(1) %ptr) { %op = call i32 @load_like_i32(ptr addrspace(1) %ptr) ret i32 %op } ; ALL-LABEL: @keep_call_load_like_i32( ; ALL-NEXT: %op = call i32 @load_like_i32(ptr addrspace(1) %ptr) ; ALL-NEXT: ret i32 %op define i32 @keep_call_load_like_i32(ptr addrspace(1) %ptr) { %op = call i32 @load_like_i32(ptr addrspace(1) %ptr) ret i32 %op } ; ALL-LABEL: @call_load_like_i32_extra_arg( ; RESULT-NEXT: %op = call i32 @load_like_i32_extra_arg(ptr addrspace(1) %ptr, i32 %extra) ; RESULT-NEXT: ret i32 %op define i32 @call_load_like_i32_extra_arg(ptr addrspace(1) %ptr, i32 %extra) { %op = call i32 @load_like_i32_extra_arg(ptr addrspace(1) %ptr, i32 %extra) ret i32 %op } ; ALL-LABEL: @call_load_like_ptr_mismatch( ; RESULT-NEXT: %op = load volatile i32, ptr addrspace(1) %ptr, align 4 ; RESULT-NEXT: ret i32 %op define i32 @call_load_like_ptr_mismatch(ptr addrspace(1) %ptr) { %op = call i32 @load_like_ptr_mismatch(ptr addrspace(1) %ptr) ret i32 %op } ; ALL-LABEL: @call_load_like_skip_arg( ; RESULT-NEXT: %op = load volatile i32, ptr addrspace(1) %ptr, align 4 ; RESULT-NEXT: ret i32 %op define i32 @call_load_like_skip_arg(float, ptr addrspace(1) %ptr) { %op = call i32 @load_like_skip_arg(float poison, ptr addrspace(1) %ptr) ret i32 %op } ; ALL-LABEL: @call_fp_scalar_noargs( ; RESULT-NEXT: %op = load volatile float, ptr addrspace(5) null, align 4 ; RESULT-NEXT: ret float %op define float @call_fp_scalar_noargs() { %op = call nsz float @fp_scalar_noargs() ret float %op } ; ALL-LABEL: @call_fp_vector_noargs( ; RESULT-NEXT: %op = load volatile <2 x half>, ptr addrspace(5) null, align 4 ; RESULT-NEXT: ret <2 x half> %op define <2 x half> @call_fp_vector_noargs() { %op = call nsz <2 x half> @fp_vector_noargs() ret <2 x half> %op } ; ALL-LABEL: @call_unary_fp_scalar( ; RESULT-NEXT: %op = fneg nsz float %a ; RESULT-NEXT: ret float %op define float @call_unary_fp_scalar(float %a) { %op = call nsz float @unary_fp_scalar(float %a) ret float %op } ; ALL-LABEL: @call_unary_fp_vector( ; RESULT-NEXT: %op = fneg nsz <2 x half> %a ; RESULT-NEXT: ret <2 x half> %op define <2 x half> @call_unary_fp_vector(<2 x half> %a) { %op = call nsz <2 x half> @unary_fp_vector(<2 x half> %a) ret <2 x half> %op } ; ALL-LABEL: @ignore_undef_args_unary_fp( ; RESULT-NEXT: %op = fneg nnan float %a ; RESULT-NEXT: ret float %op define float @ignore_undef_args_unary_fp(float %a) { %op = call nnan float @func_i32_f32_i32(i32 poison, float %a, i32 poison) ret float %op } ; ALL-LABEL: @call_binary_fp_scalar( ; RESULT: %op = fmul afn float %a, %b ; RESULT-NEXT: ret float %op define float @call_binary_fp_scalar(float %a, float %b) { %op = call afn float @binary_fp_scalar(float %a, float %b) ret float %op } ; ALL-LABEL: @call_binary_fp_vector( ; RESULT-NEXT: %op = fmul afn <2 x half> %a, %b ; RESULT-NEXT: ret <2 x half> %op define <2 x half> @call_binary_fp_vector(<2 x half> %a, <2 x half> %b) { %op = call afn <2 x half> @binary_fp_vector(<2 x half> %a, <2 x half> %b) ret <2 x half> %op } ; ALL-LABEL: @call_ternary_fp_scalar( ; RESULT-NEXT: %op = call afn float @llvm.fma.f32(float %a, float %b, float %c) ; RESULT-NEXT: ret float %op define float @call_ternary_fp_scalar(float %a, float %b, float %c) { %op = call afn float @ternary_fp_scalar(float %a, float %b, float %c) ret float %op } ; ALL-LABEL: @call_ternary_fp_vector( ; RESULT-NEXT: %op = call afn <2 x half> @llvm.fma.v2f16(<2 x half> %a, <2 x half> %b, <2 x half> %c) ; RESULT-NEXT: ret <2 x half> %op define <2 x half> @call_ternary_fp_vector(<2 x half> %a, <2 x half> %b, <2 x half> %c) { %op = call afn <2 x half> @ternary_fp_vector(<2 x half> %a, <2 x half> %b, <2 x half> %c) ret <2 x half> %op } ; ALL-LABEL: @call_unary_int_scalar( ; RESULT-NEXT: %op = call i32 @llvm.bswap.i32(i32 %a) ; RESULT-NEXT: ret i32 %op define i32 @call_unary_int_scalar(i32 %a) { %op = call i32 @unary_int_scalar(i32 %a) ret i32 %op } ; ALL-LABEL: @call_unary_int_vector( ; RESULT-NEXT: %op = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> %a) ; RESULT-NEXT: ret <2 x i16> %op define <2 x i16> @call_unary_int_vector(<2 x i16> %a) { %op = call <2 x i16> @unary_int_vector(<2 x i16> %a) ret <2 x i16> %op } ; ALL-LABEL: @call_binary_int_scalar( ; RESULT-NEXT: %op = and i32 %a, %b ; RESULT-NEXT: ret i32 %op define i32 @call_binary_int_scalar(i32 %a, i32 %b) { %op = call i32 @binary_int_scalar(i32 %a, i32 %b) ret i32 %op } ; ALL-LABEL: @call_binary_int_vector( ; RESULT-NEXT: %op = and <2 x i16> %a, %b ; RESULT-NEXT: ret <2 x i16> %op define <2 x i16> @call_binary_int_vector(<2 x i16> %a, <2 x i16> %b) { %op = call <2 x i16> @binary_int_vector(<2 x i16> %a, <2 x i16> %b) ret <2 x i16> %op } ; ALL-LABEL: @call_ternary_int_scalar( ; RESULT-NEXT: %op = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c) ; RESULT-NEXT: ret i32 %op define i32 @call_ternary_int_scalar(i32 %a, i32 %b, i32 %c) { %op = call i32 @ternary_int_scalar(i32 %a, i32 %b, i32 %c) ret i32 %op } ; ALL-LABEL: @call_ternary_int_vector( ; RESULT-NEXT: %op = call <2 x i16> @llvm.fshl.v2i16(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c) ; RESULT-NEXT: ret <2 x i16> %op define <2 x i16> @call_ternary_int_vector(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c) { %op = call <2 x i16> @ternary_int_vector(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c) ret <2 x i16> %op } ; ALL-LABEL: @call_quaternary_int_scalar( ; RESULT-NEXT: %op = call i32 @quaternary_int_scalar(i32 %a, i32 %b, i32 %c, i32 %d) ; RESULT-NEXT: ret i32 %op define i32 @call_quaternary_int_scalar(i32 %a, i32 %b, i32 %c, i32 %d) { %op = call i32 @quaternary_int_scalar(i32 %a, i32 %b, i32 %c, i32 %d) ret i32 %op } ; ALL-LABEL: @call_quaternary_int_vector( ; RESULT-NEXT: %op = call <2 x i16> @quaternary_int_vector(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c, <2 x i16> %d) ; RESULT-NEXT: ret <2 x i16> %op define <2 x i16> @call_quaternary_int_vector(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c, <2 x i16> %d) { %op = call <2 x i16> @quaternary_int_vector(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c, <2 x i16> %d) ret <2 x i16> %op } declare void @void_0_size_arg({}) declare {} @return_0_size(ptr) declare void @void_no_args() declare void @store_like_i16(i16, ptr addrspace(1)) declare void @store_like_i16_swap(ptr addrspace(1), i16) declare void @store_like_i16_extra_arg(i16, ptr addrspace(1), i32) declare void @store_like_i16_extra_ptr_arg(i16, ptr addrspace(1), ptr addrspace(1)) declare void @store_like_ptr_store(ptr addrspace(3), ptr addrspace(1)) declare void @store_like_ptr_store_swap(ptr addrspace(1), ptr addrspace(3)) declare void @store_like_ptr_store_different_element_type(ptr addrspace(3), ptr addrspace(1)) declare void @store_like_ptr_store_different_element_type_swap(ptr addrspace(1), ptr addrspace(3)) declare i32 @load_like_i32(ptr addrspace(1)) declare i32 @load_like_i32_extra_arg(ptr addrspace(1), i32) declare i32 @load_like_ptr_mismatch(ptr addrspace(1)) declare i32 @load_like_skip_arg(float, ptr addrspace(1)) declare float @fp_scalar_noargs() declare i32 @int_scalar_noargs() declare <2 x half> @fp_vector_noargs() declare <2 x i16> @int_vector_noargs() declare float @unary_fp_scalar(float) declare <2 x half> @unary_fp_vector(<2 x half>) declare float @func_i32_f32_i32(i32, float, i32) declare float @binary_fp_scalar(float, float) declare <2 x half> @binary_fp_vector(<2 x half>, <2 x half>) declare float @ternary_fp_scalar(float, float, float) declare <2 x half> @ternary_fp_vector(<2 x half>, <2 x half>, <2 x half>) declare float @quaternary_fp_scalar(float, float, float, float) declare <2 x half> @quaternary_fp_vector(<2 x half>, <2 x half>, <2 x half>, <2 x half>) declare i32 @unary_int_scalar(i32) declare <2 x i16> @unary_int_vector(<2 x i16>) declare i32 @binary_int_scalar(i32, i32) declare <2 x i16> @binary_int_vector(<2 x i16>, <2 x i16>) declare i32 @ternary_int_scalar(i32, i32, i32) declare <2 x i16> @ternary_int_vector(<2 x i16>, <2 x i16>, <2 x i16>) declare i32 @quaternary_int_scalar(i32, i32, i32, i32) declare <2 x i16> @quaternary_int_vector(<2 x i16>, <2 x i16>, <2 x i16>, <2 x i16>)