xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/or-combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_consts(i32 %in) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_consts:
5*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfxil
6*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and
7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: orr
8*9880d681SAndroid Build Coastguard Worker; CHECK: ret
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker  %lo = and i32 %in, 65535
11*9880d681SAndroid Build Coastguard Worker  %hi = and i32 %in, -65536
12*9880d681SAndroid Build Coastguard Worker  %res = or i32 %lo, %hi
13*9880d681SAndroid Build Coastguard Worker  ret i32 %res
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @test_generic(i32 %in, i32 %mask1, i32 %mask2) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_generic:
18*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[FULL_MASK:w[0-9]+]], w1, w2
19*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, [[FULL_MASK]]
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  %lo = and i32 %in, %mask1
22*9880d681SAndroid Build Coastguard Worker  %hi = and i32 %in, %mask2
23*9880d681SAndroid Build Coastguard Worker  %res = or i32 %lo, %hi
24*9880d681SAndroid Build Coastguard Worker  ret i32 %res
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; In this case the transformation isn't profitable, since %lo and %hi
28*9880d681SAndroid Build Coastguard Worker; are used more than once.
29*9880d681SAndroid Build Coastguard Workerdefine [3 x i32] @test_reuse(i32 %in, i32 %mask1, i32 %mask2) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_reuse:
31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and w1, w0, w1
32*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and w2, w0, w2
33*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr w0, w1, w2
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker  %lo = and i32 %in, %mask1
36*9880d681SAndroid Build Coastguard Worker  %hi = and i32 %in, %mask2
37*9880d681SAndroid Build Coastguard Worker  %recombine = or i32 %lo, %hi
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  %res.tmp0 = insertvalue [3 x i32] undef, i32 %recombine, 0
40*9880d681SAndroid Build Coastguard Worker  %res.tmp1 = insertvalue [3 x i32] %res.tmp0, i32 %lo, 1
41*9880d681SAndroid Build Coastguard Worker  %res = insertvalue [3 x i32] %res.tmp1, i32 %hi, 2
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  ret [3 x i32] %res
44*9880d681SAndroid Build Coastguard Worker}
45