aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2024-06-04 09:30:20 +0200
committerNikita Popov <npopov@redhat.com>2024-06-04 09:30:43 +0200
commit434a8a08a2f26bb30cb30c3f9f6794cf7a190844 (patch)
tree65d4c7a1f3a21cac25a3ddc8836cde5093a92fb3 /llvm
parent799ae77993fa5d7b0638f10b3895090f8748de92 (diff)
downloadllvm-434a8a08a2f26bb30cb30c3f9f6794cf7a190844.zip
llvm-434a8a08a2f26bb30cb30c3f9f6794cf7a190844.tar.gz
llvm-434a8a08a2f26bb30cb30c3f9f6794cf7a190844.tar.bz2
[InstCombine] Preserve all gep nowrap flags in PointerReplacer
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp2
-rw-r--r--llvm/test/Transforms/InstCombine/memcpy-addrspace.ll20
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
index 832f89e..21d5e1d 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
@@ -391,7 +391,7 @@ void PointerReplacer::replace(Instruction *I) {
GetElementPtrInst::Create(GEP->getSourceElementType(), V, Indices);
IC.InsertNewInstWith(NewI, GEP->getIterator());
NewI->takeName(GEP);
- NewI->setIsInBounds(GEP->isInBounds());
+ NewI->setNoWrapFlags(GEP->getNoWrapFlags());
WorkMap[GEP] = NewI;
} else if (auto *SI = dyn_cast<SelectInst>(I)) {
auto *NewSI = SelectInst::Create(
diff --git a/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll b/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll
index 2ec3994..d662401 100644
--- a/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll
+++ b/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll
@@ -22,6 +22,26 @@ entry:
ret void
}
+; Same as previous test, but with gep nusw nuw instead of inbounds.
+define void @test_load_gep_nusw_nuw(ptr addrspace(1) %out, i64 %x) {
+; CHECK-LABEL: @test_load_gep_nusw_nuw(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr nusw nuw [8 x i32], ptr addrspace(2) @test.data, i64 0, i64 [[X:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr nusw nuw i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]
+; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %data = alloca [8 x i32], align 4
+ call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)
+ %arrayidx = getelementptr nusw nuw [8 x i32], ptr %data, i64 0, i64 %x
+ %0 = load i32, ptr %arrayidx, align 4
+ %arrayidx1 = getelementptr nusw nuw i32, ptr addrspace(1) %out, i64 %x
+ store i32 %0, ptr addrspace(1) %arrayidx1, align 4
+ ret void
+}
+
define void @test_load_bitcast_chain(ptr addrspace(1) %out, i64 %x) {
; CHECK-LABEL: @test_load_bitcast_chain(
; CHECK-NEXT: entry: