[AArch64][FastISel] Don't fold shifts with UB.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-folded-shift.ll
1 ; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel=1 -verify-machineinstrs < %s | FileCheck %s
2
3 ; Test invalid shift values. This will fall-back to SDAG.
4 ; AND
5 define zeroext i8 @and_rs_i8(i8 signext %a, i8 signext %b) {
6 ; CHECK-LABEL: and_rs_i8
7 ; CHECK:       and [[REG:w[0-9]+]], w0, w8
8 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
9   %1 = shl i8 %b, 8
10   %2 = and i8 %a, %1
11   ret i8 %2
12 }
13
14 define zeroext i16 @and_rs_i16(i16 signext %a, i16 signext %b) {
15 ; CHECK-LABEL: and_rs_i16
16 ; CHECK:       and [[REG:w[0-9]+]], w0, w8
17 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
18   %1 = shl i16 %b, 16
19   %2 = and i16 %a, %1
20   ret i16 %2
21 }
22
23 define i32 @and_rs_i32(i32 %a, i32 %b) {
24 ; CHECK-LABEL: and_rs_i32
25 ; CHECK:       and w0, w0, w8
26   %1 = shl i32 %b, 32
27   %2 = and i32 %a, %1
28   ret i32 %2
29 }
30
31 define i64 @and_rs_i64(i64 %a, i64 %b) {
32 ; CHECK-LABEL: and_rs_i64
33 ; CHECK:       and x0, x0, x8
34   %1 = shl i64 %b, 64
35   %2 = and i64 %a, %1
36   ret i64 %2
37 }
38
39 ; OR
40 define zeroext i8 @or_rs_i8(i8 signext %a, i8 signext %b) {
41 ; CHECK-LABEL: or_rs_i8
42 ; CHECK:       orr [[REG:w[0-9]+]], w0, w8
43 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
44   %1 = shl i8 %b, 8
45   %2 = or i8 %a, %1
46   ret i8 %2
47 }
48
49 define zeroext i16 @or_rs_i16(i16 signext %a, i16 signext %b) {
50 ; CHECK-LABEL: or_rs_i16
51 ; CHECK:       orr [[REG:w[0-9]+]], w0, w8
52 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
53   %1 = shl i16 %b, 16
54   %2 = or i16 %a, %1
55   ret i16 %2
56 }
57
58 define i32 @or_rs_i32(i32 %a, i32 %b) {
59 ; CHECK-LABEL: or_rs_i32
60 ; CHECK:       orr w0, w0, w8
61   %1 = shl i32 %b, 32
62   %2 = or i32 %a, %1
63   ret i32 %2
64 }
65
66 define i64 @or_rs_i64(i64 %a, i64 %b) {
67 ; CHECK-LABEL: or_rs_i64
68 ; CHECK:       orr x0, x0, x8
69   %1 = shl i64 %b, 64
70   %2 = or i64 %a, %1
71   ret i64 %2
72 }
73
74 ; XOR
75 define zeroext i8 @xor_rs_i8(i8 %a, i8 %b) {
76 ; CHECK-LABEL: xor_rs_i8
77 ; CHECK:       eor [[REG:w[0-9]+]], w0, w8
78 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
79   %1 = shl i8 %b, 8
80   %2 = xor i8 %a, %1
81   ret i8 %2
82 }
83
84 define zeroext i16 @xor_rs_i16(i16 %a, i16 %b) {
85 ; CHECK-LABEL: xor_rs_i16
86 ; CHECK:       eor [[REG:w[0-9]+]], w0, w8
87 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
88   %1 = shl i16 %b, 16
89   %2 = xor i16 %a, %1
90   ret i16 %2
91 }
92
93 define i32 @xor_rs_i32(i32 %a, i32 %b) {
94 ; CHECK-LABEL: xor_rs_i32
95 ; CHECK:       eor w0, w0, w8
96   %1 = shl i32 %b, 32
97   %2 = xor i32 %a, %1
98   ret i32 %2
99 }
100
101 define i64 @xor_rs_i64(i64 %a, i64 %b) {
102 ; CHECK-LABEL: xor_rs_i64
103 ; CHECK:       eor x0, x0, x8
104   %1 = shl i64 %b, 64
105   %2 = xor i64 %a, %1
106   ret i64 %2
107 }
108
109 ;ADD
110 define i32 @add_rs_i32(i32 %a, i32 %b) {
111 ; CHECK-LABEL: add_rs_i32
112 ; CHECK:       add w0, w0, w8
113   %1 = shl i32 %b, 32
114   %2 = add i32 %a, %1
115   ret i32 %2
116 }
117
118 define i64 @add_rs_i64(i64 %a, i64 %b) {
119 ; CHECK-LABEL: add_rs_i64
120 ; CHECK:       add x0, x0, x8
121   %1 = shl i64 %b, 64
122   %2 = add i64 %a, %1
123   ret i64 %2
124 }
125