[llvm] 4ac0078 - [RelLookupTableConverter] Bail on invalid pointer size (x32)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 9 00:37:29 PDT 2022


Author: Nikita Popov
Date: 2022-08-09T09:36:39+02:00
New Revision: 4ac00789e1b30145ec3cacc4b2a66cb755ff9e4a

URL: https://github.com/llvm/llvm-project/commit/4ac00789e1b30145ec3cacc4b2a66cb755ff9e4a
DIFF: https://github.com/llvm/llvm-project/commit/4ac00789e1b30145ec3cacc4b2a66cb755ff9e4a.diff

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

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.

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

Added: 
    llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll

Modified: 
    llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp b/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
index 9264274506825..c9ff94dc9744f 100644
--- a/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
+++ b/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
@@ -57,11 +57,15 @@ static bool shouldConvertToRelLookupTable(Module &M, GlobalVariable &GV) {
     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;

diff  --git a/llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll b/llvm/test/Transforms/RelLookupTableConverter/X86/gnux32.ll
new file mode 100644
index 0000000000000..0088067e18eaf
--- /dev/null
+++ b/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
+}


        


More information about the llvm-commits mailing list