[llvm] r331025 - [IR] Do not assume that function pointers are aligned

Mikhail Maltsev via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 27 02:12:12 PDT 2018


Author: miyuki
Date: Fri Apr 27 02:12:12 2018
New Revision: 331025

URL: http://llvm.org/viewvc/llvm-project?rev=331025&view=rev
Log:
[IR] Do not assume that function pointers are aligned

Summary:
The value tracking analysis uses function alignment to infer that the
least significant bits of function pointers are known to be zero.
Unfortunately, this is not correct for ARM targets: the least
significant bit of a function pointer stores the ARM/Thumb state
information (i.e., the LSB is set for Thumb functions and cleared for
ARM functions).

The original approach (https://reviews.llvm.org/D44781) introduced a
new field for function pointer alignment in the DataLayout structure
to address this. But it seems unlikely that optimizations based on
function pointer alignment would bring much benefit in practice to
justify the additional maintenance burden, so this patch simply
assumes that function pointer alignment is always unknown.

Reviewers: javed.absar, efriedma

Reviewed By: efriedma

Subscribers: kristof.beyls, llvm-commits, hfinkel, rogfer01

Differential Revision: https://reviews.llvm.org/D46110

Added:
    llvm/trunk/test/Analysis/ValueTracking/func-ptr-lsb.ll
Modified:
    llvm/trunk/lib/IR/Value.cpp

Modified: llvm/trunk/lib/IR/Value.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Value.cpp?rev=331025&r1=331024&r2=331025&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Value.cpp (original)
+++ llvm/trunk/lib/IR/Value.cpp Fri Apr 27 02:12:12 2018
@@ -685,6 +685,10 @@ unsigned Value::getPointerAlignment(cons
 
   unsigned Align = 0;
   if (auto *GO = dyn_cast<GlobalObject>(this)) {
+    // Don't make any assumptions about function pointer alignment. Some
+    // targets use the LSBs to store additional information.
+    if (isa<Function>(GO))
+      return 0;
     Align = GO->getAlignment();
     if (Align == 0) {
       if (auto *GVar = dyn_cast<GlobalVariable>(GO)) {

Added: llvm/trunk/test/Analysis/ValueTracking/func-ptr-lsb.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ValueTracking/func-ptr-lsb.ll?rev=331025&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ValueTracking/func-ptr-lsb.ll (added)
+++ llvm/trunk/test/Analysis/ValueTracking/func-ptr-lsb.ll Fri Apr 27 02:12:12 2018
@@ -0,0 +1,18 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+target datalayout = "e-p:32:32-n32-S64"
+
+; CHECK-LABEL: @foo_ptr
+; CHECK: and
+define i32 @foo_ptr() {
+entry:
+  ; Even though the address of @foo is aligned, we cannot assume that the
+  ; pointer has the same alignment. This is not true for e.g. ARM targets
+  ; which store ARM/Thumb state in the LSB
+  ret i32 and (i32 ptrtoint (void ()* @foo to i32), i32 -4)
+}
+
+define internal void @foo() align 16 {
+entry:
+  ret void
+}




More information about the llvm-commits mailing list