| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- ; RUN: opt < %s -S -speculative-execution \
- ; RUN: -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \
- ; RUN: | FileCheck %s
- target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
- ; Hoist in if-then pattern.
- define void @ifThen() {
- ; CHECK-LABEL: @ifThen(
- ; CHECK: %x = add i32 2, 3
- ; CHECK: br i1 true
- br i1 true, label %a, label %b
- ; CHECK: a:
- a:
- %x = add i32 2, 3
- ; CHECK: br label
- br label %b
- ; CHECK: b:
- b:
- ; CHECK: ret void
- ret void
- }
- ; Hoist in if-else pattern.
- define void @ifElse() {
- ; CHECK-LABEL: @ifElse(
- ; CHECK: %x = add i32 2, 3
- ; CHECK: br i1 true
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- %x = add i32 2, 3
- ; CHECK: br label
- br label %b
- ; CHECK: b:
- b:
- ; CHECK: ret void
- ret void
- }
- ; Hoist in if-then-else pattern if it is equivalent to if-then.
- define void @ifElseThenAsIfThen() {
- ; CHECK-LABEL: @ifElseThenAsIfThen(
- ; CHECK: %x = add i32 2, 3
- ; CHECK: br
- br i1 true, label %a, label %b
- ; CHECK: a:
- a:
- %x = add i32 2, 3
- ; CHECK: br label
- br label %c
- ; CHECK: b:
- b:
- br label %c
- ; CHECK: c
- c:
- ret void
- }
- ; Hoist in if-then-else pattern if it is equivalent to if-else.
- define void @ifElseThenAsIfElse() {
- ; CHECK-LABEL: @ifElseThenAsIfElse(
- ; CHECK: %x = add i32 2, 3
- ; CHECK: br
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- %x = add i32 2, 3
- ; CHECK: br label
- br label %c
- ; CHECK: b:
- b:
- br label %c
- ; CHECK: c
- c:
- ret void
- }
- ; Do not hoist if-then-else pattern if it is not equivalent to if-then
- ; or if-else.
- define void @ifElseThen() {
- ; CHECK-LABEL: @ifElseThen(
- ; CHECK: br
- br i1 true, label %a, label %b
- ; CHECK: a:
- a:
- ; CHECK: %x = add
- %x = add i32 2, 3
- ; CHECK: br label
- br label %c
- ; CHECK: b:
- b:
- ; CHECK: %y = add
- %y = add i32 2, 3
- br label %c
- ; CHECK: c
- c:
- ret void
- }
- ; Do not hoist loads and do not hoist an instruction past a definition of
- ; an operand.
- define void @doNotHoistPastDef() {
- ; CHECK-LABEL: @doNotHoistPastDef(
- br i1 true, label %b, label %a
- ; CHECK-NOT: load
- ; CHECK-NOT: add
- ; CHECK: a:
- a:
- ; CHECK: %def = load
- %def = load i32, i32* null
- ; CHECK: %use = add
- %use = add i32 %def, 0
- br label %b
- ; CHECK: b:
- b:
- ret void
- }
- ; Case with nothing to speculate.
- define void @nothingToSpeculate() {
- ; CHECK-LABEL: @nothingToSpeculate(
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- ; CHECK: %def = load
- %def = load i32, i32* null
- br label %b
- ; CHECK: b:
- b:
- ret void
- }
- ; Still hoist if an operand is defined before the block or is itself hoisted.
- define void @hoistIfNotPastDef() {
- ; CHECK-LABEL: @hoistIfNotPastDef(
- ; CHECK: %x = load
- %x = load i32, i32* null
- ; CHECK: %y = add i32 %x, 1
- ; CHECK: %z = add i32 %y, 1
- ; CHECK: br
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- %y = add i32 %x, 1
- %z = add i32 %y, 1
- br label %b
- ; CHECK: b:
- b:
- ret void
- }
- ; Do not hoist if the speculation cost is too high.
- define void @costTooHigh() {
- ; CHECK-LABEL: @costTooHigh(
- ; CHECK: br
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- ; CHECK: %r1 = add
- %r1 = add i32 1, 1
- ; CHECK: %r2 = add
- %r2 = add i32 1, 1
- ; CHECK: %r3 = add
- %r3 = add i32 1, 1
- ; CHECK: %r4 = add
- %r4 = add i32 1, 1
- ; CHECK: %r5 = add
- %r5 = add i32 1, 1
- br label %b
- ; CHECK: b:
- b:
- ret void
- }
- ; Do not hoist if too many instructions are left behind.
- define void @tooMuchLeftBehind() {
- ; CHECK-LABEL: @tooMuchLeftBehind(
- ; CHECK: br
- br i1 true, label %b, label %a
- ; CHECK: a:
- a:
- ; CHECK: %x = load
- %x = load i32, i32* null
- ; CHECK: %r1 = add
- %r1 = add i32 %x, 1
- ; CHECK: %r2 = add
- %r2 = add i32 %x, 1
- ; CHECK: %r3 = add
- %r3 = add i32 %x, 1
- br label %b
- ; CHECK: b:
- b:
- ret void
- }
|