summaryrefslogtreecommitdiff
path: root/test/CodeGen/PowerPC/rlwimi-and-or-bits.ll
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2015-09-05 00:02:59 +0000
committerHal Finkel <hfinkel@anl.gov>2015-09-05 00:02:59 +0000
commit6d7a4a2886266317f7aae6e3c806719de539e517 (patch)
tree245d02a76bc57a58de629041ba9bfe27db0012d0 /test/CodeGen/PowerPC/rlwimi-and-or-bits.ll
parentb1b15ace485583be8309cee38f94fb3f54f3a990 (diff)
[PowerPC] Fix and(or(x, c1), c2) -> rlwimi generation
PPCISelDAGToDAG has a transformation that generates a rlwimi instruction from an input pattern that looks like this: and(or(x, c1), c2) but the associated logic does not work if there are bits that are 1 in c1 but 0 in c2 (these are normally canonicalized away, but that can't happen if the 'or' has other users. Make sure we abort the transformation if such bits are discovered. Fixes PR24704. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246900 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/PowerPC/rlwimi-and-or-bits.ll')
-rw-r--r--test/CodeGen/PowerPC/rlwimi-and-or-bits.ll27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/CodeGen/PowerPC/rlwimi-and-or-bits.ll b/test/CodeGen/PowerPC/rlwimi-and-or-bits.ll
new file mode 100644
index 00000000000..a74bc727396
--- /dev/null
+++ b/test/CodeGen/PowerPC/rlwimi-and-or-bits.ll
@@ -0,0 +1,27 @@
+; RUN: llc < %s | FileCheck %s
+target datalayout = "E-m:e-i64:64-n32:64"
+target triple = "powerpc64-unknown-linux-gnu"
+
+@m = external global i32, align 4
+
+; Function Attrs: nounwind
+define signext i32 @main() #0 {
+entry:
+
+; CHECK-LABEL: @main
+; CHECK-NOT: rlwimi
+; CHECK: andi
+
+ %0 = load i32, i32* @m, align 4
+ %or = or i32 %0, 250
+ store i32 %or, i32* @m, align 4
+ %and = and i32 %or, 249
+ %sub.i = sub i32 %and, 0
+ %sext = shl i32 %sub.i, 24
+ %conv = ashr exact i32 %sext, 24
+ ret i32 %conv
+}
+
+attributes #0 = { nounwind "target-cpu"="pwr7" }
+attributes #1 = { nounwind }
+