1
- ; NOTE: Assertions have been autogenerated by update_test_checks.py
1
+ ; NOTE: Assertions have been autogenerated by utils/ update_test_checks.py
2
2
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
3
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4
4
target triple = "x86_64-unknown-linux-gnu"
5
5
6
6
define i64 @ptrdiff1 (ptr %ptr ) {
7
7
; CHECK-LABEL: @ptrdiff1(
8
- ; CHECK: ret i64 42
8
+ ; CHECK-NEXT: ret i64 42
9
9
;
10
10
%last = getelementptr inbounds i8 , ptr %ptr , i32 42
11
11
%first.int = ptrtoint ptr %ptr to i64
@@ -14,9 +14,24 @@ define i64 @ptrdiff1(ptr %ptr) {
14
14
ret i64 %diff
15
15
}
16
16
17
+ define i64 @ptrdiff_no_inbounds (ptr %ptr ) {
18
+ ; CHECK-LABEL: @ptrdiff_no_inbounds(
19
+ ; CHECK-NEXT: [[LAST:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i32 42
20
+ ; CHECK-NEXT: [[FIRST_INT:%.*]] = ptrtoint ptr [[PTR]] to i64
21
+ ; CHECK-NEXT: [[LAST_INT:%.*]] = ptrtoint ptr [[LAST]] to i64
22
+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[LAST_INT]], [[FIRST_INT]]
23
+ ; CHECK-NEXT: ret i64 [[DIFF]]
24
+ ;
25
+ %last = getelementptr i8 , ptr %ptr , i32 42
26
+ %first.int = ptrtoint ptr %ptr to i64
27
+ %last.int = ptrtoint ptr %last to i64
28
+ %diff = sub i64 %last.int , %first.int
29
+ ret i64 %diff
30
+ }
31
+
17
32
define i64 @ptrdiff2 (ptr %ptr ) {
18
33
; CHECK-LABEL: @ptrdiff2(
19
- ; CHECK: ret i64 42
34
+ ; CHECK-NEXT: ret i64 42
20
35
;
21
36
%first2 = getelementptr inbounds i8 , ptr %ptr , i32 1
22
37
%first3 = getelementptr inbounds i8 , ptr %first2 , i32 2
@@ -34,10 +49,10 @@ define i64 @ptrdiff2(ptr %ptr) {
34
49
define i64 @ptrdiff3 (ptr %ptr ) {
35
50
; Don't bother with non-inbounds GEPs.
36
51
; CHECK-LABEL: @ptrdiff3(
37
- ; CHECK: [[LAST:%.*]] = getelementptr i8, ptr %ptr, i32 42
38
- ; CHECK-NEXT: [[FIRST_INT:%.*]] = ptrtoint ptr %ptr to i64
52
+ ; CHECK-NEXT: [[LAST1:%.*]] = getelementptr i8, ptr [[LAST:%.*]], i32 42
39
53
; CHECK-NEXT: [[LAST_INT:%.*]] = ptrtoint ptr [[LAST]] to i64
40
- ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[LAST_INT]], [[FIRST_INT]]
54
+ ; CHECK-NEXT: [[LAST_INT1:%.*]] = ptrtoint ptr [[LAST1]] to i64
55
+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[LAST_INT1]], [[LAST_INT]]
41
56
; CHECK-NEXT: ret i64 [[DIFF]]
42
57
;
43
58
%last = getelementptr i8 , ptr %ptr , i32 42
@@ -50,7 +65,7 @@ define i64 @ptrdiff3(ptr %ptr) {
50
65
define <4 x i32 > @ptrdiff4 (<4 x ptr > %arg ) nounwind {
51
66
; Handle simple cases of vectors of pointers.
52
67
; CHECK-LABEL: @ptrdiff4(
53
- ; CHECK: ret <4 x i32> zeroinitializer
68
+ ; CHECK-NEXT: ret <4 x i32> zeroinitializer
54
69
;
55
70
%p1 = ptrtoint <4 x ptr > %arg to <4 x i32 >
56
71
%bc = bitcast <4 x ptr > %arg to <4 x ptr >
@@ -65,7 +80,7 @@ define <4 x i32> @ptrdiff4(<4 x ptr> %arg) nounwind {
65
80
66
81
define i32 @ptrdiff5 () nounwind {
67
82
; CHECK-LABEL: @ptrdiff5(
68
- ; CHECK: bb:
83
+ ; CHECK-NEXT: bb:
69
84
; CHECK-NEXT: ret i32 0
70
85
;
71
86
bb:
0 commit comments