brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · 6ee4309 Raw
248 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-- -verify-machineinstrs < %s | FileCheck %s3 4; A test for asm-goto output5 6define i32 @test1(i32 %x) {7; CHECK-LABEL: test1:8; CHECK:       # %bb.0: # %entry9; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax10; CHECK-NEXT:    addl $4, %eax11; CHECK-NEXT:    #APP12; CHECK-NEXT:    xorl %eax, %eax13; CHECK-NEXT:    jmp .LBB0_214; CHECK-NEXT:    #NO_APP15; CHECK-NEXT:  # %bb.1: # %normal16; CHECK-NEXT:    retl17; CHECK-NEXT:  .LBB0_2: # Inline asm indirect target18; CHECK-NEXT:    # %abnormal19; CHECK-NEXT:    # Label of block must be emitted20; CHECK-NEXT:    movl $1, %eax21; CHECK-NEXT:    retl22entry:23  %add = add nsw i32 %x, 424  %ret = callbr i32 asm "xorl $1, $0; jmp ${2:l}", "=r,r,!i"(i32 %add)25          to label %normal [label %abnormal]26 27normal:28  ret i32 %ret29 30abnormal:31  ret i32 132}33 34define i32 @test2(i32 %out1, i32 %out2) nounwind {35; CHECK-LABEL: test2:36; CHECK:       # %bb.0: # %entry37; CHECK-NEXT:    pushl %edi38; CHECK-NEXT:    pushl %esi39; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %edi40; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi41; CHECK-NEXT:    cmpl %edi, %esi42; CHECK-NEXT:    jge .LBB1_343; CHECK-NEXT:  # %bb.1: # %if.then44; CHECK-NEXT:    #APP45; CHECK-NEXT:    testl %esi, %esi46; CHECK-NEXT:    testl %edi, %esi47; CHECK-NEXT:    jne .LBB1_248; CHECK-NEXT:    #NO_APP49; CHECK-NEXT:    jmp .LBB1_450; CHECK-NEXT:  .LBB1_2: # Inline asm indirect target51; CHECK-NEXT:    # %if.then.label_true_crit_edge52; CHECK-NEXT:    # Label of block must be emitted53; CHECK-NEXT:    jmp .LBB1_954; CHECK-NEXT:  .LBB1_3: # %if.else55; CHECK-NEXT:    #APP56; CHECK-NEXT:    testl %esi, %edi57; CHECK-NEXT:    testl %esi, %edi58; CHECK-NEXT:    jne .LBB1_759; CHECK-NEXT:    #NO_APP60; CHECK-NEXT:  .LBB1_4:61; CHECK-NEXT:    movl %esi, %eax62; CHECK-NEXT:    addl %edi, %eax63; CHECK-NEXT:  .LBB1_5: # %return64; CHECK-NEXT:    popl %esi65; CHECK-NEXT:    popl %edi66; CHECK-NEXT:    retl67; CHECK-NEXT:  .LBB1_6: # Inline asm indirect target68; CHECK-NEXT:    # %if.then.return_crit_edge69; CHECK-NEXT:    # Label of block must be emitted70; CHECK-NEXT:  .LBB1_7: # Inline asm indirect target71; CHECK-NEXT:    # %if.else.return_crit_edge72; CHECK-NEXT:    # Label of block must be emitted73; CHECK-NEXT:    movl $-1, %eax74; CHECK-NEXT:    jmp .LBB1_575; CHECK-NEXT:  .LBB1_8: # Inline asm indirect target76; CHECK-NEXT:    # %if.else.label_true_crit_edge77; CHECK-NEXT:    # Label of block must be emitted78; CHECK-NEXT:  .LBB1_9: # %label_true79; CHECK-NEXT:    movl $-2, %eax80; CHECK-NEXT:    jmp .LBB1_581entry:82  %cmp = icmp slt i32 %out1, %out283  br i1 %cmp, label %if.then, label %if.else84 85if.then:                                          ; preds = %entry86  %0 = callbr { i32, i32 } asm sideeffect "testl $0, $0; testl $1, $2; jne ${3:l}", "={si},={di},r,!i,!i,0,1"(i32 %out1, i32 %out1, i32 %out2)87          to label %if.end [label %label_true, label %return]88 89if.else:                                          ; preds = %entry90  %1 = callbr { i32, i32 } asm sideeffect "testl $0, $1; testl $2, $3; jne ${5:l}", "={si},={di},r,r,!i,!i,0,1"(i32 %out1, i32 %out2, i32 %out1, i32 %out2)91          to label %if.end [label %label_true, label %return]92 93if.end:                                           ; preds = %if.else, %if.then94  %.sink11 = phi { i32, i32 } [ %0, %if.then ], [ %1, %if.else ]95  %asmresult3 = extractvalue { i32, i32 } %.sink11, 096  %asmresult4 = extractvalue { i32, i32 } %.sink11, 197  %add = add nsw i32 %asmresult4, %asmresult398  br label %return99 100label_true:                                       ; preds = %if.else, %if.then101  br label %return102 103return:                                           ; preds = %if.then, %if.else, %label_true, %if.end104  %retval.0 = phi i32 [ %add, %if.end ], [ -2, %label_true ], [ -1, %if.else ], [ -1, %if.then ]105  ret i32 %retval.0106}107 108define i32 @test3(i1 %cmp) nounwind {109; CHECK-LABEL: test3:110; CHECK:       # %bb.0: # %entry111; CHECK-NEXT:    pushl %edi112; CHECK-NEXT:    pushl %esi113; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)114; CHECK-NEXT:    je .LBB2_3115; CHECK-NEXT:  # %bb.1: # %true116; CHECK-NEXT:    #APP117; CHECK-NEXT:    .short %esi118; CHECK-NEXT:    .short %edi119; CHECK-NEXT:    #NO_APP120; CHECK-NEXT:  # %bb.2:121; CHECK-NEXT:    movl %edi, %eax122; CHECK-NEXT:    jmp .LBB2_4123; CHECK-NEXT:  .LBB2_3: # %false124; CHECK-NEXT:    #APP125; CHECK-NEXT:    .short %eax126; CHECK-NEXT:    .short %edx127; CHECK-NEXT:    #NO_APP128; CHECK-NEXT:    movl %edx, %eax129; CHECK-NEXT:  .LBB2_4: # %asm.fallthrough130; CHECK-NEXT:    popl %esi131; CHECK-NEXT:    popl %edi132; CHECK-NEXT:    retl133; CHECK-NEXT:  .LBB2_5: # Inline asm indirect target134; CHECK-NEXT:    # %true.indirect_crit_edge135; CHECK-NEXT:    # Label of block must be emitted136; CHECK-NEXT:  .LBB2_6: # Inline asm indirect target137; CHECK-NEXT:    # %false.indirect_crit_edge138; CHECK-NEXT:    # Label of block must be emitted139; CHECK-NEXT:    movl $42, %eax140; CHECK-NEXT:    jmp .LBB2_4141entry:142  br i1 %cmp, label %true, label %false143 144true:145  %0 = callbr { i32, i32 } asm sideeffect ".word $0, $1", "={si},={di},!i" () to label %asm.fallthrough [label %indirect]146 147false:148  %1 = callbr { i32, i32 } asm sideeffect ".word $0, $1", "={ax},={dx},!i" () to label %asm.fallthrough [label %indirect]149 150asm.fallthrough:151  %vals = phi { i32, i32 } [ %0, %true ], [ %1, %false ]152  %v = extractvalue { i32, i32 } %vals, 1153  ret i32 %v154 155indirect:156  ret i32 42157}158 159; Test 4 - asm-goto with output constraints.160define i32 @test4(i32 %out1, i32 %out2) {161; CHECK-LABEL: test4:162; CHECK:       # %bb.0: # %entry163; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax164; CHECK-NEXT:    #APP165; CHECK-NEXT:    testl %eax, %eax166; CHECK-NEXT:    testl %ecx, %eax167; CHECK-NEXT:    jne .LBB3_5168; CHECK-NEXT:    #NO_APP169; CHECK-NEXT:  # %bb.1: # %asm.fallthrough170; CHECK-NEXT:    #APP171; CHECK-NEXT:    testl %eax, %ecx172; CHECK-NEXT:    testl %eax, %ecx173; CHECK-NEXT:    jne .LBB3_4174; CHECK-NEXT:    #NO_APP175; CHECK-NEXT:  # %bb.2: # %asm.fallthrough2176; CHECK-NEXT:    addl %ecx, %eax177; CHECK-NEXT:    retl178; CHECK-NEXT:  .LBB3_3: # Inline asm indirect target179; CHECK-NEXT:    # %entry.return_crit_edge180; CHECK-NEXT:    # Label of block must be emitted181; CHECK-NEXT:  .LBB3_4: # Inline asm indirect target182; CHECK-NEXT:    # %asm.fallthrough.return_crit_edge183; CHECK-NEXT:    # Label of block must be emitted184; CHECK-NEXT:    movl $-1, %eax185; CHECK-NEXT:    retl186; CHECK-NEXT:  .LBB3_5: # Inline asm indirect target187; CHECK-NEXT:    # %entry.label_true_crit_edge188; CHECK-NEXT:    # Label of block must be emitted189; CHECK-NEXT:  .LBB3_6: # Inline asm indirect target190; CHECK-NEXT:    # %asm.fallthrough.label_true_crit_edge191; CHECK-NEXT:    # Label of block must be emitted192; CHECK-NEXT:    movl $-2, %eax193; CHECK-NEXT:    retl194entry:195  %0 = callbr { i32, i32 } asm sideeffect "testl $0, $0; testl $1, $2; jne ${3:l}", "=r,=r,r,!i,!i"(i32 %out1)196          to label %asm.fallthrough [label %label_true, label %return]197 198asm.fallthrough:                                  ; preds = %entry199  %asmresult = extractvalue { i32, i32 } %0, 0200  %asmresult1 = extractvalue { i32, i32 } %0, 1201  %1 = callbr { i32, i32 } asm sideeffect "testl $0, $1; testl $2, $3; jne ${5:l}", "=r,=r,r,r,!i,!i"(i32 %asmresult, i32 %asmresult1)202          to label %asm.fallthrough2 [label %label_true, label %return]203 204asm.fallthrough2:                                 ; preds = %asm.fallthrough205  %asmresult3 = extractvalue { i32, i32 } %1, 0206  %asmresult4 = extractvalue { i32, i32 } %1, 1207  %add = add nsw i32 %asmresult3, %asmresult4208  br label %return209 210label_true:                                       ; preds = %asm.fallthrough, %entry211  br label %return212 213return:                                           ; preds = %entry, %asm.fallthrough, %label_true, %asm.fallthrough2214  %retval.0 = phi i32 [ %add, %asm.fallthrough2 ], [ -2, %label_true ], [ -1, %asm.fallthrough ], [ -1, %entry ]215  ret i32 %retval.0216}217 218; Test5 - test that we don't rely on a positional constraint. ie. +r in219; GCCAsmStmt being turned into "={esp},0" since after D87279 they're turned220; into "={esp},{esp}". This previously caused an ICE; this test is more so221; about avoiding another ICE than what the actual output is.222define dso_local void @test5() {223; CHECK-LABEL: test5:224; CHECK:       # %bb.0:225; CHECK-NEXT:    #APP226; CHECK-NEXT:    #NO_APP227; CHECK-NEXT:  # %bb.1:228; CHECK-NEXT:    retl229; CHECK-NEXT:  .LBB4_2: # Inline asm indirect target230; CHECK-NEXT:    # %._crit_edge231; CHECK-NEXT:    # Label of block must be emitted232; CHECK-NEXT:    retl233  %1 = call i32 @llvm.read_register.i32(metadata !3)234  %2 = callbr i32 asm "", "={esp},!i,{esp}"(i32 %1)235          to label %3 [label %4]236 2373:238  call void @llvm.write_register.i32(metadata !3, i32 %2)239  br label %4240 2414:242  ret void243}244 245declare i32 @llvm.read_register.i32(metadata)246declare void @llvm.write_register.i32(metadata, i32)247!3 = !{!"esp"}248