reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
# RUN: llc -x mir < %s | FileCheck %s
--- |
  target triple = "x86_64-unknown-linux-gnu"

  @x = external global i64
  @i = external thread_local global i32

  define i32 @or() {
  entry:
    ret i32 undef
  }

  define i32 @and() {
  entry:
    ret i32 undef
  }
...
---
# CHECK-LABEL: or:
name: or
alignment: 16
tracksRegLiveness: true
registers:
  - { id: 0, class: gr64 }
  - { id: 1, class: gr64 }
  - { id: 2, class: gr64 }
  - { id: 3, class: gr64 }
  - { id: 4, class: gr32 }
body: |
  bb.0.entry:
    %0:gr64 = MOV64rm $rip, 1, $noreg, @x, $noreg :: (load 8)
    %1:gr64 = OR64ri8 %0, 7, implicit-def dead $eflags
    %2:gr64 = MOV64rm $rip, 1, $noreg, target-flags(x86-gottpoff) @i, $noreg :: (load 8)
    %3:gr64 = OR64rr %2, %1, implicit-def dead $eflags
    %4:gr32 = MOV32rm killed %3, 1, $noreg, 0, $fs :: (load 4)
  ; CHECK-NOT:  orq {{.*}}GOTTPOFF{{.*}}
  ;
  ; What we actually expect:
  ; CHECK:      movq {{.*}}GOTTPOFF{{.*}}, %[[R:.*]]
  ; CHECK-NEXT: orq %{{.*}}, %[[R]]
  ; CHECK-NEXT: movl %fs:(%[[R]]),
  ;
  ; CHECK-NOT:  orq {{.*}}GOTTPOFF{{.*}}
    $eax = COPY %4
    RET 0, $eax

...
---
# CHECK-LABEL: and:
name: and
alignment: 16
tracksRegLiveness: true
registers:
  - { id: 0, class: gr64 }
  - { id: 1, class: gr64 }
  - { id: 2, class: gr64 }
  - { id: 3, class: gr64 }
  - { id: 4, class: gr32 }
body: |
  bb.0.entry:
    %0:gr64 = MOV64rm $rip, 1, $noreg, @x, $noreg :: (load 8)
    %1:gr64 = OR64ri8 %0, 7, implicit-def dead $eflags
    %2:gr64 = MOV64rm $rip, 1, $noreg, target-flags(x86-gottpoff) @i, $noreg :: (load 8)
    %3:gr64 = AND64rr %2, %1, implicit-def dead $eflags
    %4:gr32 = MOV32rm killed %3, 1, $noreg, 0, $fs :: (load 4)
  ; CHECK-NOT:  andq {{.*}}GOTTPOFF{{.*}}
  ;
  ; What we actually expect:
  ; CHECK:      movq {{.*}}GOTTPOFF{{.*}}, %[[R:.*]]
  ; CHECK-NEXT: andq %{{.*}}, %[[R]]
  ; CHECK-NEXT: movl %fs:(%[[R]]),
  ;
  ; CHECK-NOT:  andq {{.*}}GOTTPOFF{{.*}}
    $eax = COPY %4
    RET 0, $eax

...