[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