# Make sure we do not create illegal packet. # RUN: llc -march=hexagon -run-pass global-sched -debug %s -o - | FileCheck %s # REQUIRES: asserts # CHECK-NOT: Non newifiable in this bundle --- | ; ModuleID = 'test.ll' source_filename = "test.c" target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" target triple = "hexagon-unknown-unknown-elf" %struct.S = type { [2 x i64], [128 x i8] } ; Function Attrs: nounwind define dso_local i32 @f0(%struct.S* %ctx, i8* nocapture readnone %input, i32 %ilen) local_unnamed_addr #0 { entry: %cmp = icmp eq i32 %ilen, 0 br i1 %cmp, label %cleanup, label %if.end if.end: ; preds = %entry %cgep58 = bitcast %struct.S* %ctx to %struct.S* %cgep5259 = bitcast %struct.S* %cgep58 to i64* %0 = load i64, i64* %cgep5259, align 8 %1 = trunc i64 %0 to i32 %conv = and i32 %1, 127 %conv1 = sext i32 %ilen to i64 %2 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %0, i64 %conv1) %math = extractvalue { i64, i1 } %2, 0 %ov = extractvalue { i64, i1 } %2, 1 %cgep5360 = bitcast %struct.S* %cgep58 to i64* store i64 %math, i64* %cgep5360, align 8 br i1 %ov, label %if.then9, label %if.end12 if.then9: ; preds = %if.end %3 = bitcast %struct.S* %ctx to %struct.S* %cgep4 = bitcast %struct.S* %3 to %struct.S* %cgep2 = getelementptr inbounds %struct.S, %struct.S* %cgep4, i32 0, i32 0, i32 1 %4 = load i64, i64* %cgep2, align 8 %inc = add i64 %4, 1 %cgep3 = getelementptr inbounds %struct.S, %struct.S* %cgep4, i32 0, i32 0, i32 1 store i64 %inc, i64* %cgep3, align 8 br label %if.end12 if.end12: ; preds = %if.then9, %if.end %tobool = icmp ne i32 %conv, 0 %cmp13 = icmp sle i32 %conv, %ilen %or.cond = and i1 %tobool, %cmp13 br i1 %or.cond, label %if.then15, label %if.end20 if.then15: ; preds = %if.end12 %call = tail call i32 @f1(%struct.S* nonnull %ctx) #3 %cmp16 = icmp eq i32 %call, 0 br i1 %cmp16, label %if.end19, label %cleanup if.end19: ; preds = %if.then15 %sub = sub nsw i32 %ilen, %conv br label %if.end20 if.end20: ; preds = %if.end19, %if.end12 %ilen.addr.0 = phi i32 [ %sub, %if.end19 ], [ %ilen, %if.end12 ] %cmp2148 = icmp sgt i32 %ilen.addr.0, 127 br i1 %cmp2148, label %while.body, label %cleanup while.cond: ; preds = %while.body %cmp21 = icmp sgt i32 %sub28, 127 br i1 %cmp21, label %while.body, label %cleanup while.body: ; preds = %if.end20, %while.cond %ilen.addr.149 = phi i32 [ %sub28, %while.cond ], [ %ilen.addr.0, %if.end20 ] %call23 = tail call i32 @f1(%struct.S* %ctx) #3 %cmp24 = icmp eq i32 %call23, 0 %sub28 = add nsw i32 %ilen.addr.149, -128 br i1 %cmp24, label %while.cond, label %cleanup cleanup: ; preds = %while.body, %while.cond, %if.end20, %if.then15, %entry %retval.0 = phi i32 [ 0, %entry ], [ %call, %if.then15 ], [ 0, %if.end20 ], [ 0, %while.cond ], [ %call23, %while.body ] ret i32 %retval.0 } declare dso_local i32 @f1(%struct.S*) local_unnamed_addr ; Function Attrs: nounwind readnone speculatable willreturn declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) ; Function Attrs: nounwind declare void @llvm.stackprotector(i8*, i8**) attributes #0 = { nounwind "target-cpu"="hexagonv71" "target-features"="+v67,-long-calls,-small-data" "use-soft-float"="false" } ... --- name: f0 alignment: 16 exposesReturnsTwice: false legalized: false regBankSelected: false selected: false failedISel: false tracksRegLiveness: true hasWinCFI: false registers: [] liveins: - { reg: '$r0', virtual-reg: '' } - { reg: '$r2', virtual-reg: '' } frameInfo: isFrameAddressTaken: false isReturnAddressTaken: false hasStackMap: false hasPatchPoint: false stackSize: 16 offsetAdjustment: 0 maxAlignment: 1 adjustsStack: true hasCalls: true stackProtector: '' maxCallFrameSize: 0 cvBytesOfCalleeSavedRegisters: 0 hasOpaqueSPAdjustment: false hasVAStart: false hasMustTailInVarArgFunc: false localFrameSize: 0 savePoint: [] restorePoint: [] fixedStack: - { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 8, stack-id: default, callee-saved-register: '$d8', callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } - { id: 1, type: spill-slot, offset: -8, size: 8, alignment: 8, stack-id: default, callee-saved-register: '$d9', callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } stack: [] callSites: [] constants: [] machineFunctionInfo: {} body: | bb.0.entry: successors: %bb.11(0x30000000), %bb.1(0x50000000) liveins: $r0:0x00000001, $r2:0x00000001, $d8, $d9, $d8, $d9, $r16, $r17, $r18, $r19 frame-setup BUNDLE implicit-def $r29, implicit-def $r30, implicit-def $p0, implicit killed $r29, implicit killed $framekey, implicit killed $framelimit, implicit $r30, implicit killed $r31, implicit $r2, implicit killed $d8 { $r29 = frame-setup S2_allocframe killed $r29, 16, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit $r30, implicit killed $r31 :: (store 4 into stack) renamable $p0 = C2_cmpeqi $r2, 0 S2_storerd_io internal $r29, -16, killed $d8 :: (store 8 into %fixed-stack.0) } BUNDLE implicit-def $pc, implicit killed $r29, implicit killed $d9, implicit $p0 { S2_storerd_io killed $r29, 0, killed $d9 :: (store 8 into %fixed-stack.1) J2_jumpt $p0, %bb.11, implicit-def $pc } bb.1.if.end: successors: %bb.2(0x40000000), %bb.3(0x40000000) liveins: $p0, $r0, $r2 BUNDLE implicit-def $r18, implicit-def $r16, implicit-def $d0, implicit-def $r0, implicit-def $r1, implicit-def $p0, implicit killed $r0, implicit $r2, implicit undef $p0 { $r18 = A2_tfr $r0 $r16 = A2_tfr $r2 renamable $d0 = L2_loadrd_io killed $r0, 0 :: (load 8 from %ir.cgep5259) $p0 = C2_andn undef $p0, undef $p0 } renamable $r17 = S2_asr_i_r killed $r2, 31 BUNDLE implicit-def $d1, implicit-def $r2, implicit-def $r3, implicit-def $p0, implicit-def $r17, implicit $d0, implicit $d8, implicit $p0, implicit killed $r0 { renamable $d1, renamable $p0 = A4_addp_c renamable $d0, renamable $d8, renamable $p0 renamable $r17 = A2_andir killed renamable $r0, 127 } BUNDLE implicit-def dead $pc, implicit $r18, implicit killed $d1, implicit $p0 { S2_storerd_io renamable $r18, 0, killed renamable $d1 :: (store 8 into %ir.cgep5360) J2_jumpf renamable $p0, %bb.3, implicit-def dead $pc } bb.2.if.then9: successors: %bb.3(0x80000000) liveins: $r16, $r17, $r18 BUNDLE implicit-def $d0, implicit-def $r0, implicit-def $r1, implicit-def $d1, implicit-def $r2, implicit-def $r3, implicit $r18 { renamable $d0 = L2_loadrd_io renamable $r18, 8 :: (load 8 from %ir.cgep2) renamable $d1 = A2_tfrpi 1 } renamable $d0 = A2_addp killed renamable $d0, killed renamable $d1 S2_storerd_io renamable $r18, 8, killed renamable $d0 :: (store 8 into %ir.cgep3) bb.3.if.end12: successors: %bb.4(0x60000000), %bb.7(0x20000000) liveins: $r16, $r17, $r18 BUNDLE implicit-def dead $p0, implicit-def $pc, implicit $r17 { renamable $p0 = C2_cmpeqi renamable $r17, 0 J2_jumptnew internal $p0, %bb.7, implicit-def $pc } bb.4.if.end12: successors: %bb.5(0x55555555), %bb.7(0x2aaaaaab) liveins: $r16, $r17, $r18 BUNDLE implicit-def dead $p0, implicit-def $pc, implicit $r17, implicit $r16 { renamable $p0 = C2_cmpgt renamable $r17, renamable $r16 J2_jumptnew internal $p0, %bb.7, implicit-def $pc } bb.5.if.then15: successors: %bb.7(0x30000000), %bb.13(0x50000000) liveins: $r16, $r17, $r18 BUNDLE implicit-def $r0, implicit-def $pc, implicit-def $r31, implicit-def $r29, implicit $r18, implicit $r29 { $r0 = A2_tfr $r18 J2_call @f1, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit $r29, implicit internal $r0, implicit-def $r29, implicit-def $r0 } BUNDLE implicit-def $r16, implicit-def dead $p0, implicit-def dead $pc, implicit killed $r16, implicit killed $r17, implicit $r0 { renamable $r16 = nsw A2_sub killed renamable $r16, killed renamable $r17 renamable $p0 = C2_cmpeqi renamable $r0, 0 J2_jumpfnewpt internal renamable $p0, %bb.13, implicit-def dead $pc } bb.7.if.end20: successors: %bb.8(0x40000000), %bb.13(0x40000000) liveins: $r16, $r18 BUNDLE implicit-def $r0, implicit-def dead $p0, implicit-def $pc, implicit $r16 { renamable $r0 = A2_tfrsi 0 renamable $p0 = C2_cmpgti renamable $r16, 127 J2_jumpfnewpt internal $p0, %bb.13, implicit-def $pc } bb.8.while.body (align 16): successors: %bb.9(0x7c000000), %bb.13(0x04000000) liveins: $r16, $r18 BUNDLE implicit-def $r0, implicit-def $pc, implicit-def $r31, implicit-def $r29, implicit $r18, implicit $r29 { $r0 = A2_tfr $r18 J2_call @f1, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit $r29, implicit internal $r0, implicit-def $r29, implicit-def $r0 } BUNDLE implicit-def $r16, implicit-def dead $p0, implicit-def $pc, implicit killed $r16, implicit $r0 { renamable $r16 = nsw A2_addi killed renamable $r16, -128 renamable $p0 = C2_cmpeqi renamable $r0, 0 J2_jumpfnew internal $p0, %bb.13, implicit-def $pc } bb.9.while.cond: successors: %bb.8(0x7c000000), %bb.10(0x04000000) liveins: $r16, $r18, $r16 BUNDLE implicit-def dead $p0, implicit-def $pc, implicit $r16 { renamable $p0 = C2_cmpgti renamable $r16, 127 J2_jumptnewpt internal renamable $p0, %bb.8, implicit-def $pc } bb.10: successors: %bb.13(0x80000000) BUNDLE implicit-def $r0, implicit-def $pc { renamable $r0 = A2_tfrsi 0 J2_jump %bb.13, implicit-def $pc } bb.11: successors: %bb.13(0x80000000) renamable $r0 = A2_tfrsi 0 bb.13.cleanup: liveins: $r0 BUNDLE implicit-def $d8, implicit-def $r16, implicit-def $r17, implicit-def $d9, implicit-def $r18, implicit-def $r19, implicit killed $r29 { $d8 = L2_loadrd_io $r29, 8 :: (load 8 from %fixed-stack.0) $d9 = L2_loadrd_io killed $r29, 0 :: (load 8 from %fixed-stack.1) } $d15 = L4_return killed $r30, implicit-def $pc, implicit-def $r29, implicit killed $framekey, implicit-def $pc, implicit killed $r0, implicit killed $d8, implicit killed $d9 ...