Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86-64 -print-before=stack-coloring -print-after=stack-coloring >%t 2>&1 && FileCheck <%t %s
      2 
      3 define void @foo(i64* %retval.i, i32 %call, i32* %.ph.i80, i32 %fourteen, i32* %out.lo, i32* %out.hi) nounwind align 2 {
      4 entry:
      5   %_Tmp.i39 = alloca i64, align 8
      6   %retval.i33 = alloca i64, align 8
      7   %_Tmp.i = alloca i64, align 8
      8   %retval.i.i = alloca i64, align 8
      9   %_First.i = alloca i64, align 8
     10 
     11   %0 = load i64* %retval.i, align 8
     12 
     13   %1 = load i64* %retval.i, align 8
     14 
     15   %_Tmp.i39.0.cast73 = bitcast i64* %_Tmp.i39 to i8*
     16   call void @llvm.lifetime.start(i64 8, i8* %_Tmp.i39.0.cast73)
     17   store i64 %1, i64* %_Tmp.i39, align 8
     18   %cmp.i.i.i40 = icmp slt i32 %call, 0
     19   %2 = lshr i64 %1, 32
     20   %3 = trunc i64 %2 to i32
     21   %sub.i.i.i44 = sub i32 0, %call
     22   %cmp2.i.i.i45 = icmp ult i32 %3, %sub.i.i.i44
     23   %or.cond.i.i.i46 = and i1 %cmp.i.i.i40, %cmp2.i.i.i45
     24   %add.i.i.i47 = add i32 %3, %call
     25   %sub5.i.i.i48 = lshr i32 %add.i.i.i47, 5
     26   %trunc.i50 = trunc i64 %1 to i32
     27   %inttoptr.i51 = inttoptr i32 %trunc.i50 to i32*
     28   %add61617.i.i.i52 = or i32 %sub5.i.i.i48, -134217728
     29   %add61617.i.sub5.i.i.i53 = select i1 %or.cond.i.i.i46, i32 %add61617.i.i.i52, i32 %sub5.i.i.i48
     30   %storemerge2.i.i54 = getelementptr inbounds i32* %inttoptr.i51, i32 %add61617.i.sub5.i.i.i53
     31   %_Tmp.i39.0.cast74 = bitcast i64* %_Tmp.i39 to i32**
     32   store i32* %storemerge2.i.i54, i32** %_Tmp.i39.0.cast74, align 8
     33   %storemerge.i.i55 = and i32 %add.i.i.i47, 31
     34   %_Tmp.i39.4.raw_idx = getelementptr inbounds i8* %_Tmp.i39.0.cast73, i32 4
     35   %_Tmp.i39.4.cast = bitcast i8* %_Tmp.i39.4.raw_idx to i32*
     36   store i32 %storemerge.i.i55, i32* %_Tmp.i39.4.cast, align 4
     37   %srcval.i56 = load i64* %_Tmp.i39, align 8
     38   call void @llvm.lifetime.end(i64 8, i8* %_Tmp.i39.0.cast73)
     39 
     40 ; CHECK: Before Merge disjoint stack slots
     41 ; CHECK: [[PREFIX15:MOV64mr.*<fi#]]{{[0-9]}}[[SUFFIX15:.*;]] mem:ST8[%fifteen]
     42 ; CHECK: [[PREFIX87:MOV32mr.*;]] mem:ST4[%sunkaddr87]
     43 
     44 ; CHECK: After Merge disjoint stack slots
     45 ; CHECK: [[PREFIX15]]{{[0-9]}}[[SUFFIX15]] mem:ST8[%_Tmp.i39]
     46 ; CHECK: [[PREFIX87]] mem:ST4[<unknown>]
     47 
     48   %fifteen = bitcast i64* %retval.i.i to i32**
     49   %sixteen = bitcast i64* %retval.i.i to i8*
     50   call void @llvm.lifetime.start(i64 8, i8* %sixteen)
     51   store i32* %.ph.i80, i32** %fifteen, align 8, !tbaa !0
     52   %sunkaddr = ptrtoint i64* %retval.i.i to i32
     53   %sunkaddr86 = add i32 %sunkaddr, 4
     54   %sunkaddr87 = inttoptr i32 %sunkaddr86 to i32*
     55   store i32 %fourteen, i32* %sunkaddr87, align 4, !tbaa !3
     56   %seventeen = load i64* %retval.i.i, align 8
     57   call void @llvm.lifetime.end(i64 8, i8* %sixteen)
     58   %eighteen = lshr i64 %seventeen, 32
     59   %nineteen = trunc i64 %eighteen to i32
     60   %shl.i.i.i = shl i32 1, %nineteen
     61 
     62   store i32 %shl.i.i.i, i32* %out.lo, align 8
     63   store i32 %nineteen, i32* %out.hi, align 8
     64 
     65   ret void
     66 }
     67 
     68 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
     69 
     70 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
     71 
     72 !0 = metadata !{metadata !"int", metadata !1}
     73 !1 = metadata !{metadata !"omnipotent char", metadata !2}
     74 !2 = metadata !{metadata !"Simple C/C++ TBAA"}
     75 !3 = metadata !{metadata !"any pointer", metadata !1}
     76 !4 = metadata !{metadata !"vtable pointer", metadata !2}
     77