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