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