diff options
Diffstat (limited to 'test/CodeGen/PowerPC')
22 files changed, 400 insertions, 8 deletions
diff --git a/test/CodeGen/PowerPC/2007-11-16-landingpad-split.ll b/test/CodeGen/PowerPC/2007-11-16-landingpad-split.ll index ccf5297..df83f8b 100644 --- a/test/CodeGen/PowerPC/2007-11-16-landingpad-split.ll +++ b/test/CodeGen/PowerPC/2007-11-16-landingpad-split.ll @@ -1,4 +1,5 @@ ; RUN: llc -mcpu=g5 < %s | FileCheck %s +; RUN: llc -mcpu=g5 -addr-sink-using-gep=1 < %s | FileCheck %s ;; Formerly crashed, see PR 1508 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128" target triple = "powerpc64-apple-darwin8" diff --git a/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll b/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll index 00a402e..8802b97 100644 --- a/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll +++ b/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll @@ -1,6 +1,5 @@ ; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep vadduhm ; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep vsubuhm -; XFAIL: * define <4 x i32> @test() nounwind { ret <4 x i32> < i32 4293066722, i32 4293066722, i32 4293066722, i32 4293066722> diff --git a/test/CodeGen/PowerPC/aa-tbaa.ll b/test/CodeGen/PowerPC/aa-tbaa.ll index d7f80fa..1939841 100644 --- a/test/CodeGen/PowerPC/aa-tbaa.ll +++ b/test/CodeGen/PowerPC/aa-tbaa.ll @@ -1,4 +1,4 @@ -; RUN: llc -enable-misched -misched=shuffle -enable-aa-sched-mi -post-RA-scheduler=0 -mcpu=ppc64 < %s | FileCheck %s +; RUN: llc -enable-misched -misched=shuffle -enable-aa-sched-mi -use-tbaa-in-sched-mi=0 -post-RA-scheduler=0 -mcpu=ppc64 < %s | FileCheck %s ; REQUIRES: asserts ; -misched=shuffle is NDEBUG only! diff --git a/test/CodeGen/PowerPC/alias.ll b/test/CodeGen/PowerPC/alias.ll new file mode 100644 index 0000000..86e4114 --- /dev/null +++ b/test/CodeGen/PowerPC/alias.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -code-model=medium| FileCheck --check-prefix=CHECK --check-prefix=MEDIUM %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -code-model=large | FileCheck --check-prefix=CHECK --check-prefix=LARGE %s + +@foo = global i32 42 +@fooa = alias i32* @foo + +@foo2 = global i64 42 +@foo2a = alias i64* @foo2 + +; CHECK-LABEL: bar: +define i32 @bar() { +; MEDIUM: addis 3, 2, fooa@toc@ha +; LARGE: addis 3, 2, .LC1@toc@ha + %a = load i32* @fooa + ret i32 %a +} + +; CHECK-LABEL: bar2: +define i64 @bar2() { +; MEDIUM: addis 3, 2, foo2a@toc@ha +; MEDIUM: addi 3, 3, foo2a@toc@l +; LARGE: addis 3, 2, .LC3@toc@ha + %a = load i64* @foo2a + ret i64 %a +} + +; LARGE: .LC1: +; LARGE-NEXT: .tc fooa[TC],fooa + +; LARGE: .LC3: +; LARGE-NEXT: .tc foo2a[TC],foo2a diff --git a/test/CodeGen/PowerPC/cc.ll b/test/CodeGen/PowerPC/cc.ll new file mode 100644 index 0000000..f92121b --- /dev/null +++ b/test/CodeGen/PowerPC/cc.ll @@ -0,0 +1,70 @@ +; RUN: llc -mcpu=pwr7 < %s | FileCheck %s +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i64 @test1(i64 %a, i64 %b) { +entry: + %c = icmp eq i64 %a, %b + br label %foo + +foo: + call { i64, i64 } asm sideeffect "sc", "={r0},={r3},{r0},~{cr0},~{cr1},~{cr2},~{cr3},~{cr4},~{cr5},~{cr6},~{cr7}" (i64 %a) + br i1 %c, label %bar, label %end + +bar: + ret i64 %b + +end: + ret i64 %a + +; CHECK-LABEL: @test1 +; CHECK: mfcr [[REG1:[0-9]+]] +; CHECK-DAG: cmpd +; CHECK-DAG: mfocrf [[REG2:[0-9]+]], +; CHECK-DAG: stw [[REG1]], 8(1) +; CHECK-DAG: stw [[REG2]], -4(1) + +; CHECK: sc +; CHECK: lwz [[REG3:[0-9]+]], -4(1) +; CHECK: mtocrf 128, [[REG3]] + +; CHECK: lwz [[REG4:[0-9]+]], 8(1) +; CHECK-DAG: mtocrf 32, [[REG4]] +; CHECK-DAG: mtocrf 16, [[REG4]] +; CHECK-DAG: mtocrf 8, [[REG4]] +; CHECK: blr +} + +define i64 @test2(i64 %a, i64 %b) { +entry: + %c = icmp eq i64 %a, %b + br label %foo + +foo: + call { i64, i64 } asm sideeffect "sc", "={r0},={r3},{r0},~{cc}" (i64 %a) + br i1 %c, label %bar, label %end + +bar: + ret i64 %b + +end: + ret i64 %a + +; CHECK-LABEL: @test2 +; CHECK: mfcr [[REG1:[0-9]+]] +; CHECK-DAG: cmpd +; CHECK-DAG: mfocrf [[REG2:[0-9]+]], +; CHECK-DAG: stw [[REG1]], 8(1) +; CHECK-DAG: stw [[REG2]], -4(1) + +; CHECK: sc +; CHECK: lwz [[REG3:[0-9]+]], -4(1) +; CHECK: mtocrf 128, [[REG3]] + +; CHECK: lwz [[REG4:[0-9]+]], 8(1) +; CHECK-DAG: mtocrf 32, [[REG4]] +; CHECK-DAG: mtocrf 16, [[REG4]] +; CHECK-DAG: mtocrf 8, [[REG4]] +; CHECK: blr +} + diff --git a/test/CodeGen/PowerPC/ctrloop-le.ll b/test/CodeGen/PowerPC/ctrloop-le.ll index 7b8185e..60b0536 100644 --- a/test/CodeGen/PowerPC/ctrloop-le.ll +++ b/test/CodeGen/PowerPC/ctrloop-le.ll @@ -2,6 +2,9 @@ target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "powerpc64-unknown-linux-gnu" ; RUN: llc < %s -march=ppc64 | FileCheck %s +; XFAIL: * +; SE needs improvement + ; CHECK: test_pos1_ir_sle ; CHECK: bdnz ; a < b diff --git a/test/CodeGen/PowerPC/ctrloop-lt.ll b/test/CodeGen/PowerPC/ctrloop-lt.ll index eaab61a..a9dc42c 100644 --- a/test/CodeGen/PowerPC/ctrloop-lt.ll +++ b/test/CodeGen/PowerPC/ctrloop-lt.ll @@ -2,6 +2,9 @@ target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "powerpc64-unknown-linux-gnu" ; RUN: llc < %s -march=ppc64 | FileCheck %s +; XFAIL: * +; SE needs improvement + ; CHECK: test_pos1_ir_slt ; CHECK: bdnz ; a < b diff --git a/test/CodeGen/PowerPC/ctrloop-sh.ll b/test/CodeGen/PowerPC/ctrloop-sh.ll new file mode 100644 index 0000000..d8e6fc7 --- /dev/null +++ b/test/CodeGen/PowerPC/ctrloop-sh.ll @@ -0,0 +1,72 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "E-m:e-p:32:32-i128:64-n32" +target triple = "powerpc-ellcc-linux" + +; Function Attrs: nounwind +define void @foo1(i128* %a, i128* readonly %b, i128* readonly %c) #0 { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i128* %b, align 16 + %1 = load i128* %c, align 16 + %shl = shl i128 %0, %1 + store i128 %shl, i128* %a, align 16 + %inc = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %inc, 2048 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void + +; CHECK-LABEL: @foo1 +; CHECK-NOT: mtctr +} + +; Function Attrs: nounwind +define void @foo2(i128* %a, i128* readonly %b, i128* readonly %c) #0 { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i128* %b, align 16 + %1 = load i128* %c, align 16 + %shl = ashr i128 %0, %1 + store i128 %shl, i128* %a, align 16 + %inc = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %inc, 2048 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void + +; CHECK-LABEL: @foo2 +; CHECK-NOT: mtctr +} + +; Function Attrs: nounwind +define void @foo3(i128* %a, i128* readonly %b, i128* readonly %c) #0 { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i128* %b, align 16 + %1 = load i128* %c, align 16 + %shl = lshr i128 %0, %1 + store i128 %shl, i128* %a, align 16 + %inc = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %inc, 2048 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void + +; CHECK-LABEL: @foo3 +; CHECK-NOT: mtctr +} + +attributes #0 = { nounwind } + diff --git a/test/CodeGen/PowerPC/dbg.ll b/test/CodeGen/PowerPC/dbg.ll index 0d6c4a6..6beea55 100644 --- a/test/CodeGen/PowerPC/dbg.ll +++ b/test/CodeGen/PowerPC/dbg.ll @@ -28,8 +28,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !10 = metadata !{i32 720911, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] !11 = metadata !{i32 720911, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] !12 = metadata !{i32 720932, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] -!13 = metadata !{metadata !14} -!14 = metadata !{metadata !15, metadata !16} +!13 = metadata !{metadata !15, metadata !16} !15 = metadata !{i32 721153, metadata !5, metadata !"argc", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !16 = metadata !{i32 721153, metadata !5, metadata !"argv", metadata !6, i32 33554433, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !17 = metadata !{i32 1, i32 14, metadata !5, null} diff --git a/test/CodeGen/PowerPC/indexed-load.ll b/test/CodeGen/PowerPC/indexed-load.ll new file mode 100644 index 0000000..59fc058 --- /dev/null +++ b/test/CodeGen/PowerPC/indexed-load.ll @@ -0,0 +1,22 @@ +; RUN: llc < %s | FileCheck %s + +; The SplitIndexingFromLoad tranformation exposed an isel backend bug. This +; testcase used to generate stwx 4, 3, 64. stwx does not have an +; immediate-offset format (note the 64) and it should not be matched. + +target datalayout = "e-m:e-i64:64-n32:64" +target triple = "powerpc64le-unknown-linux-gnu" + +%class.test = type { [64 x i8], [5 x i8] } + +; CHECK-LABEL: f: +; CHECK-NOT: stwx {{[0-9]+}}, {{[0-9]+}}, 64 +define void @f(%class.test* %this) { +entry: + %Subminor.i.i = getelementptr inbounds %class.test* %this, i64 0, i32 1 + %0 = bitcast [5 x i8]* %Subminor.i.i to i40* + %bf.load2.i.i = load i40* %0, align 4 + %bf.clear7.i.i = and i40 %bf.load2.i.i, -8589934592 + store i40 %bf.clear7.i.i, i40* %0, align 4 + ret void +} diff --git a/test/CodeGen/PowerPC/mcm-10.ll b/test/CodeGen/PowerPC/mcm-10.ll index b479559..c3ab747 100644 --- a/test/CodeGen/PowerPC/mcm-10.ll +++ b/test/CodeGen/PowerPC/mcm-10.ll @@ -18,7 +18,8 @@ entry: ; CHECK-LABEL: test_fn_static: ; CHECK: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha -; CHECK: lwz {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: lwa {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK-NOT: extsw ; CHECK: stw {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) ; CHECK: .type [[VAR]],@object ; CHECK: .local [[VAR]] diff --git a/test/CodeGen/PowerPC/mcm-11.ll b/test/CodeGen/PowerPC/mcm-11.ll index c49e865..033045c 100644 --- a/test/CodeGen/PowerPC/mcm-11.ll +++ b/test/CodeGen/PowerPC/mcm-11.ll @@ -18,7 +18,8 @@ entry: ; CHECK-LABEL: test_file_static: ; CHECK: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha -; CHECK: lwz {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: lwa {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK-NOT: extsw ; CHECK: stw {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) ; CHECK: .type [[VAR]],@object ; CHECK: .data diff --git a/test/CodeGen/PowerPC/mcm-obj-2.ll b/test/CodeGen/PowerPC/mcm-obj-2.ll index a6e9855..c42cf0c 100644 --- a/test/CodeGen/PowerPC/mcm-obj-2.ll +++ b/test/CodeGen/PowerPC/mcm-obj-2.ll @@ -22,7 +22,7 @@ entry: ; CHECK: Relocations [ ; CHECK: Section (2) .rela.text { ; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM2:[^ ]+]] -; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM2]] +; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM2]] ; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM2]] @gi = global i32 5, align 4 @@ -39,7 +39,7 @@ entry: ; accessing file-scope variable gi. ; ; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM3:[^ ]+]] -; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM3]] +; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM3]] ; CHECK: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM3]] define double @test_double_const() nounwind { diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r0.ll b/test/CodeGen/PowerPC/named-reg-alloc-r0.ll new file mode 100644 index 0000000..e683f99 --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r0.ll @@ -0,0 +1,15 @@ +; RUN: not llc < %s -mtriple=powerpc-apple-darwin 2>&1 | FileCheck %s +; RUN: not llc < %s -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s +; RUN: not llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i32 @get_reg() nounwind { +entry: +; FIXME: Include an allocatable-specific error message +; CHECK: Invalid register name global variable + %reg = call i32 @llvm.read_register.i32(metadata !0) + ret i32 %reg +} + +declare i32 @llvm.read_register.i32(metadata) nounwind + +!0 = metadata !{metadata !"r0\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r1-64.ll b/test/CodeGen/PowerPC/named-reg-alloc-r1-64.ll new file mode 100644 index 0000000..b047f9f --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r1-64.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=powerpc64-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i64 @get_reg() nounwind { +entry: + %reg = call i64 @llvm.read_register.i64(metadata !0) + ret i64 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 1 + +; CHECK-DARWIN-LABEL: @get_reg +; CHECK-DARWIN: mr r3, r1 +} + +declare i64 @llvm.read_register.i64(metadata) nounwind + +!0 = metadata !{metadata !"r1\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r1.ll b/test/CodeGen/PowerPC/named-reg-alloc-r1.ll new file mode 100644 index 0000000..9d0eb34 --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r1.ll @@ -0,0 +1,20 @@ +; RUN: llc < %s -mtriple=powerpc-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc64-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i32 @get_reg() nounwind { +entry: + %reg = call i32 @llvm.read_register.i32(metadata !0) + ret i32 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 1 + +; CHECK-DARWIN-LABEL: @get_reg +; CHECK-DARWIN: mr r3, r1 +} + +declare i32 @llvm.read_register.i32(metadata) nounwind + +!0 = metadata !{metadata !"r1\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r13-64.ll b/test/CodeGen/PowerPC/named-reg-alloc-r13-64.ll new file mode 100644 index 0000000..df5085b --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r13-64.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=powerpc64-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i64 @get_reg() nounwind { +entry: + %reg = call i64 @llvm.read_register.i64(metadata !0) + ret i64 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 13 + +; CHECK-DARWIN-LABEL: @get_reg +; CHECK-DARWIN: mr r3, r13 +} + +declare i64 @llvm.read_register.i64(metadata) nounwind + +!0 = metadata !{metadata !"r13\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r13.ll b/test/CodeGen/PowerPC/named-reg-alloc-r13.ll new file mode 100644 index 0000000..900ebb2 --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r13.ll @@ -0,0 +1,18 @@ +; RUN: not llc < %s -mtriple=powerpc-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i32 @get_reg() nounwind { +entry: +; FIXME: Include an allocatable-specific error message +; CHECK-DARWIN: Invalid register name global variable + %reg = call i32 @llvm.read_register.i32(metadata !0) + ret i32 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 13 +} + +declare i32 @llvm.read_register.i32(metadata) nounwind + +!0 = metadata !{metadata !"r13\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r2-64.ll b/test/CodeGen/PowerPC/named-reg-alloc-r2-64.ll new file mode 100644 index 0000000..0da33fa --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r2-64.ll @@ -0,0 +1,17 @@ +; RUN: not llc < %s -mtriple=powerpc64-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i64 @get_reg() nounwind { +entry: +; FIXME: Include an allocatable-specific error message +; CHECK-DARWIN: Invalid register name global variable + %reg = call i64 @llvm.read_register.i64(metadata !0) + ret i64 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 2 +} + +declare i64 @llvm.read_register.i64(metadata) nounwind + +!0 = metadata !{metadata !"r2\00"} diff --git a/test/CodeGen/PowerPC/named-reg-alloc-r2.ll b/test/CodeGen/PowerPC/named-reg-alloc-r2.ll new file mode 100644 index 0000000..51e7e3e --- /dev/null +++ b/test/CodeGen/PowerPC/named-reg-alloc-r2.ll @@ -0,0 +1,18 @@ +; RUN: not llc < %s -mtriple=powerpc-apple-darwin 2>&1 | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s + +define i32 @get_reg() nounwind { +entry: +; FIXME: Include an allocatable-specific error message +; CHECK-DARWIN: Invalid register name global variable + %reg = call i32 @llvm.read_register.i32(metadata !0) + ret i32 %reg + +; CHECK-LABEL: @get_reg +; CHECK: mr 3, 2 +} + +declare i32 @llvm.read_register.i32(metadata) nounwind + +!0 = metadata !{metadata !"r2\00"} diff --git a/test/CodeGen/PowerPC/rlwimi-dyn-and.ll b/test/CodeGen/PowerPC/rlwimi-dyn-and.ll new file mode 100644 index 0000000..e02801f --- /dev/null +++ b/test/CodeGen/PowerPC/rlwimi-dyn-and.ll @@ -0,0 +1,48 @@ +; RUN: llc -mcpu=pwr7 < %s | FileCheck %s +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i32 @test1() #0 { +entry: + %conv67.reload = load i32* undef + %const = bitcast i32 65535 to i32 + br label %next + +next: + %shl161 = shl nuw nsw i32 %conv67.reload, 15 + %0 = load i8* undef, align 1 + %conv169 = zext i8 %0 to i32 + %shl170 = shl nuw nsw i32 %conv169, 7 + %const_mat = add i32 %const, -32767 + %shl161.masked = and i32 %shl161, %const_mat + %conv174 = or i32 %shl170, %shl161.masked + ret i32 %conv174 + +; CHECK-LABEL: @test1 +; CHECK-NOT: rlwimi 3, {{[0-9]+}}, 15, 0, 16 +; CHECK: blr +} + +define i32 @test2() #0 { +entry: + %conv67.reload = load i32* undef + %const = bitcast i32 65535 to i32 + br label %next + +next: + %shl161 = shl nuw nsw i32 %conv67.reload, 15 + %0 = load i8* undef, align 1 + %conv169 = zext i8 %0 to i32 + %shl170 = shl nuw nsw i32 %conv169, 7 + %shl161.masked = and i32 %shl161, 32768 + %conv174 = or i32 %shl170, %shl161.masked + ret i32 %conv174 + +; CHECK-LABEL: @test2 +; CHECK: slwi 3, {{[0-9]+}}, 7 +; CHECK: rlwimi 3, {{[0-9]+}}, 15, 16, 16 +; CHECK: blr +} + +attributes #0 = { nounwind } + diff --git a/test/CodeGen/PowerPC/splat-bug.ll b/test/CodeGen/PowerPC/splat-bug.ll new file mode 100644 index 0000000..4b5250b --- /dev/null +++ b/test/CodeGen/PowerPC/splat-bug.ll @@ -0,0 +1,18 @@ +; RUN: llc -mcpu=ppc64 -O0 -fast-isel=false < %s | FileCheck %s + +; Checks for a previous bug where vspltisb/vaddubm were issued in place +; of vsplitsh/vadduhm. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = external global <16 x i8> + +define void @foo() nounwind ssp { +; CHECK: foo: + store <16 x i8> <i8 0, i8 16, i8 0, i8 16, i8 0, i8 16, i8 0, i8 16, i8 0, i8 16, i8 0, i8 16, i8 0, i8 16, i8 0, i8 16>, <16 x i8>* @a +; CHECK: vspltish [[REG:[0-9]+]], 8 +; CHECK: vadduhm {{[0-9]+}}, [[REG]], [[REG]] + ret void +} + |