summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll')
-rw-r--r--llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll67
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll b/llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll
new file mode 100644
index 00000000000..08dadeb9aaa
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/tail-dup-subreg-map.ll
@@ -0,0 +1,67 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; REQUIRES: asserts
+
+; When tail-duplicating a block with PHI nodes that use subregisters, the
+; subregisters were dropped by the tail duplicator, resulting in invalid
+; COPY instructions being generated.
+
+; CHECK: = extractu(r{{[0-9]+}}, #15, #17)
+
+target triple = "hexagon"
+
+%struct.0 = type { i64, i16 }
+%struct.1 = type { i64, i64 }
+
+declare hidden fastcc void @foo(%struct.0* noalias nocapture, i8 signext, i8 zeroext, i32, i64, i64) unnamed_addr #0
+
+define void @fred(%struct.0* noalias nocapture sret %agg.result, %struct.1* byval nocapture readonly align 8 %a) #1 {
+entry:
+ %0 = load i64, i64* undef, align 8
+ switch i32 undef, label %if.else [
+ i32 32767, label %if.then
+ i32 0, label %if.then7
+ ]
+
+if.then: ; preds = %entry
+ ret void
+
+if.then7: ; preds = %entry
+ br i1 undef, label %if.then.i, label %if.else16.i
+
+if.then.i: ; preds = %if.then7
+ br i1 undef, label %if.then5.i, label %if.else.i
+
+if.then5.i: ; preds = %if.then.i
+ %shl.i21 = shl i64 %0, 0
+ br label %if.end.i
+
+if.else.i: ; preds = %if.then.i
+ %shl12.i = shl i64 %0, undef
+ br label %if.end.i
+
+if.end.i: ; preds = %if.else.i, %if.then5.i
+ %aSig0.0 = phi i64 [ undef, %if.then5.i ], [ %shl12.i, %if.else.i ]
+ %storemerge43.i = phi i64 [ %shl.i21, %if.then5.i ], [ 0, %if.else.i ]
+ %sub15.i = sub nsw i32 -63, undef
+ br label %if.end13
+
+if.else16.i: ; preds = %if.then7
+ br label %if.end13
+
+if.else: ; preds = %entry
+ %or12 = or i64 undef, 281474976710656
+ br label %if.end13
+
+if.end13: ; preds = %if.else, %if.else16.i, %if.end.i
+ %aSig1.1 = phi i64 [ %0, %if.else ], [ %storemerge43.i, %if.end.i ], [ undef, %if.else16.i ]
+ %aSig0.2 = phi i64 [ %or12, %if.else ], [ %aSig0.0, %if.end.i ], [ undef, %if.else16.i ]
+ %aExp.0 = phi i32 [ undef, %if.else ], [ %sub15.i, %if.end.i ], [ undef, %if.else16.i ]
+ %shl2.i = shl i64 %aSig0.2, 15
+ %shr.i = lshr i64 %aSig1.1, 49
+ %or.i = or i64 %shl2.i, %shr.i
+ tail call fastcc void @foo(%struct.0* noalias %agg.result, i8 signext 80, i8 zeroext undef, i32 %aExp.0, i64 %or.i, i64 undef)
+ unreachable
+}
+
+attributes #0 = { norecurse nounwind }
+attributes #1 = { nounwind }
OpenPOWER on IntegriCloud