diff options
author | Nikita Popov <npopov@redhat.com> | 2024-06-04 09:30:20 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2024-06-04 09:30:43 +0200 |
commit | 434a8a08a2f26bb30cb30c3f9f6794cf7a190844 (patch) | |
tree | 65d4c7a1f3a21cac25a3ddc8836cde5093a92fb3 /llvm | |
parent | 799ae77993fa5d7b0638f10b3895090f8748de92 (diff) | |
download | llvm-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.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/memcpy-addrspace.ll | 20 |
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: |