Skip to content

Commit 657e03f

Browse files
antoniofrighettotru
authored andcommitted
[AggressiveInstCombine] Use APInt and avoid truncation when folding loads
A miscompilation issue has been addressed with improved handling. Fixes: #118467. (cherry picked from commit f68b0e3)
1 parent 8e9465b commit 657e03f

File tree

3 files changed

+53
-22
lines changed

3 files changed

+53
-22
lines changed

llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -811,8 +811,7 @@ static bool foldConsecutiveLoads(Instruction &I, const DataLayout &DL,
811811
APInt Offset1(DL.getIndexTypeSizeInBits(Load1Ptr->getType()), 0);
812812
Load1Ptr = Load1Ptr->stripAndAccumulateConstantOffsets(
813813
DL, Offset1, /* AllowNonInbounds */ true);
814-
Load1Ptr = Builder.CreatePtrAdd(Load1Ptr,
815-
Builder.getInt32(Offset1.getZExtValue()));
814+
Load1Ptr = Builder.CreatePtrAdd(Load1Ptr, Builder.getInt(Offset1));
816815
}
817816
// Generate wider load.
818817
NewLoad = Builder.CreateAlignedLoad(WiderType, Load1Ptr, LI1->getAlign(),

llvm/test/Transforms/AggressiveInstCombine/AArch64/or-load.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,19 +1121,19 @@ entry:
11211121

11221122
define i32 @loadCombine_4consecutive_metadata(ptr %p, ptr %pstr) {
11231123
; LE-LABEL: @loadCombine_4consecutive_metadata(
1124-
; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1, !alias.scope !0
1125-
; LE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias !0
1124+
; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1, !alias.scope [[META0:![0-9]+]]
1125+
; LE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]
11261126
; LE-NEXT: ret i32 [[L1]]
11271127
;
11281128
; BE-LABEL: @loadCombine_4consecutive_metadata(
11291129
; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
11301130
; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
11311131
; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
1132-
; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope !0
1133-
; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope !0
1134-
; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope !0
1135-
; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope !0
1136-
; BE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias !0
1132+
; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope [[META0:![0-9]+]]
1133+
; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope [[META0]]
1134+
; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope [[META0]]
1135+
; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope [[META0]]
1136+
; BE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]
11371137
; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
11381138
; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
11391139
; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
@@ -1869,7 +1869,7 @@ define i32 @loadCombine_4consecutive_badinsert2(ptr %p) {
18691869

18701870
define i32 @loadCombine_4consecutive_badinsert3(ptr %p) {
18711871
; LE-LABEL: @loadCombine_4consecutive_badinsert3(
1872-
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
1872+
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 1
18731873
; LE-NEXT: [[L1:%.*]] = load i32, ptr [[TMP1]], align 1
18741874
; LE-NEXT: ret i32 [[L1]]
18751875
;
@@ -2088,7 +2088,7 @@ define i32 @loadCombine_4consecutive_badinsert6(ptr %p) {
20882088

20892089
define void @nested_gep(ptr %p, ptr %dest) {
20902090
; LE-LABEL: @nested_gep(
2091-
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 68
2091+
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 68
20922092
; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
20932093
; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
20942094
; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4
@@ -2128,7 +2128,7 @@ define void @nested_gep(ptr %p, ptr %dest) {
21282128

21292129
define void @bitcast_gep(ptr %p, ptr %dest) {
21302130
; LE-LABEL: @bitcast_gep(
2131-
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 68
2131+
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 68
21322132
; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
21332133
; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
21342134
; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4

llvm/test/Transforms/AggressiveInstCombine/X86/or-load.ll

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,19 +1205,19 @@ entry:
12051205

12061206
define i32 @loadCombine_4consecutive_metadata(ptr %p, ptr %pstr) {
12071207
; 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]]
12101210
; LE-NEXT: ret i32 [[L1]]
12111211
;
12121212
; BE-LABEL: @loadCombine_4consecutive_metadata(
12131213
; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
12141214
; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
12151215
; 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]]
12211221
; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
12221222
; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
12231223
; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
@@ -2005,7 +2005,7 @@ define i32 @loadCombine_4consecutive_badinsert2(ptr %p) {
20052005

20062006
define i32 @loadCombine_4consecutive_badinsert3(ptr %p) {
20072007
; 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
20092009
; LE-NEXT: [[L1:%.*]] = load i32, ptr [[TMP1]], align 1
20102010
; LE-NEXT: ret i32 [[L1]]
20112011
;
@@ -2306,7 +2306,7 @@ define i64 @loadCombine_nonConstShift2(ptr %arg, i8 %b) {
23062306

23072307
define void @nested_gep(ptr %p, ptr %dest) {
23082308
; LE-LABEL: @nested_gep(
2309-
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 68
2309+
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 68
23102310
; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
23112311
; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
23122312
; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4
@@ -2346,7 +2346,7 @@ define void @nested_gep(ptr %p, ptr %dest) {
23462346

23472347
define void @bitcast_gep(ptr %p, ptr %dest) {
23482348
; LE-LABEL: @bitcast_gep(
2349-
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 68
2349+
; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 68
23502350
; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 4
23512351
; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i32
23522352
; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 4
@@ -2382,3 +2382,35 @@ define void @bitcast_gep(ptr %p, ptr %dest) {
23822382
store i32 %trunc, ptr %dest, align 4
23832383
ret void
23842384
}
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+
}

0 commit comments

Comments
 (0)