[AggressiveInstCombine] Use APInt and avoid truncation when folding l… · llvm/llvm-project@657e03f (original) (raw)
`@@ -1205,19 +1205,19 @@ entry:
`
1205
1205
``
1206
1206
`define i32 @loadCombine_4consecutive_metadata(ptr %p, ptr %pstr) {
`
1207
1207
`; LE-LABEL: @loadCombine_4consecutive_metadata(
`
1208
``
`-
; LE-NEXT: [[L1:%.]] = load i32, ptr [[P:%.]], align 1, !alias.scope !0
`
1209
``
`-
; LE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias !0
`
``
1208
`+
; LE-NEXT: [[L1:%.]] = load i32, ptr [[P:%.]], align 1, !alias.scope [[META0:![0-9]+]]
`
``
1209
`+
; LE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]
`
1210
1210
`; LE-NEXT: ret i32 [[L1]]
`
1211
1211
`;
`
1212
1212
`; BE-LABEL: @loadCombine_4consecutive_metadata(
`
1213
1213
`; BE-NEXT: [[P1:%.]] = getelementptr i8, ptr [[P:%.]], i32 1
`
1214
1214
`; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
`
1215
1215
`; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
`
1216
``
`-
; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope !0
`
1217
``
`-
; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope !0
`
1218
``
`-
; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope !0
`
1219
``
`-
; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope !0
`
1220
``
`-
; BE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias !0
`
``
1216
`+
; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope [[META0:![0-9]+]]
`
``
1217
`+
; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope [[META0]]
`
``
1218
`+
; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope [[META0]]
`
``
1219
`+
; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope [[META0]]
`
``
1220
`+
; BE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]
`
1221
1221
`; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
`
1222
1222
`; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
`
1223
1223
`; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
`
`@@ -2005,7 +2005,7 @@ define i32 @loadCombine_4consecutive_badinsert2(ptr %p) {
`
2005
2005
``
2006
2006
`define i32 @loadCombine_4consecutive_badinsert3(ptr %p) {
`
2007
2007
`; LE-LABEL: @loadCombine_4consecutive_badinsert3(
`
2008
``
`-
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i32 1
`
``
2008
`+
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i64 1
`
2009
2009
`; LE-NEXT: [[L1:%.*]] = load i32, ptr [[TMP1]], align 1
`
2010
2010
`; LE-NEXT: ret i32 [[L1]]
`
2011
2011
`;
`
`@@ -2306,7 +2306,7 @@ define i64 @loadCombine_nonConstShift2(ptr %arg, i8 %b) {
`
2306
2306
``
2307
2307
`define void @nested_gep(ptr %p, ptr %dest) {
`
2308
2308
`; LE-LABEL: @nested_gep(
`
2309
``
`-
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i32 68
`
``
2309
`+
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i64 68
`
2310
2310
`; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
`
2311
2311
`; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
`
2312
2312
`; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4
`
`@@ -2346,7 +2346,7 @@ define void @nested_gep(ptr %p, ptr %dest) {
`
2346
2346
``
2347
2347
`define void @bitcast_gep(ptr %p, ptr %dest) {
`
2348
2348
`; LE-LABEL: @bitcast_gep(
`
2349
``
`-
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i32 68
`
``
2349
`+
; LE-NEXT: [[TMP1:%.]] = getelementptr i8, ptr [[P:%.]], i64 68
`
2350
2350
`; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
`
2351
2351
`; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
`
2352
2352
`; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4
`
`@@ -2382,3 +2382,35 @@ define void @bitcast_gep(ptr %p, ptr %dest) {
`
2382
2382
`store i32 %trunc, ptr %dest, align 4
`
2383
2383
`ret void
`
2384
2384
`}
`
``
2385
+
``
2386
`+
define i32 @loadcombine_consecutive_idx_64(ptr %data) {
`
``
2387
`+
; LE-LABEL: @loadcombine_consecutive_idx_64(
`
``
2388
`+
; LE-NEXT: entry:
`
``
2389
`+
; LE-NEXT: [[TMP0:%.]] = getelementptr i8, ptr [[DATA:%.]], i64 2149675576
`
``
2390
`+
; LE-NEXT: [[VAL_2:%.*]] = load i16, ptr [[TMP0]], align 1
`
``
2391
`+
; LE-NEXT: [[TMP1:%.*]] = zext i16 [[VAL_2]] to i32
`
``
2392
`+
; LE-NEXT: ret i32 [[TMP1]]
`
``
2393
`+
;
`
``
2394
`+
; BE-LABEL: @loadcombine_consecutive_idx_64(
`
``
2395
`+
; BE-NEXT: entry:
`
``
2396
`+
; BE-NEXT: [[ARRAYIDX:%.]] = getelementptr inbounds nuw i8, ptr [[DATA:%.]], i64 2149675577
`
``
2397
`+
; BE-NEXT: [[VAL:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
`
``
2398
`+
; BE-NEXT: [[CONV:%.*]] = zext i8 [[VAL]] to i32
`
``
2399
`+
; BE-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds nuw i8, ptr [[DATA]], i64 2149675576
`
``
2400
`+
; BE-NEXT: [[VAL_2:%.*]] = load i8, ptr [[ARRAYIDX_2]], align 1
`
``
2401
`+
; BE-NEXT: [[CONV_2:%.*]] = zext i8 [[VAL_2]] to i32
`
``
2402
`+
; BE-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[CONV]], 8
`
``
2403
`+
; BE-NEXT: [[OR:%.*]] = or disjoint i32 [[SHL]], [[CONV_2]]
`
``
2404
`+
; BE-NEXT: ret i32 [[OR]]
`
``
2405
`+
;
`
``
2406
`+
entry:
`
``
2407
`+
%arrayidx = getelementptr inbounds nuw i8, ptr %data, i64 2149675577
`
``
2408
`+
%val = load i8, ptr %arrayidx, align 1
`
``
2409
`+
%conv = zext i8 %val to i32
`
``
2410
`+
%arrayidx.2 = getelementptr inbounds nuw i8, ptr %data, i64 2149675576
`
``
2411
`+
%val.2 = load i8, ptr %arrayidx.2, align 1
`
``
2412
`+
%conv.2 = zext i8 %val.2 to i32
`
``
2413
`+
%shl = shl nuw nsw i32 %conv, 8
`
``
2414
`+
%or = or disjoint i32 %shl, %conv.2
`
``
2415
`+
ret i32 %or
`
``
2416
`+
}
`