mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-02 00:42:52 +01:00
c1d9f9604b
is bitcast to return a floating point value. The result of the instruction may not be used by the program afterwards, and LLVM will happily remove all instructions except the call. But, on some platforms, if a value is returned as a floating point, it may need to be removed from the stack (like x87). Thus, we can't get rid of the bitcast even if there isn't a use of the value. llvm-svn: 51134
28 lines
1.3 KiB
LLVM
28 lines
1.3 KiB
LLVM
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \
|
|
; RUN: grep {call float bitcast} | count 1
|
|
%struct.NSObject = type { %struct.objc_class* }
|
|
%struct.NSArray = type { %struct.NSObject }
|
|
%struct.objc_class = type opaque
|
|
%struct.objc_selector = type opaque
|
|
|
|
@"\01L_OBJC_METH_VAR_NAME_112" = internal global [15 x i8] c"whiteComponent\00", section "__TEXT,__cstring,cstring_literals"
|
|
@"\01L_OBJC_SELECTOR_REFERENCES_81" = internal global %struct.objc_selector* bitcast ([15 x i8]* @"\01L_OBJC_METH_VAR_NAME_112" to %struct.objc_selector*), section "__OBJC,__message_refs,literal_pointers,no_dead_strip"
|
|
|
|
define void @bork() nounwind {
|
|
entry:
|
|
%color = alloca %struct.NSArray*
|
|
%color.466 = alloca %struct.NSObject*
|
|
%tmp103 = load %struct.NSArray** %color, align 4
|
|
%tmp103104 = getelementptr %struct.NSArray* %tmp103, i32 0, i32 0
|
|
store %struct.NSObject* %tmp103104, %struct.NSObject** %color.466, align 4
|
|
%tmp105 = load %struct.objc_selector** @"\01L_OBJC_SELECTOR_REFERENCES_81", align 4
|
|
%tmp106 = load %struct.NSObject** %color.466, align 4
|
|
%tmp107 = call float bitcast (void (%struct.NSObject*, ...)* @objc_msgSend_fpret to float (%struct.NSObject*, %struct.objc_selector*)*)( %struct.NSObject* %tmp106, %struct.objc_selector* %tmp105 ) nounwind
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
declare void @objc_msgSend_fpret(%struct.NSObject*, ...)
|