Home | History | Annotate | Download | only in X86
      1 ; RUN: llc -verify-machineinstrs < %s
      2 ; <rdar://problem/10270968>
      3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      4 target triple = "x86_64-apple-macosx10.7.2"
      5 
      6 %struct.optab = type { i32, [59 x %struct.anon.3] }
      7 %struct.anon.3 = type { i32, %struct.rtx_def* }
      8 %struct.rtx_def = type { [2 x i8], i8, i8, [1 x %union.rtunion_def] }
      9 %union.rtunion_def = type { i64 }
     10 %struct.insn_data = type { i8*, i8*, %struct.rtx_def* (%struct.rtx_def*, ...)*, %struct.insn_operand_data*, i8, i8, i8, i8 }
     11 %struct.insn_operand_data = type { i32 (%struct.rtx_def*, i32)*, i8*, [2 x i8], i8, i8 }
     12 
     13 @optab_table = external global [49 x %struct.optab*], align 16
     14 @insn_data = external constant [0 x %struct.insn_data]
     15 
     16 define %struct.rtx_def* @gen_add3_insn(%struct.rtx_def* %r0, %struct.rtx_def* %r1, %struct.rtx_def* %c) nounwind uwtable ssp {
     17 entry:
     18   %0 = bitcast %struct.rtx_def* %r0 to i32*
     19   %1 = load i32* %0, align 8
     20   %2 = lshr i32 %1, 16
     21   %bf.clear = and i32 %2, 255
     22   %idxprom = sext i32 %bf.clear to i64
     23   %3 = load %struct.optab** getelementptr inbounds ([49 x %struct.optab*]* @optab_table, i32 0, i64 0), align 8, !tbaa !0
     24   %handlers = getelementptr inbounds %struct.optab* %3, i32 0, i32 1
     25   %arrayidx = getelementptr inbounds [59 x %struct.anon.3]* %handlers, i32 0, i64 %idxprom
     26   %insn_code = getelementptr inbounds %struct.anon.3* %arrayidx, i32 0, i32 0
     27   %4 = load i32* %insn_code, align 4, !tbaa !3
     28   %cmp = icmp eq i32 %4, 1317
     29   br i1 %cmp, label %if.then, label %lor.lhs.false
     30 
     31 lor.lhs.false:                                    ; preds = %entry
     32   %idxprom1 = sext i32 %4 to i64
     33   %arrayidx2 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom1
     34   %operand = getelementptr inbounds %struct.insn_data* %arrayidx2, i32 0, i32 3
     35   %5 = load %struct.insn_operand_data** %operand, align 8, !tbaa !0
     36   %arrayidx3 = getelementptr inbounds %struct.insn_operand_data* %5, i64 0
     37   %predicate = getelementptr inbounds %struct.insn_operand_data* %arrayidx3, i32 0, i32 0
     38   %6 = load i32 (%struct.rtx_def*, i32)** %predicate, align 8, !tbaa !0
     39   %idxprom4 = sext i32 %4 to i64
     40   %arrayidx5 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom4
     41   %operand6 = getelementptr inbounds %struct.insn_data* %arrayidx5, i32 0, i32 3
     42   %7 = load %struct.insn_operand_data** %operand6, align 8, !tbaa !0
     43   %arrayidx7 = getelementptr inbounds %struct.insn_operand_data* %7, i64 0
     44   %8 = bitcast %struct.insn_operand_data* %arrayidx7 to i8*
     45   %bf.field.offs = getelementptr i8* %8, i32 16
     46   %9 = bitcast i8* %bf.field.offs to i32*
     47   %10 = load i32* %9, align 8
     48   %bf.clear8 = and i32 %10, 65535
     49   %call = tail call i32 %6(%struct.rtx_def* %r0, i32 %bf.clear8)
     50   %tobool = icmp ne i32 %call, 0
     51   br i1 %tobool, label %lor.lhs.false9, label %if.then
     52 
     53 lor.lhs.false9:                                   ; preds = %lor.lhs.false
     54   %idxprom10 = sext i32 %4 to i64
     55   %arrayidx11 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom10
     56   %operand12 = getelementptr inbounds %struct.insn_data* %arrayidx11, i32 0, i32 3
     57   %11 = load %struct.insn_operand_data** %operand12, align 8, !tbaa !0
     58   %arrayidx13 = getelementptr inbounds %struct.insn_operand_data* %11, i64 1
     59   %predicate14 = getelementptr inbounds %struct.insn_operand_data* %arrayidx13, i32 0, i32 0
     60   %12 = load i32 (%struct.rtx_def*, i32)** %predicate14, align 8, !tbaa !0
     61   %idxprom15 = sext i32 %4 to i64
     62   %arrayidx16 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom15
     63   %operand17 = getelementptr inbounds %struct.insn_data* %arrayidx16, i32 0, i32 3
     64   %13 = load %struct.insn_operand_data** %operand17, align 8, !tbaa !0
     65   %arrayidx18 = getelementptr inbounds %struct.insn_operand_data* %13, i64 1
     66   %14 = bitcast %struct.insn_operand_data* %arrayidx18 to i8*
     67   %bf.field.offs19 = getelementptr i8* %14, i32 16
     68   %15 = bitcast i8* %bf.field.offs19 to i32*
     69   %16 = load i32* %15, align 8
     70   %bf.clear20 = and i32 %16, 65535
     71   %call21 = tail call i32 %12(%struct.rtx_def* %r1, i32 %bf.clear20)
     72   %tobool22 = icmp ne i32 %call21, 0
     73   br i1 %tobool22, label %lor.lhs.false23, label %if.then
     74 
     75 lor.lhs.false23:                                  ; preds = %lor.lhs.false9
     76   %idxprom24 = sext i32 %4 to i64
     77   %arrayidx25 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom24
     78   %operand26 = getelementptr inbounds %struct.insn_data* %arrayidx25, i32 0, i32 3
     79   %17 = load %struct.insn_operand_data** %operand26, align 8, !tbaa !0
     80   %arrayidx27 = getelementptr inbounds %struct.insn_operand_data* %17, i64 2
     81   %predicate28 = getelementptr inbounds %struct.insn_operand_data* %arrayidx27, i32 0, i32 0
     82   %18 = load i32 (%struct.rtx_def*, i32)** %predicate28, align 8, !tbaa !0
     83   %idxprom29 = sext i32 %4 to i64
     84   %arrayidx30 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom29
     85   %operand31 = getelementptr inbounds %struct.insn_data* %arrayidx30, i32 0, i32 3
     86   %19 = load %struct.insn_operand_data** %operand31, align 8, !tbaa !0
     87   %arrayidx32 = getelementptr inbounds %struct.insn_operand_data* %19, i64 2
     88   %20 = bitcast %struct.insn_operand_data* %arrayidx32 to i8*
     89   %bf.field.offs33 = getelementptr i8* %20, i32 16
     90   %21 = bitcast i8* %bf.field.offs33 to i32*
     91   %22 = load i32* %21, align 8
     92   %bf.clear34 = and i32 %22, 65535
     93   %call35 = tail call i32 %18(%struct.rtx_def* %c, i32 %bf.clear34)
     94   %tobool36 = icmp ne i32 %call35, 0
     95   br i1 %tobool36, label %if.end, label %if.then
     96 
     97 if.then:                                          ; preds = %lor.lhs.false23, %lor.lhs.false9, %lor.lhs.false, %entry
     98   br label %return
     99 
    100 if.end:                                           ; preds = %lor.lhs.false23
    101   %idxprom37 = sext i32 %4 to i64
    102   %arrayidx38 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom37
    103   %genfun = getelementptr inbounds %struct.insn_data* %arrayidx38, i32 0, i32 2
    104   %23 = load %struct.rtx_def* (%struct.rtx_def*, ...)** %genfun, align 8, !tbaa !0
    105   %call39 = tail call %struct.rtx_def* (%struct.rtx_def*, ...)* %23(%struct.rtx_def* %r0, %struct.rtx_def* %r1, %struct.rtx_def* %c)
    106   br label %return
    107 
    108 return:                                           ; preds = %if.end, %if.then
    109   %24 = phi %struct.rtx_def* [ %call39, %if.end ], [ null, %if.then ]
    110   ret %struct.rtx_def* %24
    111 }
    112 
    113 !0 = metadata !{metadata !"any pointer", metadata !1}
    114 !1 = metadata !{metadata !"omnipotent char", metadata !2}
    115 !2 = metadata !{metadata !"Simple C/C++ TBAA", null}
    116 !3 = metadata !{metadata !"_ZTS9insn_code", metadata !1}
    117