From 0545f16700b4757fa9523e9de199a101d16e6996 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Thu, 26 Jun 2014 00:30:52 +0000 Subject: [PATCH] Don't build switch tables for dllimport and TLS variables in GEPs This is a follow-up to r211331, which failed to notice that we were returning early from ValidLookupTableConstant for GEPs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211753 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 5 +++-- .../SimplifyCFG/X86/switch_to_lookup_table.ll | 13 ++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index ff2f2a03622..b1f9bff5377 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3311,13 +3311,14 @@ static bool ForwardSwitchConditionToPHI(SwitchInst *SI) { /// ValidLookupTableConstant - Return true if the backend will be able to handle /// initializing an array of constants like C. static bool ValidLookupTableConstant(Constant *C) { - if (ConstantExpr *CE = dyn_cast(C)) - return CE->isGEPWithNoNotionalOverIndexing(); if (C->isThreadDependent()) return false; if (C->isDLLImportDependent()) return false; + if (ConstantExpr *CE = dyn_cast(C)) + return CE->isGEPWithNoNotionalOverIndexing(); + return isa(C) || isa(C) || isa(C) || diff --git a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index ee63d2c0c0f..51ced4099ac 100644 --- a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -946,10 +946,10 @@ return: } ; Don't build tables for switches with dllimport variables. -@dllimport_a = external dllimport global i32 -@dllimport_b = external dllimport global i32 -@dllimport_c = external dllimport global i32 -@dllimport_d = external dllimport global i32 +@dllimport_a = external dllimport global [3x i32] +@dllimport_b = external dllimport global [3x i32] +@dllimport_c = external dllimport global [3x i32] +@dllimport_d = external dllimport global [3x i32] define i32* @dllimport(i32 %x) { entry: switch i32 %x, label %sw.default [ @@ -964,7 +964,10 @@ sw.bb2: sw.default: br label %return return: - %retval.0 = phi i32* [ @dllimport_d, %sw.default ], [ @dllimport_c, %sw.bb2 ], [ @dllimport_b, %sw.bb1 ], [ @dllimport_a, %entry ] + %retval.0 = phi i32* [ getelementptr inbounds ([3 x i32]* @dllimport_d, i32 0, i32 0), %sw.default ], + [ getelementptr inbounds ([3 x i32]* @dllimport_c, i32 0, i32 0), %sw.bb2 ], + [ getelementptr inbounds ([3 x i32]* @dllimport_b, i32 0, i32 0), %sw.bb1 ], + [ getelementptr inbounds ([3 x i32]* @dllimport_a, i32 0, i32 0), %entry ] ret i32* %retval.0 ; CHECK-LABEL: @dllimport( ; CHECK: switch i32 -- 2.34.1