1
- ; RUN: opt -passes=loop-versioning -S < %s | FileCheck %s -check-prefix=LV
1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2
+ ; RUN: opt -passes=loop-versioning -S < %s | FileCheck %s
2
3
3
4
; NB: addrspaces 10-13 are non-integral
4
5
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
@@ -12,40 +13,113 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
12
13
13
14
declare i64 @julia_steprange_last_4949 ()
14
15
15
- define void @"japi1_align!_9477" (ptr %arg ) {
16
- ; LV-LAVEL: L26.lver.check
17
- ; LV: [[OFMul:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[Step:%[^ ]*]])
18
- ; LV-NEXT: [[OFMulResult:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 0
19
- ; LV-NEXT: [[OFMulOverflow:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 1
20
- ; LV: [[OFNegMulResult:%[^ ]*]] = sub i64 0, [[OFMulResult]]
21
- ; LV-NEXT: [[NegGEP:%[^ ]*]] = getelementptr i8, ptr addrspace(13) [[Base:%[^ ]*]], i64 [[OFNegMulResult]]
22
- ; LV-NEXT: icmp ugt ptr addrspace(13) [[NegGEP]], [[Base]]
23
- ; LV-NOT: inttoptr
24
- ; LV-NOT: ptrtoint
16
+ define void @wrapping_ptr_nonint_addrspace (ptr %arg ) {
17
+ ; CHECK-LABEL: define void @wrapping_ptr_nonint_addrspace(
18
+ ; CHECK-SAME: ptr [[ARG:%.*]]) {
19
+ ; CHECK-NEXT: [[LOOP_LVER_CHECK:.*:]]
20
+ ; CHECK-NEXT: [[LOAD0:%.*]] = load ptr addrspace(10), ptr [[ARG]], align 8
21
+ ; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr inttoptr (i64 12 to ptr), align 4
22
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[LOAD1]]
23
+ ; CHECK-NEXT: [[CALL:%.*]] = call i64 @julia_steprange_last_4949()
24
+ ; CHECK-NEXT: [[CAST0:%.*]] = addrspacecast ptr addrspace(10) [[LOAD0]] to ptr addrspace(11)
25
+ ; CHECK-NEXT: [[LOAD2:%.*]] = load ptr addrspace(10), ptr addrspace(11) [[CAST0]], align 8
26
+ ; CHECK-NEXT: [[CAST1:%.*]] = addrspacecast ptr addrspace(10) [[LOAD2]] to ptr addrspace(11)
27
+ ; CHECK-NEXT: [[LOAD3:%.*]] = load ptr addrspace(13), ptr addrspace(11) [[CAST1]], align 8
28
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[SUB]] to i64
29
+ ; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[CALL]], 2
30
+ ; CHECK-NEXT: [[TMP1:%.*]] = shl nsw i64 [[SEXT]], 2
31
+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0]], [[TMP1]]
32
+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], -4
33
+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP3]]
34
+ ; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP1]]
35
+ ; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], -4
36
+ ; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP4]]
37
+ ; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr addrspace(13) [[SCEVGEP]], [[LOAD3]]
38
+ ; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr addrspace(13) [[SCEVGEP2]], [[SCEVGEP1]]
39
+ ; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
40
+ ; CHECK-NEXT: [[TMP5:%.*]] = sub i64 0, [[CALL]]
41
+ ; CHECK-NEXT: [[TMP6:%.*]] = shl nsw i64 [[SEXT]], 2
42
+ ; CHECK-NEXT: [[TMP7:%.*]] = add nsw i64 [[TMP6]], -4
43
+ ; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP7]]
44
+ ; CHECK-NEXT: [[MUL:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[TMP5]])
45
+ ; CHECK-NEXT: [[MUL_RESULT:%.*]] = extractvalue { i64, i1 } [[MUL]], 0
46
+ ; CHECK-NEXT: [[MUL_OVERFLOW:%.*]] = extractvalue { i64, i1 } [[MUL]], 1
47
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub i64 0, [[MUL_RESULT]]
48
+ ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr addrspace(13) [[SCEVGEP3]], i64 [[TMP8]]
49
+ ; CHECK-NEXT: [[TMP10:%.*]] = icmp ugt ptr addrspace(13) [[TMP9]], [[SCEVGEP3]]
50
+ ; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP10]], [[MUL_OVERFLOW]]
51
+ ; CHECK-NEXT: [[SCEVGEP4:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 -4
52
+ ; CHECK-NEXT: [[MUL5:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[TMP5]])
53
+ ; CHECK-NEXT: [[MUL_RESULT6:%.*]] = extractvalue { i64, i1 } [[MUL5]], 0
54
+ ; CHECK-NEXT: [[MUL_OVERFLOW7:%.*]] = extractvalue { i64, i1 } [[MUL5]], 1
55
+ ; CHECK-NEXT: [[TMP12:%.*]] = sub i64 0, [[MUL_RESULT6]]
56
+ ; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr addrspace(13) [[SCEVGEP4]], i64 [[TMP12]]
57
+ ; CHECK-NEXT: [[TMP14:%.*]] = icmp ugt ptr addrspace(13) [[TMP13]], [[SCEVGEP4]]
58
+ ; CHECK-NEXT: [[TMP15:%.*]] = or i1 [[TMP14]], [[MUL_OVERFLOW7]]
59
+ ; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP11]], [[TMP15]]
60
+ ; CHECK-NEXT: [[LVER_SAFE:%.*]] = or i1 [[FOUND_CONFLICT]], [[TMP16]]
61
+ ; CHECK-NEXT: br i1 [[LVER_SAFE]], label %[[LOOP_PH_LVER_ORIG:.*]], label %[[LOOP_PH:.*]]
62
+ ; CHECK: [[LOOP_PH_LVER_ORIG]]:
63
+ ; CHECK-NEXT: br label %[[LOOP_LVER_ORIG:.*]]
64
+ ; CHECK: [[LOOP_LVER_ORIG]]:
65
+ ; CHECK-NEXT: [[VALUE_PHI3_LVER_ORIG:%.*]] = phi i64 [ 0, %[[LOOP_PH_LVER_ORIG]] ], [ [[ADD0_LVER_ORIG:%.*]], %[[LOOP_LVER_ORIG]] ]
66
+ ; CHECK-NEXT: [[ADD0_LVER_ORIG]] = add i64 [[VALUE_PHI3_LVER_ORIG]], -1
67
+ ; CHECK-NEXT: [[GEP0_LVER_ORIG:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD0_LVER_ORIG]]
68
+ ; CHECK-NEXT: [[LOAD4_LVER_ORIG:%.*]] = load i32, ptr addrspace(13) [[GEP0_LVER_ORIG]], align 4
69
+ ; CHECK-NEXT: [[ADD1_LVER_ORIG:%.*]] = add i64 [[ADD0_LVER_ORIG]], [[SEXT]]
70
+ ; CHECK-NEXT: [[GEP1_LVER_ORIG:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD1_LVER_ORIG]]
71
+ ; CHECK-NEXT: store i32 [[LOAD4_LVER_ORIG]], ptr addrspace(13) [[GEP1_LVER_ORIG]], align 4
72
+ ; CHECK-NEXT: [[CMP_LVER_ORIG:%.*]] = icmp eq i64 [[VALUE_PHI3_LVER_ORIG]], [[CALL]]
73
+ ; CHECK-NEXT: br i1 [[CMP_LVER_ORIG]], label %[[EXIT_LOOPEXIT:.*]], label %[[LOOP_LVER_ORIG]]
74
+ ; CHECK: [[LOOP_PH]]:
75
+ ; CHECK-NEXT: br label %[[LOOP:.*]]
76
+ ; CHECK: [[LOOP]]:
77
+ ; CHECK-NEXT: [[VALUE_PHI3:%.*]] = phi i64 [ 0, %[[LOOP_PH]] ], [ [[ADD0:%.*]], %[[LOOP]] ]
78
+ ; CHECK-NEXT: [[ADD0]] = add i64 [[VALUE_PHI3]], -1
79
+ ; CHECK-NEXT: [[GEP0:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD0]]
80
+ ; CHECK-NEXT: [[LOAD4:%.*]] = load i32, ptr addrspace(13) [[GEP0]], align 4, !alias.scope [[META0:![0-9]+]]
81
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[SEXT]]
82
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD1]]
83
+ ; CHECK-NEXT: store i32 [[LOAD4]], ptr addrspace(13) [[GEP1]], align 4, !alias.scope [[META3:![0-9]+]], !noalias [[META0]]
84
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[VALUE_PHI3]], [[CALL]]
85
+ ; CHECK-NEXT: br i1 [[CMP]], label %[[EXIT_LOOPEXIT8:.*]], label %[[LOOP]]
86
+ ; CHECK: [[EXIT_LOOPEXIT]]:
87
+ ; CHECK-NEXT: br label %[[EXIT:.*]]
88
+ ; CHECK: [[EXIT_LOOPEXIT8]]:
89
+ ; CHECK-NEXT: br label %[[EXIT]]
90
+ ; CHECK: [[EXIT]]:
91
+ ; CHECK-NEXT: ret void
92
+ ;
25
93
top:
26
- %tmp = load ptr addrspace (10 ), ptr %arg , align 8
27
- %tmp1 = load i32 , ptr inttoptr (i64 12 to ptr ), align 4
28
- %tmp2 = sub i32 0 , %tmp1
29
- %tmp3 = call i64 @julia_steprange_last_4949 ()
30
- %tmp4 = addrspacecast ptr addrspace (10 ) %tmp to ptr addrspace (11 )
31
- %tmp6 = load ptr addrspace (10 ), ptr addrspace (11 ) %tmp4 , align 8
32
- %tmp7 = addrspacecast ptr addrspace (10 ) %tmp6 to ptr addrspace (11 )
33
- %tmp9 = load ptr addrspace (13 ), ptr addrspace (11 ) %tmp7 , align 8
34
- %tmp10 = sext i32 %tmp2 to i64
35
- br label %L26
94
+ %load0 = load ptr addrspace (10 ), ptr %arg , align 8
95
+ %load1 = load i32 , ptr inttoptr (i64 12 to ptr ), align 4
96
+ %sub = sub i32 0 , %load1
97
+ %call = call i64 @julia_steprange_last_4949 ()
98
+ %cast0 = addrspacecast ptr addrspace (10 ) %load0 to ptr addrspace (11 )
99
+ %load2 = load ptr addrspace (10 ), ptr addrspace (11 ) %cast0 , align 8
100
+ %cast1 = addrspacecast ptr addrspace (10 ) %load2 to ptr addrspace (11 )
101
+ %load3 = load ptr addrspace (13 ), ptr addrspace (11 ) %cast1 , align 8
102
+ %sext = sext i32 %sub to i64
103
+ br label %loop
36
104
37
- L26 :
38
- %value_phi3 = phi i64 [ 0 , %top ], [ %tmp11 , %L26 ]
39
- %tmp11 = add i64 %value_phi3 , -1
40
- %tmp12 = getelementptr inbounds i32 , ptr addrspace (13 ) %tmp9 , i64 %tmp11
41
- %tmp13 = load i32 , ptr addrspace (13 ) %tmp12 , align 4
42
- %tmp14 = add i64 %tmp11 , %tmp10
43
- %tmp15 = getelementptr inbounds i32 , ptr addrspace (13 ) %tmp9 , i64 %tmp14
44
- store i32 %tmp13 , ptr addrspace (13 ) %tmp15 , align 4
45
- %tmp16 = icmp eq i64 %value_phi3 , %tmp3
46
- br i1 %tmp16 , label %L45 , label %L26
105
+ loop :
106
+ %value_phi3 = phi i64 [ 0 , %top ], [ %add0 , %loop ]
107
+ %add0 = add i64 %value_phi3 , -1
108
+ %gep0 = getelementptr inbounds i32 , ptr addrspace (13 ) %load3 , i64 %add0
109
+ %load4 = load i32 , ptr addrspace (13 ) %gep0 , align 4
110
+ %add1 = add i64 %add0 , %sext
111
+ %gep1 = getelementptr inbounds i32 , ptr addrspace (13 ) %load3 , i64 %add1
112
+ store i32 %load4 , ptr addrspace (13 ) %gep1 , align 4
113
+ %cmp = icmp eq i64 %value_phi3 , %call
114
+ br i1 %cmp , label %exit , label %loop
47
115
48
- L45 :
116
+ exit :
49
117
ret void
50
118
}
51
-
119
+ ;.
120
+ ; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
121
+ ; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]]}
122
+ ; CHECK: [[META2]] = distinct !{[[META2]], !"LVerDomain"}
123
+ ; CHECK: [[META3]] = !{[[META4:![0-9]+]]}
124
+ ; CHECK: [[META4]] = distinct !{[[META4]], [[META2]]}
125
+ ;.
0 commit comments