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
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
; RUN: llc -verify-regalloc -verify-machineinstrs < %s
; PR27275: When enabling remat for vreg defined by PHIs, make sure the update
; of the live range removes dead phi. Otherwise, we may end up with PHIs with
; incorrect operands and that will trigger assertions or verifier failures
; in later passes.

target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
target triple = "i386-unknown-linux-gnu"

@b = external global i64, align 8
@d = external global i32, align 4
@e = external global i64, align 8
@h = external global i16, align 2
@a = external global i8, align 1
@g = external global i64, align 8
@j = external global i32, align 4
@f = external global i16, align 2
@.str = external unnamed_addr constant [12 x i8], align 1

define void @fn1() {
entry:
  %tmp = load i64, i64* @b, align 8
  %or = or i64 0, 3299921317
  %and = and i64 %or, %tmp
  %tmp1 = load i32, i32* @d, align 4
  br i1 undef, label %lor.rhs, label %lor.end

lor.rhs:                                          ; preds = %entry
  %tobool3 = icmp ne i8 undef, 0
  br label %lor.end

lor.end:                                          ; preds = %lor.rhs, %entry
  %lor.ext = zext i1 undef to i32
  %tmp2 = load i64, i64* @e, align 8
  br i1 undef, label %lor.rhs5, label %lor.end7

lor.rhs5:                                         ; preds = %lor.end
  br label %lor.end7

lor.end7:                                         ; preds = %lor.rhs5, %lor.end
  %tmp3 = phi i1 [ true, %lor.end ], [ false, %lor.rhs5 ]
  %neg13 = xor i64 %tmp, -1
  %conv25 = zext i1 %tmp3 to i32
  %tobool46 = icmp eq i64 %tmp, 0
  %.pre = load i16, i16* @h, align 2
  %tobool10 = icmp eq i16 %.pre, 0
  %neg.us = xor i32 %tmp1, -1
  %conv12.us = sext i32 %neg.us to i64
  %tobool23.us = icmp eq i64 %tmp2, %and
  %conv39.us = sext i32 %tmp1 to i64
  br label %LABEL_mSmSDb

LABEL_mSmSDb.loopexit:                            ; preds = %lor.end32.us
  %conv42.us.lcssa = phi i32 [ %conv42.us, %lor.end32.us ]
  store i64 undef, i64* @g, align 8
  br label %LABEL_mSmSDb

LABEL_mSmSDb:                                     ; preds = %LABEL_mSmSDb.loopexit, %lor.end7
  %tmp4 = phi i32 [ undef, %lor.end7 ], [ %conv42.us.lcssa, %LABEL_mSmSDb.loopexit ]
  %tmp5 = phi i64 [ %tmp, %lor.end7 ], [ 0, %LABEL_mSmSDb.loopexit ]
  br i1 %tobool10, label %LABEL_BRBRN.preheader, label %if.then

if.then:                                          ; preds = %LABEL_mSmSDb
  store i8 undef, i8* @a, align 1
  br label %LABEL_BRBRN.preheader

LABEL_BRBRN.preheader:                            ; preds = %if.then, %LABEL_mSmSDb
  %.pre63 = load i64, i64* @g, align 8
  br i1 %tobool46, label %LABEL_BRBRN.us, label %LABEL_BRBRN.outer

LABEL_BRBRN.outer:                                ; preds = %if.then47, %LABEL_BRBRN.preheader
  %.ph = phi i32 [ 0, %if.then47 ], [ %tmp4, %LABEL_BRBRN.preheader ]
  %.ph64 = phi i32 [ %conv50, %if.then47 ], [ %tmp1, %LABEL_BRBRN.preheader ]
  %.ph65 = phi i64 [ %tmp16, %if.then47 ], [ %.pre63, %LABEL_BRBRN.preheader ]
  %.ph66 = phi i64 [ 0, %if.then47 ], [ %tmp2, %LABEL_BRBRN.preheader ]
  %.ph67 = phi i64 [ %.pre56.pre, %if.then47 ], [ %tmp5, %LABEL_BRBRN.preheader ]
  %neg = xor i32 %.ph64, -1
  %conv12 = sext i32 %neg to i64
  %tobool23 = icmp eq i64 %.ph66, %and
  %tmp6 = load i32, i32* @j, align 4
  %shr = lshr i32 %conv25, %tmp6
  %conv39 = sext i32 %.ph64 to i64
  br label %LABEL_BRBRN

LABEL_BRBRN.us:                                   ; preds = %lor.end32.us, %LABEL_BRBRN.preheader
  %tmp7 = phi i32 [ %conv42.us, %lor.end32.us ], [ %tmp4, %LABEL_BRBRN.preheader ]
  %tmp8 = phi i64 [ undef, %lor.end32.us ], [ %.pre63, %LABEL_BRBRN.preheader ]
  %tmp9 = phi i64 [ %tmp10, %lor.end32.us ], [ %tmp5, %LABEL_BRBRN.preheader ]
  %mul.us = mul i64 %tmp8, %neg13
  %mul14.us = mul i64 %mul.us, %conv12.us
  %cmp.us = icmp sgt i64 %tmp2, %mul14.us
  %conv16.us = zext i1 %cmp.us to i64
  %xor.us = xor i64 %conv16.us, %tmp9
  %rem18.us = urem i32 %lor.ext, %tmp7
  %conv19.us = zext i32 %rem18.us to i64
  br i1 %tobool23.us, label %lor.rhs24.us, label %lor.end32.us

lor.rhs24.us:                                     ; preds = %LABEL_BRBRN.us
  br label %lor.end32.us

lor.end32.us:                                     ; preds = %lor.rhs24.us, %LABEL_BRBRN.us
  %tmp10 = phi i64 [ -2, %LABEL_BRBRN.us ], [ -1, %lor.rhs24.us ]
  %xor.us.not = xor i64 %xor.us, -1
  %neg36.us = and i64 %conv19.us, %xor.us.not
  %conv37.us = zext i32 %tmp7 to i64
  %sub38.us = sub nsw i64 %neg36.us, %conv37.us
  %mul40.us = mul nsw i64 %sub38.us, %conv39.us
  %neg41.us = xor i64 %mul40.us, 4294967295
  %conv42.us = trunc i64 %neg41.us to i32
  %tobool43.us = icmp eq i8 undef, 0
  br i1 %tobool43.us, label %LABEL_mSmSDb.loopexit, label %LABEL_BRBRN.us

LABEL_BRBRN:                                      ; preds = %lor.end32, %LABEL_BRBRN.outer
  %tmp11 = phi i32 [ %conv42, %lor.end32 ], [ %.ph, %LABEL_BRBRN.outer ]
  %tmp12 = phi i64 [ %neg21, %lor.end32 ], [ %.ph65, %LABEL_BRBRN.outer ]
  %tmp13 = phi i64 [ %conv35, %lor.end32 ], [ %.ph67, %LABEL_BRBRN.outer ]
  %mul = mul i64 %tmp12, %neg13
  %mul14 = mul i64 %mul, %conv12
  %cmp = icmp sgt i64 %.ph66, %mul14
  %conv16 = zext i1 %cmp to i64
  %xor = xor i64 %conv16, %tmp13
  %rem18 = urem i32 %lor.ext, %tmp11
  %conv19 = zext i32 %rem18 to i64
  %neg21 = or i64 %xor, undef
  br i1 %tobool23, label %lor.rhs24, label %lor.end32

lor.rhs24:                                        ; preds = %LABEL_BRBRN
  %tmp14 = load volatile i16, i16* @f, align 2
  %conv26 = sext i16 %tmp14 to i32
  %and27 = and i32 %conv26, %shr
  %conv28 = sext i32 %and27 to i64
  %mul29 = mul nsw i64 %conv28, %tmp
  %and30 = and i64 %mul29, %tmp13
  %tobool31 = icmp ne i64 %and30, 0
  br label %lor.end32

lor.end32:                                        ; preds = %lor.rhs24, %LABEL_BRBRN
  %tmp15 = phi i1 [ true, %LABEL_BRBRN ], [ %tobool31, %lor.rhs24 ]
  %lor.ext33 = zext i1 %tmp15 to i32
  %neg34 = xor i32 %lor.ext33, -1
  %conv35 = sext i32 %neg34 to i64
  %xor.not = xor i64 %xor, -1
  %neg36 = and i64 %conv19, %xor.not
  %conv37 = zext i32 %tmp11 to i64
  %sub38 = sub nsw i64 %neg36, %conv37
  %mul40 = mul nsw i64 %sub38, %conv39
  %neg41 = xor i64 %mul40, 4294967295
  %conv42 = trunc i64 %neg41 to i32
  %tobool43 = icmp eq i8 undef, 0
  br i1 %tobool43, label %if.then47, label %LABEL_BRBRN

if.then47:                                        ; preds = %lor.end32
  tail call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i64 %conv39)
  %tmp16 = load i64, i64* @g, align 8
  %neg49 = xor i64 %tmp16, 4294967295
  %conv50 = trunc i64 %neg49 to i32
  %.pre56.pre = load i64, i64* @b, align 8
  br label %LABEL_BRBRN.outer
}

declare void @printf(i8* nocapture readonly, ...)