@@ -3688,15 +3688,14 @@ define ptr @test_gep_gep_dont_crash(ptr %p, i64 %a1, i64 %a2) {
3688
3688
; RV64ZBA-LABEL: test_gep_gep_dont_crash:
3689
3689
; RV64ZBA: # %bb.0:
3690
3690
; RV64ZBA-NEXT: srliw a2, a2, 6
3691
- ; RV64ZBA-NEXT: add a1 , a2, a1
3691
+ ; RV64ZBA-NEXT: sh3add a0 , a2, a0
3692
3692
; RV64ZBA-NEXT: sh3add a0, a1, a0
3693
3693
; RV64ZBA-NEXT: ret
3694
3694
;
3695
3695
; RV64XANDESPERF-LABEL: test_gep_gep_dont_crash:
3696
3696
; RV64XANDESPERF: # %bb.0:
3697
3697
; RV64XANDESPERF-NEXT: srliw a2, a2, 6
3698
- ; RV64XANDESPERF-NEXT: slli a2, a2, 3
3699
- ; RV64XANDESPERF-NEXT: add a0, a0, a2
3698
+ ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a2
3700
3699
; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a1
3701
3700
; RV64XANDESPERF-NEXT: ret
3702
3701
%lshr = lshr i64 %a2 , 6
@@ -4276,52 +4275,104 @@ entry:
4276
4275
}
4277
4276
4278
4277
define ptr @shl_and_gep (ptr %p , i64 %i ) {
4279
- ; CHECK-LABEL: shl_and_gep:
4280
- ; CHECK: # %bb.0:
4281
- ; CHECK-NEXT: srliw a1, a1, 2
4282
- ; CHECK-NEXT: slli a1, a1, 3
4283
- ; CHECK-NEXT: add a0, a0, a1
4284
- ; CHECK-NEXT: ret
4278
+ ; RV64I-LABEL: shl_and_gep:
4279
+ ; RV64I: # %bb.0:
4280
+ ; RV64I-NEXT: srliw a1, a1, 2
4281
+ ; RV64I-NEXT: slli a1, a1, 3
4282
+ ; RV64I-NEXT: add a0, a0, a1
4283
+ ; RV64I-NEXT: ret
4284
+ ;
4285
+ ; RV64ZBA-LABEL: shl_and_gep:
4286
+ ; RV64ZBA: # %bb.0:
4287
+ ; RV64ZBA-NEXT: srliw a1, a1, 2
4288
+ ; RV64ZBA-NEXT: sh3add a0, a1, a0
4289
+ ; RV64ZBA-NEXT: ret
4290
+ ;
4291
+ ; RV64XANDESPERF-LABEL: shl_and_gep:
4292
+ ; RV64XANDESPERF: # %bb.0:
4293
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 2
4294
+ ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a1
4295
+ ; RV64XANDESPERF-NEXT: ret
4285
4296
%shl = shl i64 %i , 1
4286
4297
%and = and i64 %shl , 8589934584
4287
4298
%gep = getelementptr i8 , ptr %p , i64 %and
4288
4299
ret ptr %gep
4289
4300
}
4290
4301
4291
4302
define ptr @shr_and_gep (ptr %p , i64 %i ) {
4292
- ; CHECK-LABEL: shr_and_gep:
4293
- ; CHECK: # %bb.0:
4294
- ; CHECK-NEXT: srliw a1, a1, 6
4295
- ; CHECK-NEXT: slli a1, a1, 1
4296
- ; CHECK-NEXT: add a0, a0, a1
4297
- ; CHECK-NEXT: ret
4303
+ ; RV64I-LABEL: shr_and_gep:
4304
+ ; RV64I: # %bb.0:
4305
+ ; RV64I-NEXT: srliw a1, a1, 6
4306
+ ; RV64I-NEXT: slli a1, a1, 1
4307
+ ; RV64I-NEXT: add a0, a0, a1
4308
+ ; RV64I-NEXT: ret
4309
+ ;
4310
+ ; RV64ZBA-LABEL: shr_and_gep:
4311
+ ; RV64ZBA: # %bb.0:
4312
+ ; RV64ZBA-NEXT: srliw a1, a1, 6
4313
+ ; RV64ZBA-NEXT: sh1add a0, a1, a0
4314
+ ; RV64ZBA-NEXT: ret
4315
+ ;
4316
+ ; RV64XANDESPERF-LABEL: shr_and_gep:
4317
+ ; RV64XANDESPERF: # %bb.0:
4318
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 6
4319
+ ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a1
4320
+ ; RV64XANDESPERF-NEXT: ret
4298
4321
%lshr = lshr i64 %i , 6
4299
4322
%and = and i64 %lshr , 67108863
4300
4323
%gep = getelementptr i16 , ptr %p , i64 %and
4301
4324
ret ptr %gep
4302
4325
}
4303
4326
4304
4327
define ptr @slt_select_gep (ptr %p , i32 %y ) {
4305
- ; CHECK-LABEL: slt_select_gep:
4306
- ; CHECK: # %bb.0:
4307
- ; CHECK-NEXT: srli a1, a1, 28
4308
- ; CHECK-NEXT: andi a1, a1, 8
4309
- ; CHECK-NEXT: add a0, a0, a1
4310
- ; CHECK-NEXT: addi a0, a0, 16
4311
- ; CHECK-NEXT: ret
4328
+ ; RV64I-LABEL: slt_select_gep:
4329
+ ; RV64I: # %bb.0:
4330
+ ; RV64I-NEXT: srli a1, a1, 28
4331
+ ; RV64I-NEXT: andi a1, a1, 8
4332
+ ; RV64I-NEXT: add a0, a0, a1
4333
+ ; RV64I-NEXT: addi a0, a0, 16
4334
+ ; RV64I-NEXT: ret
4335
+ ;
4336
+ ; RV64ZBA-LABEL: slt_select_gep:
4337
+ ; RV64ZBA: # %bb.0:
4338
+ ; RV64ZBA-NEXT: srliw a1, a1, 31
4339
+ ; RV64ZBA-NEXT: sh3add a0, a1, a0
4340
+ ; RV64ZBA-NEXT: addi a0, a0, 16
4341
+ ; RV64ZBA-NEXT: ret
4342
+ ;
4343
+ ; RV64XANDESPERF-LABEL: slt_select_gep:
4344
+ ; RV64XANDESPERF: # %bb.0:
4345
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 31
4346
+ ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a1
4347
+ ; RV64XANDESPERF-NEXT: addi a0, a0, 16
4348
+ ; RV64XANDESPERF-NEXT: ret
4312
4349
%cmp = icmp slt i32 %y , 0
4313
4350
%select = select i1 %cmp , i64 24 , i64 16
4314
4351
%gep = getelementptr i8 , ptr %p , i64 %select
4315
4352
ret ptr %gep
4316
4353
}
4317
4354
4318
4355
define i32 @shr_and_add (i32 %x , i32 %y ) {
4319
- ; CHECK-LABEL: shr_and_add:
4320
- ; CHECK: # %bb.0:
4321
- ; CHECK-NEXT: srliw a1, a1, 9
4322
- ; CHECK-NEXT: slli a1, a1, 2
4323
- ; CHECK-NEXT: addw a0, a0, a1
4324
- ; CHECK-NEXT: ret
4356
+ ; RV64I-LABEL: shr_and_add:
4357
+ ; RV64I: # %bb.0:
4358
+ ; RV64I-NEXT: srliw a1, a1, 9
4359
+ ; RV64I-NEXT: slli a1, a1, 2
4360
+ ; RV64I-NEXT: addw a0, a0, a1
4361
+ ; RV64I-NEXT: ret
4362
+ ;
4363
+ ; RV64ZBA-LABEL: shr_and_add:
4364
+ ; RV64ZBA: # %bb.0:
4365
+ ; RV64ZBA-NEXT: srliw a1, a1, 9
4366
+ ; RV64ZBA-NEXT: sh2add a0, a1, a0
4367
+ ; RV64ZBA-NEXT: sext.w a0, a0
4368
+ ; RV64ZBA-NEXT: ret
4369
+ ;
4370
+ ; RV64XANDESPERF-LABEL: shr_and_add:
4371
+ ; RV64XANDESPERF: # %bb.0:
4372
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 9
4373
+ ; RV64XANDESPERF-NEXT: nds.lea.w a0, a0, a1
4374
+ ; RV64XANDESPERF-NEXT: sext.w a0, a0
4375
+ ; RV64XANDESPERF-NEXT: ret
4325
4376
%lshr = lshr i32 %y , 7
4326
4377
%and = and i32 %lshr , 33554428
4327
4378
%add = add i32 %x , %and
@@ -4344,19 +4395,17 @@ define ptr @udiv1280_gep(ptr %p, i16 zeroext %i) {
4344
4395
; RV64ZBA-NEXT: lui a2, 13
4345
4396
; RV64ZBA-NEXT: addi a2, a2, -819
4346
4397
; RV64ZBA-NEXT: mul a1, a1, a2
4347
- ; RV64ZBA-NEXT: srli a1, a1, 23
4348
- ; RV64ZBA-NEXT: srliw a1, a1, 3
4349
- ; RV64ZBA-NEXT: sh3add.uw a0, a1, a0
4398
+ ; RV64ZBA-NEXT: srliw a1, a1, 26
4399
+ ; RV64ZBA-NEXT: sh3add a0, a1, a0
4350
4400
; RV64ZBA-NEXT: ret
4351
4401
;
4352
4402
; RV64XANDESPERF-LABEL: udiv1280_gep:
4353
4403
; RV64XANDESPERF: # %bb.0:
4354
4404
; RV64XANDESPERF-NEXT: lui a2, 13
4355
4405
; RV64XANDESPERF-NEXT: addi a2, a2, -819
4356
4406
; RV64XANDESPERF-NEXT: mul a1, a1, a2
4357
- ; RV64XANDESPERF-NEXT: srli a1, a1, 23
4358
- ; RV64XANDESPERF-NEXT: srliw a1, a1, 3
4359
- ; RV64XANDESPERF-NEXT: nds.lea.d.ze a0, a0, a1
4407
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 26
4408
+ ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a1
4360
4409
; RV64XANDESPERF-NEXT: ret
4361
4410
%udiv = udiv i16 %i , 1280
4362
4411
%idx.ext = zext nneg i16 %udiv to i64
0 commit comments