[llvm-bugs] [Bug 30597] New: instcombine drops load !nonnull metadata on an inttoptr/ptrtoint

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Oct 3 08:43:58 PDT 2016


https://llvm.org/bugs/show_bug.cgi?id=30597

            Bug ID: 30597
           Summary: instcombine drops load !nonnull metadata on an
                    inttoptr/ptrtoint
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: arielb1 at mail.tau.ac.il
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

## Description

When instcombine simplifies a inttoptr/ptrtoint pair that covers a load,
!nonnull metadata on the load seems to be dropped on the floor, leading to
missed optimizations.

This is one of the causes of https://github.com/rust-lang/rust/issues/36920
(the current version of rustc does not emit the required nonnull metadata, but
modifying it to emit the metadata leads to this issue).

Tested on Rust's fork of LLVM 3.9 and Debian's LLVM 3.7.

## STR

; ModuleID = 'test.cgu-0.rs'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: readonly uwtable
define i32 @dot_ref_s(i32** noalias nocapture readonly dereferenceable(8)) {
entry-block:
  %loadedptr = load i32*, i32** %0, align 8, !nonnull !0
  %ptrtoint = ptrtoint i32* %loadedptr to i64
  %inttoptr = inttoptr i64 %ptrtoint to i32*
  %switchtmp = icmp eq i32* %inttoptr, null
  br i1 %switchtmp, label %bb6, label %bb7

bb6:
  ret i32 0

bb7:
  ret i32 42
}

!0 = !{}

## Expected Result

The null check is optimized out.

## Actual Result

; ModuleID = '<stdin>'
source_filename = "test.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32 @dot_ref_s(i32** noalias nocapture readonly dereferenceable(8)) {
entry-block:
  %loadedptr12 = load i32*, i32** %0, align 8     ; <- where is my metadata?
  %switchtmp = icmp eq i32* %loadedptr12, null
  br i1 %switchtmp, label %bb6, label %bb7

bb6:                                              ; preds = %entry-block
  ret i32 0

bb7:                                              ; preds = %entry-block
  ret i32 42
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20161003/3bbe0c9e/attachment.html>


More information about the llvm-bugs mailing list