Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit eff922a

Browse files
authored
Merge pull request #55 from arielb1/range-nonnull
backport "[InstCombine] Transform !range metadata to !nonnull when combining loads"
2 parents ac1c942 + eff5dc8 commit eff922a

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,16 @@ static LoadInst *combineLoadToNewType(InstCombiner &IC, LoadInst &LI, Type *NewT
380380
break;
381381
case LLVMContext::MD_range:
382382
// FIXME: It would be nice to propagate this in some way, but the type
383-
// conversions make it hard. If the new type is a pointer, we could
384-
// translate it to !nonnull metadata.
383+
// conversions make it hard.
384+
385+
// If it's a pointer now and the range does not contain 0, make it !nonnull.
386+
if (NewTy->isPointerTy()) {
387+
unsigned BitWidth = IC.getDataLayout().getTypeSizeInBits(NewTy);
388+
if (!getConstantRangeFromMetadata(*N).contains(APInt(BitWidth, 0))) {
389+
MDNode *NN = MDNode::get(LI.getContext(), None);
390+
NewLoad->setMetadata(LLVMContext::MD_nonnull, NN);
391+
}
392+
}
385393
break;
386394
}
387395
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: opt < %s -instcombine -S | FileCheck %s
2+
3+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4+
target triple = "x86_64-unknown-linux-gnu"
5+
6+
; Function Attrs: readonly uwtable
7+
define i1 @dot_ref_s(i32** noalias nocapture readonly dereferenceable(8)) {
8+
entry-block:
9+
%loadedptr = load i32*, i32** %0, align 8, !nonnull !0
10+
%ptrtoint = ptrtoint i32* %loadedptr to i64
11+
%inttoptr = inttoptr i64 %ptrtoint to i32*
12+
%switchtmp = icmp eq i32* %inttoptr, null
13+
ret i1 %switchtmp
14+
15+
; CHECK-LABEL: @dot_ref_s
16+
; CHECK-NEXT: entry-block:
17+
; CHECK-NEXT: ret i1 false
18+
}
19+
20+
; Function Attrs: readonly uwtable
21+
define i64* @function(i64* noalias nocapture readonly dereferenceable(8)) {
22+
entry-block:
23+
%loaded = load i64, i64* %0, align 8, !range !1
24+
%inttoptr = inttoptr i64 %loaded to i64*
25+
ret i64* %inttoptr
26+
; CHECK-LABEL: @function
27+
; CHECK: %{{.+}} = load i64*, i64** %{{.+}}, align 8, !nonnull
28+
}
29+
30+
31+
!0 = !{}
32+
!1 = !{i64 1, i64 140737488355327}

0 commit comments

Comments
 (0)