brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 01e6029 Raw
204 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=gvn-hoist < %s | FileCheck %s3 4; Check that the call and fcmp are hoisted.5define void @fun(float %__b, i1 %arg) minsize {6; CHECK-LABEL: @fun(7; CHECK-NEXT:  entry:8; CHECK-NEXT:    br label [[IF_THEN:%.*]]9; CHECK:       if.then:10; CHECK-NEXT:    [[TMP0:%.*]] = call float @llvm.fabs.f32(float [[__B:%.*]])11; CHECK-NEXT:    [[CMPINF7:%.*]] = fcmp oeq float [[TMP0]], 0x7FF000000000000012; CHECK-NEXT:    br i1 %arg, label [[IF_THEN8:%.*]], label [[LOR_LHS_FALSE:%.*]]13; CHECK:       lor.lhs.false:14; CHECK-NEXT:    unreachable15; CHECK:       if.then8:16; CHECK-NEXT:    ret void17;18entry:19  br label %if.then20 21if.then:                                          ; preds = %entry22  br i1 %arg, label %if.then8, label %lor.lhs.false23 24lor.lhs.false:                                    ; preds = %if.then25  %0 = call float @llvm.fabs.f32(float %__b) #226  %cmpinf7 = fcmp oeq float %0, 0x7FF000000000000027  unreachable28 29if.then8:                                         ; preds = %if.then30  %1 = call float @llvm.fabs.f32(float %__b) #231  %cmpinf10 = fcmp oeq float %1, 0x7FF000000000000032  ret void33}34 35declare float @llvm.fabs.f32(float)36 37; Check that extractvalues are not hoisted into entry, but that non-dependent38; adds are.39define i32 @foo(i32 %x) {40; CHECK-LABEL: @foo(41; CHECK-NEXT:  entry:42; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[X:%.*]], 143; CHECK-NEXT:    [[TMP0:%.*]] = callbr { i32, i32 } asm sideeffect "somestuff", "=r,=r,!i"()44; CHECK-NEXT:    to label [[ASM_FALLTHROUGH:%.*]] [label %err.split]45; CHECK:       asm.fallthrough:46; CHECK-NEXT:    [[ASMRESULT:%.*]] = extractvalue { i32, i32 } [[TMP0]], 047; CHECK-NEXT:    ret i32 [[ADD]]48; CHECK:       err.split:49; CHECK-NEXT:    [[ASMRESULT2:%.*]] = extractvalue { i32, i32 } [[TMP0]], 050; CHECK-NEXT:    ret i32 [[ADD]]51;52entry:53  %0 = callbr { i32, i32 } asm sideeffect "somestuff", "=r,=r,!i"()54  to label %asm.fallthrough [label %err.split]55 56asm.fallthrough:                                  ; preds = %entry57  %asmresult = extractvalue { i32, i32 } %0, 058  %add = add nsw i32 %x, 159  ret i32 %add60 61err.split:                                        ; preds = %entry62  %asmresult2 = extractvalue { i32, i32 } %0, 063  %add2 = add nsw i32 %x, 164  ret i32 %add265}66 67; Check that extractvalues and dependent adds are not hoisted into entry.68define i32 @foo2() {69; CHECK-LABEL: @foo2(70; CHECK-NEXT:  entry:71; CHECK-NEXT:    [[TMP0:%.*]] = callbr { i32, i32 } asm sideeffect "somestuff", "=r,=r,!i"()72; CHECK-NEXT:    to label [[ASM_FALLTHROUGH:%.*]] [label %err.split]73; CHECK:       asm.fallthrough:74; CHECK-NEXT:    [[ASMRESULT:%.*]] = extractvalue { i32, i32 } [[TMP0]], 075; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[ASMRESULT]], 176; CHECK-NEXT:    ret i32 [[ADD]]77; CHECK:       err.split:78; CHECK-NEXT:    [[ASMRESULT2:%.*]] = extractvalue { i32, i32 } [[TMP0]], 079; CHECK-NEXT:    [[ADD2:%.*]] = add nsw i32 [[ASMRESULT2]], 180; CHECK-NEXT:    ret i32 [[ADD2]]81;82entry:83  %0 = callbr { i32, i32 } asm sideeffect "somestuff", "=r,=r,!i"()84  to label %asm.fallthrough [label %err.split]85 86asm.fallthrough:                                  ; preds = %entry87  %asmresult = extractvalue { i32, i32 } %0, 088  %add = add nsw i32 %asmresult, 189  ret i32 %add90 91err.split:                                        ; preds = %entry92  %asmresult2 = extractvalue { i32, i32 } %0, 093  %add2 = add nsw i32 %asmresult2, 194  ret i32 %add295}96 97; Ensure we don't hoist loads that are modified by callbr.98@x = global i32 099define i32 @foo3() {100; CHECK-LABEL: @foo3(101; CHECK-NEXT:  entry:102; CHECK-NEXT:    callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x)103; CHECK-NEXT:    to label [[ASM_FALLTHROUGH:%.*]] [label %err.split]104; CHECK:       asm.fallthrough:105; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @x, align 4106; CHECK-NEXT:    ret i32 [[TMP0]]107; CHECK:       err.split:108; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @x, align 4109; CHECK-NEXT:    ret i32 [[TMP1]]110;111entry:112  callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x)113  to label %asm.fallthrough [label %err.split]114 115asm.fallthrough:                                  ; preds = %entry116  %0 = load i32, ptr @x117  ret i32 %0118 119err.split:                                        ; preds = %entry120  %1 = load i32, ptr @x121  ret i32 %1122}123 124; Ensure we do hoist loads that aren't modified by callbr, if the callbr has125; the attribute memory(argmem:readwrite).126@y = global i32 0127define i32 @foo4() {128; CHECK-LABEL: @foo4(129; CHECK-NEXT:  entry:130; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @y, align 4131; CHECK-NEXT:    callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) #[[ATTR2:[0-9]+]]132; CHECK-NEXT:    to label [[A:%.*]] [label %b]133; CHECK:       a:134; CHECK-NEXT:    ret i32 [[TMP0]]135; CHECK:       b:136; CHECK-NEXT:    ret i32 [[TMP0]]137;138entry:139  callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) memory(argmem: readwrite)140  to label %a [label %b]141 142a:                                  ; preds = %entry143  %0 = load i32, ptr @y144  ret i32 %0145 146b:                                        ; preds = %entry147  %1 = load i32, ptr @y148  ret i32 %1149}150 151; Ensure we don't hoist loads that are modified by callbr, if the callbr has152; the attribute memory(argmem:readwrite).153define i32 @foo5() {154; CHECK-LABEL: @foo5(155; CHECK-NEXT:  entry:156; CHECK-NEXT:    callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) #[[ATTR2]]157; CHECK-NEXT:    to label [[A:%.*]] [label %b]158; CHECK:       a:159; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @x, align 4160; CHECK-NEXT:    ret i32 [[TMP0]]161; CHECK:       b:162; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @x, align 4163; CHECK-NEXT:    ret i32 [[TMP1]]164;165entry:166  callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) memory(argmem: readwrite)167  to label %a [label %b]168 169a:                                  ; preds = %entry170  %0 = load i32, ptr @x171  ret i32 %0172 173b:                                        ; preds = %entry174  %1 = load i32, ptr @x175  ret i32 %1176}177 178; Ensure we hoist loads that are modified by callbr, if the callbr has the179; attribute memory(argmem:none).180define i32 @foo6() {181; CHECK-LABEL: @foo6(182; CHECK-NEXT:  entry:183; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @x, align 4184; CHECK-NEXT:    callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) #[[ATTR3:[0-9]+]]185; CHECK-NEXT:    to label [[A:%.*]] [label %b]186; CHECK:       a:187; CHECK-NEXT:    ret i32 [[TMP0]]188; CHECK:       b:189; CHECK-NEXT:    ret i32 [[TMP0]]190;191entry:192  callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x) memory(argmem: none)193  to label %a [label %b]194 195a:                                  ; preds = %entry196  %0 = load i32, ptr @x197  ret i32 %0198 199b:                                        ; preds = %entry200  %1 = load i32, ptr @x201  ret i32 %1202}203 204