From d8fdbb2ea84afd9be849e4237634ec09879a2d36 Mon Sep 17 00:00:00 2001 From: Jingyue Wu Date: Sun, 8 Jun 2014 20:19:38 +0000 Subject: [PATCH] [SeparateConstOffsetFromGEP] Fix an illegitimate optimization on zext zext(a + b) != zext(a) + zext(b) even if a + b >= 0 && b >= 0. e.g., a = i4 0b1111, b = i4 0b0001 zext a + b to i8 = zext 0b0000 to i8 = 0b00000000 (zext a to i8) + (zext b to i8) = 0b00001111 + 0b00000001 = 0b00010000 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210439 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp b/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp index 3f84ffde946..7c65351ad15 100644 --- a/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp +++ b/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp @@ -321,9 +321,9 @@ bool ConstantOffsetExtractor::CanTraceInto(bool SignExtended, // 1 | 0 | sext(BO) == sext(A) op sext(B) // 1 | 1 | zext(sext(BO)) == // | | zext(sext(A)) op zext(sext(B)) - if (BO->getOpcode() == Instruction::Add && NonNegative) { + if (BO->getOpcode() == Instruction::Add && !ZeroExtended && NonNegative) { // If a + b >= 0 and (a >= 0 or b >= 0), then - // s/zext(a + b) = s/zext(a) + s/zext(b) + // sext(a + b) = sext(a) + sext(b) // even if the addition is not marked nsw. // // Leveraging this invarient, we can trace into an sext'ed inbound GEP -- 2.34.1