The logic for handling this was fixed in 8d7f118ab2b9e51d6cf2811291e319b4d977eb8c, but the check for byval on the callee was retained. This resulted in a weird situation where the transform would work depending on whether the byval was only on the call or on both the call and the function.
43 lines
1.3 KiB
LLVM
43 lines
1.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -passes=instcombine %s | FileCheck %s
|
|
|
|
declare void @add_byval_callee(double*)
|
|
|
|
declare void @add_byval_callee_2(double* byval(double))
|
|
|
|
define void @add_byval(i64* %in) {
|
|
; CHECK-LABEL: @add_byval(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i64* [[IN:%.*]] to double*
|
|
; CHECK-NEXT: call void @add_byval_callee(double* byval(double) [[TMP1]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%tmp = bitcast void (double*)* @add_byval_callee to void (i64*)*
|
|
call void %tmp(i64* byval(i64) %in)
|
|
ret void
|
|
}
|
|
|
|
define void @add_byval_2(i64* %in) {
|
|
; CHECK-LABEL: @add_byval_2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i64* [[IN:%.*]] to double*
|
|
; CHECK-NEXT: call void @add_byval_callee_2(double* byval(double) [[TMP1]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%tmp = bitcast void (double*)* @add_byval_callee_2 to void (i64*)*
|
|
call void %tmp(i64* byval(i64) %in)
|
|
ret void
|
|
}
|
|
|
|
%t2 = type { i8 }
|
|
|
|
define void @vararg_byval(i8* %p) {
|
|
; CHECK-LABEL: @vararg_byval(
|
|
; CHECK-NEXT: call void (i8, ...) @vararg_callee(i8 undef, i8* byval(i8) [[P:%.*]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%tmp = bitcast i8* %p to %t2*
|
|
call void (i8, ...) @vararg_callee(i8 undef, %t2* byval(%t2) %tmp)
|
|
ret void
|
|
}
|
|
|
|
declare void @vararg_callee(i8, ...)
|