[PATCH] D49512: [CodeGenPrepare] Remove instruction from PromotedInsts if we have seen it multi times
Guozhi Wei via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 18 14:49:45 PDT 2018
Carrot created this revision.
Carrot added a reviewer: qcolombet.
Herald added a subscriber: llvm-commits.
This patch fixes PR38125.
Instruction extension types are recorded in PromotedInsts, it can be used later in function canGetThrough. If an instruction has two users with different extension types, it will be inserted into PromotedInsts two times in function promoteOperandForOther. The second one overwrites the first one, and the final extension type is wrong, later causes problem in canGetThrough.
The simple fix is removing the instruction from PromotedInsts if we have seen it twice with conflict extension types.
Repository:
rL LLVM
https://reviews.llvm.org/D49512
Files:
lib/CodeGen/CodeGenPrepare.cpp
test/Transforms/CodeGenPrepare/X86/pr38125.ll
Index: test/Transforms/CodeGenPrepare/X86/pr38125.ll
===================================================================
--- test/Transforms/CodeGenPrepare/X86/pr38125.ll
+++ test/Transforms/CodeGenPrepare/X86/pr38125.ll
@@ -0,0 +1,32 @@
+; RUN: opt < %s -codegenprepare -S -mtriple=x86_64-unknown-unknown | FileCheck %s
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.13.0"
+
+declare void @bar(i64)
+
+ at b = global i16 0, align 2
+
+; CHECK: %promoted = trunc i32 %or to i16
+; CHECK-NEXT: %c = sext i16 %promoted to i64
+define i32 @foo() {
+entry:
+ %cmp6 = icmp sgt i32 0, -1
+ br i1 %cmp6, label %t, label %f
+
+f:
+ br label %end
+
+t:
+ br label %end
+
+end:
+ %t3 = phi i16 [ 0, %f ], [ -3, %t ]
+ %t4 = load i16, i16* @b, align 2
+ %conv4 = zext i16 %t4 to i32
+ %or = or i16 %t3, %t4
+ %c = sext i16 %or to i64
+ call void @bar(i64 %c)
+ %t5 = and i16 %or, 5
+ %z = zext i16 %t5 to i32
+ ret i32 %z
+}
Index: lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- lib/CodeGen/CodeGenPrepare.cpp
+++ lib/CodeGen/CodeGenPrepare.cpp
@@ -3596,8 +3596,14 @@
// Remember the original type of the instruction before promotion.
// This is useful to know that the high bits are sign extended bits.
- PromotedInsts.insert(std::pair<Instruction *, TypeIsSExt>(
- ExtOpnd, TypeIsSExt(ExtOpnd->getType(), IsSExt)));
+ // If the instruction has conflict extension types, remove it.
+ InstrToOrigTy::iterator It = PromotedInsts.find(ExtOpnd);
+ if (It == PromotedInsts.end())
+ PromotedInsts.insert(std::pair<Instruction *, TypeIsSExt>(
+ ExtOpnd, TypeIsSExt(ExtOpnd->getType(), IsSExt)));
+ else if (It->second.getInt() != IsSExt)
+ PromotedInsts.erase(It);
+
// Step #1.
TPT.mutateType(ExtOpnd, Ext->getType());
// Step #2.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49512.156147.patch
Type: text/x-patch
Size: 1885 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180718/a94e8c9b/attachment.bin>
More information about the llvm-commits
mailing list