mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-25 05:25:53 +00:00
e4d0a5ec18
Summary: With this patch, range metadata can be added to call/invoke including IntrinsicInst. Previously, it could only be added to load. Rename computeKnownBitsLoad to computeKnownBitsFromRangeMetadata because range metadata is not only used by load. Update the language reference to reflect this change. Test Plan: Add several tests in range-2.ll to confirm the verifier is happy with having range metadata on call/invoke. Add two tests in AddOverFlow.ll to confirm annotating range metadata to call/invoke can benefit InstCombine. Reviewers: meheff, nlewycky, reames, hfinkel, eliben Reviewed By: eliben Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D4187 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211281 91177308-0d34-0410-b5e6-96231b3b80d8
67 lines
1.6 KiB
LLVM
67 lines
1.6 KiB
LLVM
; RUN: llvm-as < %s -o /dev/null
|
|
|
|
define i8 @f1(i8* %x) {
|
|
entry:
|
|
%y = load i8* %x, align 1, !range !0
|
|
ret i8 %y
|
|
}
|
|
!0 = metadata !{i8 0, i8 1}
|
|
|
|
define i8 @f2(i8* %x) {
|
|
entry:
|
|
%y = load i8* %x, align 1, !range !1
|
|
ret i8 %y
|
|
}
|
|
!1 = metadata !{i8 255, i8 1}
|
|
|
|
define i8 @f3(i8* %x) {
|
|
entry:
|
|
%y = load i8* %x, align 1, !range !2
|
|
ret i8 %y
|
|
}
|
|
!2 = metadata !{i8 1, i8 3, i8 5, i8 42}
|
|
|
|
define i8 @f4(i8* %x) {
|
|
entry:
|
|
%y = load i8* %x, align 1, !range !3
|
|
ret i8 %y
|
|
}
|
|
!3 = metadata !{i8 -1, i8 0, i8 1, i8 2}
|
|
|
|
define i8 @f5(i8* %x) {
|
|
entry:
|
|
%y = load i8* %x, align 1, !range !4
|
|
ret i8 %y
|
|
}
|
|
!4 = metadata !{i8 -1, i8 0, i8 1, i8 -2}
|
|
|
|
; We can annotate the range of the return value of a CALL.
|
|
define void @call_all(i8* %x) {
|
|
entry:
|
|
%v1 = call i8 @f1(i8* %x), !range !0
|
|
%v2 = call i8 @f2(i8* %x), !range !1
|
|
%v3 = call i8 @f3(i8* %x), !range !2
|
|
%v4 = call i8 @f4(i8* %x), !range !3
|
|
%v5 = call i8 @f5(i8* %x), !range !4
|
|
ret void
|
|
}
|
|
|
|
; We can annotate the range of the return value of an INVOKE.
|
|
define void @invoke_all(i8* %x) {
|
|
entry:
|
|
%v1 = invoke i8 @f1(i8* %x) to label %cont unwind label %lpad, !range !0
|
|
%v2 = invoke i8 @f2(i8* %x) to label %cont unwind label %lpad, !range !1
|
|
%v3 = invoke i8 @f3(i8* %x) to label %cont unwind label %lpad, !range !2
|
|
%v4 = invoke i8 @f4(i8* %x) to label %cont unwind label %lpad, !range !3
|
|
%v5 = invoke i8 @f5(i8* %x) to label %cont unwind label %lpad, !range !4
|
|
|
|
cont:
|
|
ret void
|
|
|
|
lpad:
|
|
%4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
|
filter [0 x i8*] zeroinitializer
|
|
ret void
|
|
}
|
|
declare i32 @__gxx_personality_v0(...)
|