[llvm] r305289 - [Hexagon] Stop pmpy recognition when shift conversion fails

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 13 06:51:49 PDT 2017


Author: kparzysz
Date: Tue Jun 13 08:51:49 2017
New Revision: 305289

URL: http://llvm.org/viewvc/llvm-project?rev=305289&view=rev
Log:
[Hexagon] Stop pmpy recognition when shift conversion fails

The conversion of shifts from right shifts to left shifts may fail.
In such case, the pmpy recognition cannot proceed.

Added:
    llvm/trunk/test/CodeGen/Hexagon/loop-idiom/pmpy-shiftconv-fail.ll
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp?rev=305289&r1=305288&r2=305289&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp Tue Jun 13 08:51:49 2017
@@ -1744,7 +1744,8 @@ bool PolynomialMultiplyRecognize::recogn
     // wide as the target's pmpy instruction.
     if (!promoteTypes(LoopB, ExitB))
       return false;
-    convertShiftsToLeft(LoopB, ExitB, IterCount);
+    if (!convertShiftsToLeft(LoopB, ExitB, IterCount))
+      return false;
     cleanupLoopBody(LoopB);
   }
 

Added: llvm/trunk/test/CodeGen/Hexagon/loop-idiom/pmpy-shiftconv-fail.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/loop-idiom/pmpy-shiftconv-fail.ll?rev=305289&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/loop-idiom/pmpy-shiftconv-fail.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/loop-idiom/pmpy-shiftconv-fail.ll Tue Jun 13 08:51:49 2017
@@ -0,0 +1,48 @@
+; RUN: opt -march=hexagon -hexagon-loop-idiom -S < %s | FileCheck %s
+; REQUIRES: asserts
+;
+; Check for sane output, this used to crash.
+; CHECK: define void @fred
+
+; The conversion of shifts from right to left failed, but the return
+; code was not checked and the transformation proceeded.
+
+target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
+target triple = "hexagon"
+
+ at A = common global [256 x i32] zeroinitializer, align 8
+
+; Function Attrs: noinline nounwind
+define void @fred() local_unnamed_addr #0 {
+b0:
+  br label %b1
+
+b1:                                               ; preds = %b13, %b0
+  %v2 = phi i32 [ 0, %b0 ], [ %v16, %b13 ]
+  br label %b3
+
+b3:                                               ; preds = %b3, %b1
+  %v4 = phi i32 [ %v2, %b1 ], [ %v10, %b3 ]
+  %v5 = phi i32 [ 0, %b1 ], [ %v11, %b3 ]
+  %v6 = and i32 %v4, 1
+  %v7 = icmp ne i32 %v6, 0
+  %v8 = lshr i32 %v4, 1
+  %v9 = xor i32 %v8, 123456789
+  %v10 = select i1 %v7, i32 %v9, i32 %v8
+  %v11 = add nuw nsw i32 %v5, 1
+  %v12 = icmp ne i32 %v11, 8
+  br i1 %v12, label %b3, label %b13
+
+b13:                                              ; preds = %b3
+  %v14 = phi i32 [ %v10, %b3 ]
+  %v15 = getelementptr inbounds [256 x i32], [256 x i32]* @A, i32 0, i32 %v2
+  store i32 %v14, i32* %v15, align 4
+  %v16 = add nuw nsw i32 %v2, 1
+  %v17 = icmp ne i32 %v16, 256
+  br i1 %v17, label %b1, label %b18
+
+b18:                                              ; preds = %b13
+  ret void
+}
+
+attributes #0 = { noinline nounwind "target-cpu"="hexagonv60" }




More information about the llvm-commits mailing list