xref: /llvm-project/llvm/test/CodeGen/AVR/shift-expand.ll (revision 4e831753b9cf8745e9bf251f775f2399c9ef4138)
16aa9e746SAyke van Laethem; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
26aa9e746SAyke van Laethem; RUN: opt -avr-shift-expand -S %s -o - | FileCheck %s
36aa9e746SAyke van Laethem
46aa9e746SAyke van Laethem; The avr-shift-expand pass expands large shifts with a non-constant shift
56aa9e746SAyke van Laethem; amount to a loop. These loops avoid generating a (non-existing) builtin such
66aa9e746SAyke van Laethem; as __ashlsi3.
76aa9e746SAyke van Laethem
86aa9e746SAyke van Laethemtarget datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
96aa9e746SAyke van Laethemtarget triple = "avr"
106aa9e746SAyke van Laethem
11*4e831753SPatryk Wychowaniecdefine i16 @shl16(i16 %value, i16 %amount) addrspace(1) {
12*4e831753SPatryk Wychowaniec; CHECK-LABEL: @shl16(
13*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[RESULT:%.*]] = shl i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
14*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i16 [[RESULT]]
15*4e831753SPatryk Wychowaniec;
16*4e831753SPatryk Wychowaniec  %result = shl i16 %value, %amount
17*4e831753SPatryk Wychowaniec  ret i16 %result
18*4e831753SPatryk Wychowaniec}
19*4e831753SPatryk Wychowaniec
20*4e831753SPatryk Wychowaniecdefine i32 @shl32(i32 %value, i32 %amount) addrspace(1) {
21*4e831753SPatryk Wychowaniec; CHECK-LABEL: @shl32(
226aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
236aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
246aa9e746SAyke van Laethem; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
256aa9e746SAyke van Laethem; CHECK:       shift.loop:
266aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
276aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
286aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
296aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP6]] = shl i32 [[TMP4]], 1
306aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
316aa9e746SAyke van Laethem; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
326aa9e746SAyke van Laethem; CHECK:       shift.done:
336aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
346aa9e746SAyke van Laethem; CHECK-NEXT:    ret i32 [[TMP8]]
356aa9e746SAyke van Laethem;
366aa9e746SAyke van Laethem  %result = shl i32 %value, %amount
376aa9e746SAyke van Laethem  ret i32 %result
386aa9e746SAyke van Laethem}
396aa9e746SAyke van Laethem
40*4e831753SPatryk Wychowaniecdefine i40 @shl40(i40 %value, i40 %amount) addrspace(1) {
41*4e831753SPatryk Wychowaniec; CHECK-LABEL: @shl40(
42*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8
43*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
44*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
45*4e831753SPatryk Wychowaniec; CHECK:       shift.loop:
46*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
47*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
48*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
49*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP6]] = shl i40 [[TMP4]], 1
50*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
51*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
52*4e831753SPatryk Wychowaniec; CHECK:       shift.done:
53*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
54*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i40 [[TMP8]]
55*4e831753SPatryk Wychowaniec;
56*4e831753SPatryk Wychowaniec  %result = shl i40 %value, %amount
57*4e831753SPatryk Wychowaniec  ret i40 %result
58*4e831753SPatryk Wychowaniec}
59*4e831753SPatryk Wychowaniec
60*4e831753SPatryk Wychowaniec; ------------------------------------------------------------------------------
61*4e831753SPatryk Wychowaniec
62*4e831753SPatryk Wychowaniecdefine i16 @lshr16(i16 %value, i16 %amount) addrspace(1) {
63*4e831753SPatryk Wychowaniec; CHECK-LABEL: @lshr16(
64*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[RESULT:%.*]] = lshr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
65*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i16 [[RESULT]]
66*4e831753SPatryk Wychowaniec;
67*4e831753SPatryk Wychowaniec  %result = lshr i16 %value, %amount
68*4e831753SPatryk Wychowaniec  ret i16 %result
69*4e831753SPatryk Wychowaniec}
70*4e831753SPatryk Wychowaniec
71*4e831753SPatryk Wychowaniecdefine i32 @lshr32(i32 %value, i32 %amount) addrspace(1) {
72*4e831753SPatryk Wychowaniec; CHECK-LABEL: @lshr32(
736aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
746aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
756aa9e746SAyke van Laethem; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
766aa9e746SAyke van Laethem; CHECK:       shift.loop:
776aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
786aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
796aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
806aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP6]] = lshr i32 [[TMP4]], 1
816aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
826aa9e746SAyke van Laethem; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
836aa9e746SAyke van Laethem; CHECK:       shift.done:
846aa9e746SAyke van Laethem; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
856aa9e746SAyke van Laethem; CHECK-NEXT:    ret i32 [[TMP8]]
866aa9e746SAyke van Laethem;
876aa9e746SAyke van Laethem  %result = lshr i32 %value, %amount
886aa9e746SAyke van Laethem  ret i32 %result
896aa9e746SAyke van Laethem}
906aa9e746SAyke van Laethem
91*4e831753SPatryk Wychowaniecdefine i40 @lshr40(i40 %value, i40 %amount) addrspace(1) {
92*4e831753SPatryk Wychowaniec; CHECK-LABEL: @lshr40(
93*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8
94*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
95*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
966aa9e746SAyke van Laethem; CHECK:       shift.loop:
97*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
98*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
99*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
100*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP6]] = lshr i40 [[TMP4]], 1
101*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
102*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
1036aa9e746SAyke van Laethem; CHECK:       shift.done:
104*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
105*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i40 [[TMP8]]
1066aa9e746SAyke van Laethem;
107*4e831753SPatryk Wychowaniec  %result = lshr i40 %value, %amount
1086aa9e746SAyke van Laethem  ret i40 %result
1096aa9e746SAyke van Laethem}
1106aa9e746SAyke van Laethem
111*4e831753SPatryk Wychowaniec; ------------------------------------------------------------------------------
112*4e831753SPatryk Wychowaniec
113*4e831753SPatryk Wychowaniecdefine i16 @ashr16(i16 %value, i16 %amount) addrspace(1) {
114*4e831753SPatryk Wychowaniec; CHECK-LABEL: @ashr16(
115*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[RESULT:%.*]] = ashr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
116*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i16 [[RESULT]]
1176aa9e746SAyke van Laethem;
118*4e831753SPatryk Wychowaniec  %result = ashr i16 %value, %amount
119*4e831753SPatryk Wychowaniec  ret i16 %result
120*4e831753SPatryk Wychowaniec}
121*4e831753SPatryk Wychowaniec
122*4e831753SPatryk Wychowaniecdefine i32 @ashr32(i32 %value, i32 %amount) addrspace(1) {
123*4e831753SPatryk Wychowaniec; CHECK-LABEL: @ashr32(
124*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
125*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
126*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
127*4e831753SPatryk Wychowaniec; CHECK:       shift.loop:
128*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
129*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
130*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
131*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP6]] = ashr i32 [[TMP4]], 1
132*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
133*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
134*4e831753SPatryk Wychowaniec; CHECK:       shift.done:
135*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
136*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i32 [[TMP8]]
137*4e831753SPatryk Wychowaniec;
138*4e831753SPatryk Wychowaniec  %result = ashr i32 %value, %amount
139*4e831753SPatryk Wychowaniec  ret i32 %result
140*4e831753SPatryk Wychowaniec}
141*4e831753SPatryk Wychowaniec
142*4e831753SPatryk Wychowaniecdefine i40 @ashr40(i40 %value, i40 %amount) addrspace(1) {
143*4e831753SPatryk Wychowaniec; CHECK-LABEL: @ashr40(
144*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8
145*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
146*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
147*4e831753SPatryk Wychowaniec; CHECK:       shift.loop:
148*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
149*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
150*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1
151*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP6]] = ashr i40 [[TMP4]], 1
152*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
153*4e831753SPatryk Wychowaniec; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
154*4e831753SPatryk Wychowaniec; CHECK:       shift.done:
155*4e831753SPatryk Wychowaniec; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
156*4e831753SPatryk Wychowaniec; CHECK-NEXT:    ret i40 [[TMP8]]
157*4e831753SPatryk Wychowaniec;
158*4e831753SPatryk Wychowaniec  %result = ashr i40 %value, %amount
159*4e831753SPatryk Wychowaniec  ret i40 %result
1606aa9e746SAyke van Laethem}
161