@@ -1971,6 +1971,36 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
1971
1971
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
1972
1972
; CHECK: vector.body:
1973
1973
; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
1974
+ ; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX1]]
1975
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[OFFSET_IDX]]
1976
+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i32 0
1977
+ ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i32 -3
1978
+ ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP2]], align 1
1979
+ ; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1980
+ ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[OFFSET_IDX]]
1981
+ ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[TMP3]], i32 0
1982
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[TMP4]], i32 -3
1983
+ ; CHECK-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP5]], align 1
1984
+ ; CHECK-NEXT: [[REVERSE3:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD2]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1985
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <4 x i8> [[REVERSE]], [[REVERSE3]]
1986
+ ; CHECK-NEXT: [[INDEX_NEXT4]] = add nuw i64 [[INDEX1]], 4
1987
+ ; CHECK-NEXT: [[TMP7:%.*]] = xor <4 x i1> [[TMP6]], splat (i1 true)
1988
+ ; CHECK-NEXT: [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
1989
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 1020
1990
+ ; CHECK-NEXT: [[TMP10:%.*]] = or i1 [[TMP8]], [[TMP9]]
1991
+ ; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP50:![0-9]+]]
1992
+ ; CHECK: middle.split:
1993
+ ; CHECK-NEXT: br i1 [[TMP8]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
1994
+ ; CHECK: middle.block:
1995
+ ; CHECK-NEXT: br i1 false, label [[LOOP_END:%.*]], label [[SCALAR_PH]]
1996
+ ; CHECK: vector.early.exit:
1997
+ ; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP7]], i1 true)
1998
+ ; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX1]], [[TMP11]]
1999
+ ; CHECK-NEXT: [[TMP13:%.*]] = sub i64 1023, [[TMP12]]
2000
+ ; CHECK-NEXT: br label [[LOOP_END]]
2001
+ ; CHECK: scalar.ph:
2002
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 3, [[MIDDLE_BLOCK]] ], [ 1023, [[ENTRY:%.*]] ]
2003
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1974
2004
; CHECK: loop:
1975
2005
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
1976
2006
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
@@ -1982,6 +2012,9 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
1982
2012
; CHECK: loop.inc:
1983
2013
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], -1
1984
2014
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDEX_NEXT]], 0
2015
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP_END]], label [[LOOP]], !llvm.loop [[LOOP51:![0-9]+]]
2016
+ ; CHECK: loop.end:
2017
+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 1024, [[LOOP_INC]] ], [ 1024, [[MIDDLE_BLOCK]] ], [ [[TMP13]], [[VECTOR_EARLY_EXIT]] ]
1985
2018
; CHECK-NEXT: ret i64 [[RETVAL]]
1986
2019
;
1987
2020
entry:
@@ -2082,6 +2115,31 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
2082
2115
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
2083
2116
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
2084
2117
; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
2118
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP52:![0-9]+]]
2119
+ ; CHECK: middle.split:
2120
+ ; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
2121
+ ; CHECK: middle.block:
2122
+ ; CHECK-NEXT: br i1 true, label [[LOOP_END:%.*]], label [[SCALAR_PH]]
2123
+ ; CHECK: vector.early.exit:
2124
+ ; CHECK-NEXT: [[TMP11:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP6]], i1 true)
2125
+ ; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[INDEX1]], [[TMP11]]
2126
+ ; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = add i64 3, [[TMP10]]
2127
+ ; CHECK-NEXT: br label [[LOOP_END]]
2128
+ ; CHECK: scalar.ph:
2129
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 67, [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
2130
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
2131
+ ; CHECK: loop:
2132
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
2133
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
2134
+ ; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
2135
+ ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
2136
+ ; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
2137
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
2138
+ ; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END]]
2139
+ ; CHECK: loop.inc:
2140
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
2141
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
2142
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP53:![0-9]+]]
2085
2143
; CHECK: loop.end:
2086
2144
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
2087
2145
; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -2112,6 +2170,7 @@ declare i32 @foo(i32) readonly
2112
2170
declare <vscale x 4 x i32 > @foo_vec (<vscale x 4 x i32 >)
2113
2171
2114
2172
attributes #0 = { "vector-function-abi-variant" ="_ZGVsNxv_foo(foo_vec)" }
2173
+
2115
2174
;.
2116
2175
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
2117
2176
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -2151,4 +2210,20 @@ attributes #0 = { "vector-function-abi-variant"="_ZGVsNxv_foo(foo_vec)" }
2151
2210
; CHECK: [[LOOP35]] = distinct !{[[LOOP35]], [[META2]], [[META1]]}
2152
2211
; CHECK: [[LOOP36]] = distinct !{[[LOOP36]], [[META1]], [[META2]]}
2153
2212
; CHECK: [[LOOP37]] = distinct !{[[LOOP37]], [[META2]], [[META1]]}
2154
-
2213
+ ; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[META1]], [[META2]]}
2214
+ ; CHECK: [[LOOP39]] = distinct !{[[LOOP39]], [[META2]], [[META1]]}
2215
+ ; CHECK: [[LOOP40]] = distinct !{[[LOOP40]], [[META1]], [[META2]]}
2216
+ ; CHECK: [[LOOP41]] = distinct !{[[LOOP41]], [[META2]], [[META1]]}
2217
+ ; CHECK: [[LOOP42]] = distinct !{[[LOOP42]], [[META1]], [[META2]]}
2218
+ ; CHECK: [[LOOP43]] = distinct !{[[LOOP43]], [[META2]], [[META1]]}
2219
+ ; CHECK: [[LOOP44]] = distinct !{[[LOOP44]], [[META1]], [[META2]]}
2220
+ ; CHECK: [[LOOP45]] = distinct !{[[LOOP45]], [[META2]], [[META1]]}
2221
+ ; CHECK: [[LOOP46]] = distinct !{[[LOOP46]], [[META1]], [[META2]]}
2222
+ ; CHECK: [[LOOP47]] = distinct !{[[LOOP47]], [[META2]], [[META1]]}
2223
+ ; CHECK: [[LOOP48]] = distinct !{[[LOOP48]], [[META1]], [[META2]]}
2224
+ ; CHECK: [[LOOP49]] = distinct !{[[LOOP49]], [[META2]], [[META1]]}
2225
+ ; CHECK: [[LOOP50]] = distinct !{[[LOOP50]], [[META1]], [[META2]]}
2226
+ ; CHECK: [[LOOP51]] = distinct !{[[LOOP51]], [[META2]], [[META1]]}
2227
+ ; CHECK: [[LOOP52]] = distinct !{[[LOOP52]], [[META1]], [[META2]]}
2228
+ ; CHECK: [[LOOP53]] = distinct !{[[LOOP53]], [[META2]], [[META1]]}
2229
+ ;.
0 commit comments