The fold for merging a GEP of GEP into a single GEP currently bails
if doing so would result in notional overindexing. The justification
given in the comment above this check is dangerously incorrect: GEPs
with notional overindexing are perfectly fine, and if some code
treats them incorrectly, then that code is broken, not the GEP.
Such a GEP might legally appear in source IR, so only preventing
its creation cannot be sufficient. (The constant folder also ends
up canonicalizing the GEP to remove the notional overindexing, but
that's neither here nor there.)
This check dates back to
bd4fef4a89,
and as far as I can tell the original issue this was trying to
patch around has since been resolved.
Differential Revision: https://reviews.llvm.org/D116587
81 lines
2.7 KiB
LLVM
81 lines
2.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=sccp -S | FileCheck %s
|
|
|
|
@Y = constant [6 x i101] [ i101 12, i101 123456789000000, i101 -12,
|
|
i101 -123456789000000, i101 0,i101 9123456789000000]
|
|
|
|
define i101 @array() {
|
|
; CHECK-LABEL: @array(
|
|
; CHECK-NEXT: ret i101 123456789000000
|
|
;
|
|
%A = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 1
|
|
%B = load i101, i101* %A
|
|
%D = and i101 %B, 1
|
|
%DD = or i101 %D, 1
|
|
%E = trunc i101 %DD to i32
|
|
%F = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 %E
|
|
%G = load i101, i101* %F
|
|
|
|
ret i101 %G
|
|
}
|
|
|
|
define i101 @large_aggregate() {
|
|
; CHECK-LABEL: @large_aggregate(
|
|
; CHECK-NEXT: [[D:%.*]] = and i101 undef, 1
|
|
; CHECK-NEXT: [[DD:%.*]] = or i101 [[D]], 1
|
|
; CHECK-NEXT: [[G:%.*]] = getelementptr i101, i101* getelementptr inbounds ([6 x i101], [6 x i101]* @Y, i32 0, i32 5), i101 [[DD]]
|
|
; CHECK-NEXT: [[L3:%.*]] = load i101, i101* [[G]], align 4
|
|
; CHECK-NEXT: ret i101 [[L3]]
|
|
;
|
|
%B = load i101, i101* undef
|
|
%D = and i101 %B, 1
|
|
%DD = or i101 %D, 1
|
|
%F = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 5
|
|
%G = getelementptr i101, i101* %F, i101 %DD
|
|
%L3 = load i101, i101* %G
|
|
ret i101 %L3
|
|
}
|
|
|
|
define i101 @large_aggregate_2() {
|
|
; CHECK-LABEL: @large_aggregate_2(
|
|
; CHECK-NEXT: [[D:%.*]] = and i101 undef, 1
|
|
; CHECK-NEXT: [[DD:%.*]] = or i101 [[D]], 1
|
|
; CHECK-NEXT: [[G:%.*]] = getelementptr i101, i101* getelementptr inbounds ([6 x i101], [6 x i101]* @Y, i32 0, i32 5), i101 [[DD]]
|
|
; CHECK-NEXT: [[L3:%.*]] = load i101, i101* [[G]], align 4
|
|
; CHECK-NEXT: ret i101 [[L3]]
|
|
;
|
|
%D = and i101 undef, 1
|
|
%DD = or i101 %D, 1
|
|
%F = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 5
|
|
%G = getelementptr i101, i101* %F, i101 %DD
|
|
%L3 = load i101, i101* %G
|
|
ret i101 %L3
|
|
}
|
|
|
|
define void @index_too_large() {
|
|
; CHECK-LABEL: @index_too_large(
|
|
; CHECK-NEXT: store i101* getelementptr ([6 x i101], [6 x i101]* @Y, i101 1537416322793603071, i101 4), i101** undef, align 8
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%ptr1 = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 -1
|
|
%ptr2 = getelementptr i101, i101* %ptr1, i101 9224497936761618431
|
|
store i101* %ptr2, i101** undef
|
|
ret void
|
|
}
|
|
|
|
; OSS-Fuzz #39197
|
|
; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=39197
|
|
@0 = external dso_local unnamed_addr constant [16 x i8]
|
|
define void @ossfuzz_39197() {
|
|
; CHECK-LABEL: @ossfuzz_39197(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%B5 = or i72 0, 2361183241434822606847
|
|
%i = add nuw nsw i72 %B5, 0
|
|
%i1 = lshr i72 %i, 1
|
|
%i2 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* bitcast ([16 x i8]* @0 to [4 x [4 x i8]]*), i72 0, i72 0, i72 %i1
|
|
ret void
|
|
}
|