@@ -104,38 +104,25 @@ exit:
104
104
ret void
105
105
}
106
106
107
- define void @deref_assumption_in_header_constant_trip_count_loop_invariant_ptr (ptr noalias %a , ptr noalias %b , ptr noalias %c ) {
108
- ; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_loop_invariant_ptr (
107
+ define void @align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr (ptr noalias %a , ptr noalias %b , ptr noalias %c ) {
108
+ ; CHECK-LABEL: define void @align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr (
109
109
; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {
110
110
; CHECK-NEXT: [[ENTRY:.*]]:
111
111
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4) ]
112
112
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
113
113
; CHECK: [[VECTOR_PH]]:
114
114
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
115
115
; CHECK: [[VECTOR_BODY]]:
116
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.* ]] ]
116
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY ]] ]
117
117
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
118
118
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
119
119
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
120
120
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
121
121
; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
122
- ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
123
- ; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
124
- ; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
125
- ; CHECK: [[PRED_LOAD_IF]]:
122
+ ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
126
123
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
127
- ; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i32> poison, i32 [[TMP5]], i32 0
128
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
129
- ; CHECK: [[PRED_LOAD_CONTINUE]]:
130
- ; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP12]], %[[PRED_LOAD_IF]] ]
131
- ; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
132
- ; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
133
- ; CHECK: [[PRED_LOAD_IF1]]:
134
- ; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[A]], align 4
135
- ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> [[TMP13]], i32 [[TMP15]], i32 1
136
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
137
- ; CHECK: [[PRED_LOAD_CONTINUE2]]:
138
- ; CHECK-NEXT: [[TMP7:%.*]] = phi <2 x i32> [ [[TMP13]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP11]], %[[PRED_LOAD_IF1]] ]
124
+ ; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP4]], i32 0
125
+ ; CHECK-NEXT: [[TMP7:%.*]] = insertelement <2 x i32> [[TMP6]], i32 [[TMP5]], i32 1
139
126
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP7]]
140
127
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
141
128
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i32 0
@@ -1085,32 +1072,15 @@ define void @align_and_deref_assumption_in_preheader_constant_trip_count_align_4
1085
1072
; CHECK: [[VECTOR_PH]]:
1086
1073
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1087
1074
; CHECK: [[VECTOR_BODY]]:
1088
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.* ]] ]
1075
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY ]] ]
1089
1076
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
1090
1077
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
1091
1078
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
1092
1079
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
1093
1080
; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
1094
- ; CHECK-NEXT: [[TMP15:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
1095
- ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP15]], i32 0
1096
- ; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
1097
- ; CHECK: [[PRED_LOAD_IF]]:
1098
1081
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]
1099
- ; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP4]], align 4
1100
- ; CHECK-NEXT: [[TMP17:%.*]] = insertelement <2 x i32> poison, i32 [[TMP16]], i32 0
1101
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
1102
- ; CHECK: [[PRED_LOAD_CONTINUE]]:
1103
- ; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP17]], %[[PRED_LOAD_IF]] ]
1104
- ; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP15]], i32 1
1105
- ; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
1106
- ; CHECK: [[PRED_LOAD_IF1]]:
1107
- ; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], 1
1108
- ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]
1109
- ; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
1110
- ; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
1111
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
1112
- ; CHECK: [[PRED_LOAD_CONTINUE2]]:
1113
- ; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
1082
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[TMP4]], i32 0
1083
+ ; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x i32>, ptr [[TMP5]], align 4
1114
1084
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[WIDE_LOAD1]]
1115
1085
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
1116
1086
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i32 0
@@ -1259,15 +1229,32 @@ define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known
1259
1229
; CHECK: [[VECTOR_PH]]:
1260
1230
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1261
1231
; CHECK: [[VECTOR_BODY]]:
1262
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY ]] ]
1232
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.* ]] ]
1263
1233
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
1264
1234
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
1265
1235
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
1266
1236
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
1267
1237
; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
1238
+ ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
1239
+ ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
1240
+ ; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
1241
+ ; CHECK: [[PRED_LOAD_IF]]:
1268
1242
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]
1269
- ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[TMP6]], i32 0
1270
- ; CHECK-NEXT: [[TMP15:%.*]] = load <2 x i32>, ptr [[TMP5]], align 4
1243
+ ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4
1244
+ ; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
1245
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
1246
+ ; CHECK: [[PRED_LOAD_CONTINUE]]:
1247
+ ; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]
1248
+ ; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
1249
+ ; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
1250
+ ; CHECK: [[PRED_LOAD_IF1]]:
1251
+ ; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], 1
1252
+ ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]
1253
+ ; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
1254
+ ; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
1255
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
1256
+ ; CHECK: [[PRED_LOAD_CONTINUE2]]:
1257
+ ; CHECK-NEXT: [[TMP15:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
1271
1258
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP15]]
1272
1259
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
1273
1260
; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[TMP16]], i32 0
0 commit comments