[PATCH] D131399: [RelLookupTableConverter] Bail on invalid pointer size (x32)

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 07:41:05 PDT 2022


nikic created this revision.
nikic added reviewers: gulfem, leonardchan, hans.
Herald added a subscriber: hiraditya.
Herald added a project: All.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The RelLookupTableConverter pass currently only supports 64-bit pointers. This is currently enforced using an isArch64Bit() check on the target triple. However, we consider x32 to be a 64-bit target, even though the pointers are 32-bit. (And independently of that specific example, there may be address spaces with different pointer sizes.)

As such, add an additional guard for the size of the pointers that are actually part of the lookup table.


https://reviews.llvm.org/D131399

Files:
  llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
  llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll


Index: llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=rel-lookup-table-converter -relocation-model=pic -S | FileCheck %s
+; REQUIRES: x86-registered-target
+
+target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnux32"
+
+ at a = internal constant i32 0, align 4
+ at b = internal constant i32 0, align 4
+ at c = internal constant i32 0, align 4
+
+ at table = private unnamed_addr constant [3 x ptr] [ptr @a, ptr @b, ptr @c]
+
+define ptr @test(i32 %cond) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x ptr], ptr @table, i32 0, i32 [[COND:%.*]]
+; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load ptr, ptr [[SWITCH_GEP]], align 8
+; CHECK-NEXT:    ret ptr [[SWITCH_LOAD]]
+;
+  %switch.gep = getelementptr inbounds [3 x ptr], ptr @table, i32 0, i32 %cond
+  %switch.load = load ptr, ptr %switch.gep, align 8
+  ret ptr %switch.load
+}
Index: llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
===================================================================
--- llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
+++ llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
@@ -57,11 +57,15 @@
     return false;
 
   ConstantArray *Array = dyn_cast<ConstantArray>(GV.getInitializer());
-  // If values are not pointers, do not generate a relative lookup table.
-  if (!Array || !Array->getType()->getElementType()->isPointerTy())
+  if (!Array)
     return false;
 
+  // If values are not 64-bit pointers, do not generate a relative lookup table.
   const DataLayout &DL = M.getDataLayout();
+  Type *ElemType = Array->getType()->getElementType();
+  if (!ElemType->isPointerTy() || DL.getPointerTypeSizeInBits(ElemType) != 64)
+    return false;
+
   for (const Use &Op : Array->operands()) {
     Constant *ConstOp = cast<Constant>(&Op);
     GlobalValue *GVOp;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131399.450802.patch
Type: text/x-patch
Size: 2162 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220808/5c6f2941/attachment-0001.bin>


More information about the llvm-commits mailing list