[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

`+

}

`