From ef67950b62445e3a7d1ed7afaacf594eaade8193 Mon Sep 17 00:00:00 2001 From: Wei Mi Date: Tue, 21 Apr 2015 23:02:15 +0000 Subject: [PATCH] Limiting gep merging to fix the performance problem described in https://llvm.org/bugs/show_bug.cgi?id=23163. Gep merging sometimes behaves like a reverse CSE/LICM optimization, which has negative impact on performance. In this patch we restrict gep merging to happen only when the indexes to be merged are both consts, which ensures such merge is always beneficial. The patch makes gep merging only happen in very restrictive cases. It is possible that some analysis/optimization passes rely on the merged geps to get better result, and we havn't notice them yet. We will be ready to further improve it once we see the cases. Differential Revision: http://reviews.llvm.org/D8911 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235455 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstructionCombining.cpp | 5 +++++ test/Transforms/InstCombine/descale-zero.ll | 20 ------------------- test/Transforms/InstCombine/getelementptr.ll | 4 ++-- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index 3b46156c1ab..f62941fbf64 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1467,6 +1467,11 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { // normalized. if (SO1->getType() != GO1->getType()) return nullptr; + // Only do the combine when GO1 and SO1 are both constants. Only in + // this case, we are sure the cost after the merge is never more than + // that before the merge. + if (!isa(GO1) || !isa(SO1)) + return nullptr; Sum = Builder->CreateAdd(SO1, GO1, PtrOp->getName()+".sum"); } diff --git a/test/Transforms/InstCombine/descale-zero.ll b/test/Transforms/InstCombine/descale-zero.ll index 4347be48e61..e69de29bb2d 100644 --- a/test/Transforms/InstCombine/descale-zero.ll +++ b/test/Transforms/InstCombine/descale-zero.ll @@ -1,20 +0,0 @@ -; RUN: opt < %s -instcombine -S | FileCheck %s - -target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.10.0" - -define internal i8* @descale_zero() { -entry: -; CHECK: load i8*, i8** inttoptr (i64 48 to i8**), align 16 -; CHECK-NEXT: ret i8* - %i16_ptr = load i16*, i16** inttoptr (i64 48 to i16**), align 16 - %num = load i64, i64* inttoptr (i64 64 to i64*), align 64 - %num_times_2 = shl i64 %num, 1 - %num_times_2_plus_4 = add i64 %num_times_2, 4 - %i8_ptr = bitcast i16* %i16_ptr to i8* - %i8_ptr_num_times_2_plus_4 = getelementptr i8, i8* %i8_ptr, i64 %num_times_2_plus_4 - %num_times_neg2 = mul i64 %num, -2 - %num_times_neg2_minus_4 = add i64 %num_times_neg2, -4 - %addr = getelementptr i8, i8* %i8_ptr_num_times_2_plus_4, i64 %num_times_neg2_minus_4 - ret i8* %addr -} diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll index 9bb1b12a697..276ada91f3c 100644 --- a/test/Transforms/InstCombine/getelementptr.ll +++ b/test/Transforms/InstCombine/getelementptr.ll @@ -104,8 +104,8 @@ define i32* @test7(i32* %I, i64 %C, i64 %D) { %B = getelementptr i32, i32* %A, i64 %D ret i32* %B ; CHECK-LABEL: @test7( -; CHECK: %A.sum = add i64 %C, %D -; CHECK: getelementptr i32, i32* %I, i64 %A.sum +; CHECK: %A = getelementptr i32, i32* %I, i64 %C +; CHECK: %B = getelementptr i32, i32* %A, i64 %D } define i8* @test8([10 x i32]* %X) { -- 2.34.1