xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fast-isel-folding.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -O0 -fast-isel-abort=1 -verify-machineinstrs < %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test that we don't fold the shift.
4*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_shift_test(i64 %a, i1 %c) {
5*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
6*9880d681SAndroid Build Coastguard Worker  %2 = ashr i64 %1, 3
7*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %bb1, label %bb2
8*9880d681SAndroid Build Coastguard Workerbb1:
9*9880d681SAndroid Build Coastguard Worker  %3 = icmp ult i64 0, %2
10*9880d681SAndroid Build Coastguard Worker  br i1 %3, label %bb2, label %bb3
11*9880d681SAndroid Build Coastguard Workerbb2:
12*9880d681SAndroid Build Coastguard Worker  ret i64 1
13*9880d681SAndroid Build Coastguard Workerbb3:
14*9880d681SAndroid Build Coastguard Worker  ret i64 2
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; Test that we don't fold the sign-extend.
18*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_sext_test1(i32 %a, i1 %c) {
19*9880d681SAndroid Build Coastguard Worker  %1 = sub i32 %a, 8
20*9880d681SAndroid Build Coastguard Worker  %2 = sext i32 %1 to i64
21*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %bb1, label %bb2
22*9880d681SAndroid Build Coastguard Workerbb1:
23*9880d681SAndroid Build Coastguard Worker  %3 = icmp ult i64 0, %2
24*9880d681SAndroid Build Coastguard Worker  br i1 %3, label %bb2, label %bb3
25*9880d681SAndroid Build Coastguard Workerbb2:
26*9880d681SAndroid Build Coastguard Worker  ret i64 1
27*9880d681SAndroid Build Coastguard Workerbb3:
28*9880d681SAndroid Build Coastguard Worker  ret i64 2
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; Test that we don't fold the sign-extend.
32*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_sext_test2(i32 %a, i1 %c) {
33*9880d681SAndroid Build Coastguard Worker  %1 = sub i32 %a, 8
34*9880d681SAndroid Build Coastguard Worker  %2 = sext i32 %1 to i64
35*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %bb1, label %bb2
36*9880d681SAndroid Build Coastguard Workerbb1:
37*9880d681SAndroid Build Coastguard Worker  %3 = shl i64 %2, 4
38*9880d681SAndroid Build Coastguard Worker  ret i64 %3
39*9880d681SAndroid Build Coastguard Workerbb2:
40*9880d681SAndroid Build Coastguard Worker  ret i64 %2
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; Test that we clear the kill flag.
44*9880d681SAndroid Build Coastguard Workerdefine i32 @fold_kill_test(i32 %a) {
45*9880d681SAndroid Build Coastguard Worker  %1 = sub i32 %a, 8
46*9880d681SAndroid Build Coastguard Worker  %2 = shl i32 %1, 3
47*9880d681SAndroid Build Coastguard Worker  %3 = icmp ult i32 0, %2
48*9880d681SAndroid Build Coastguard Worker  br i1 %3, label %bb1, label %bb2
49*9880d681SAndroid Build Coastguard Workerbb1:
50*9880d681SAndroid Build Coastguard Worker  ret i32 %2
51*9880d681SAndroid Build Coastguard Workerbb2:
52*9880d681SAndroid Build Coastguard Worker  %4 = add i32 %2, 4
53*9880d681SAndroid Build Coastguard Worker  ret i32 %4
54*9880d681SAndroid Build Coastguard Worker}
55